漏洞概要 关注数(200) 关注此漏洞
缺陷编号: WooYun-2014-74970
漏洞标题: Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF)
相关厂商: Discuz!
漏洞作者: phith0n![Discuz x3.2前台GET型SQL注入漏洞(绕过全局WAF)]()
提交时间: 2014-09-04 10:15
公开时间: 2014-12-03 10:16
漏洞类型: SQL注射漏洞
危害等级: 中
自评Rank: 15
漏洞状态: 厂商已经确认
漏洞来源:www.wooyun.org ,如有疑问或需要帮助请联系
Tags标签: php源码审核 php源码分析 白盒测试
漏洞详情
披露状态:
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行:
见这一句:
将$_GET['type']数组直接用`+`分割,并没有过滤。
因为位置在$field的地方,并不在单引号中,所以不用引入单引号,也无需考虑addslashes。
现在遇到另一个问题,怎么绕过discuz3.2的WAF?
不绕过也没法出数据。
我们先看看输出点在何处:
也就是说我们可以控制的部分有很多。
且不看全局防注入源码,黑盒试一下我发现一旦出现'、(就会拦截,而且注释符(#、--)也会拦截。
括号不能有,就特别拙计,因为很多盲注需要括号,子查询也需要括号,函数也需要括号,这里都不能用了。
我们再看上述sql语句,发现我们可控的部分前面,还有个daytime。这就愁坏我了,因为我要查询的表是用户表,而用户表根本没这个字段。
执行会提示Unknown column 'daytime' in 'field list'。
所以,我们可以利用mysql的特性,一次查询两个表,将pre_ucenter_members的数据连带着查询出来:
大家可以看到,已经不报错了。因为pre_common_statuser表中存在`daytime`这个列。而且这个表中也有uid这个列,正好可以作为pre_ucenter_members的筛选项。
那么,有的同学再问,sql语句后半部分
没有注释符怎么处理?
这里有个巧合,在某些情况下,`能作为注释符用。因为mysql会自动给sql语句结尾没有闭合的`闭合掉,这样,只要让mysql人为后面那一大串字符是一个字段的“别名”即可。
所以,先构造一个url:
可以看到已经出数据了。但发现出来的数据只有4位。
原因是,在源码中使用了substr取了daytime的第4到8位:
我们看下有没其他的输出点。于是找到了一个:
这个if语句,其中$type为statistic,而将$value[$type]的值输出了。所以,我只需将password取个别名叫statistic,就能输出password了。
那么,最后的poc就是:
本地测试效果:
这个漏洞鸡肋之处在于,虽然它是一个前台的注入(无需登录后台),但是却需要管理员权限。
所以,利用方法就是找到一个前台xss,管理员(前台管理)访问以后用javascript获得访问到的页面内容,即可获得注入出的信息。使鸡肋漏洞变得不再鸡肋。
或者利用某些浏览器的跨域漏洞,也能注入。
漏洞证明:
修复方案:
过滤。
版权声明:转载请注明来源 phith0n@乌云
漏洞回应
厂商回应:
危害等级:中
漏洞Rank:10
确认时间:2014-09-04 10:29
厂商回复:
感谢您提出的问题,我们会尽快处理
最新状态:
暂无
漏洞评价:
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值
漏洞评价(共0人评价):
登陆后才能进行评分
评论