漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2015-0114011
漏洞标题:DocCms最新版SQL注入4枚打包
相关厂商:DocCms
漏洞作者: 路人甲
提交时间:2015-05-22 11:47
修复时间:2015-07-06 11:48
公开时间:2015-07-06 11:48
漏洞类型:SQL注射漏洞
危害等级:中
自评Rank:10
漏洞状态:未联系到厂商或者厂商积极忽略
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2015-05-22: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-07-06: 厂商已经主动忽略漏洞,细节向公众公开
简要描述:
DocCms最新版SQL注入4枚打包,用户量依然是这么大~~
详细说明:
用户量依然是这么大~~
首先大致说下这个SQL是如何产生的,看到 WooYun: DocCms最新版sql注入漏洞 ,它利用url编码绕过过滤进行了注入,就有了点点想法,会不会还有其他编码绕过过滤的问题?
先把注入点和注入参数拿出来吧,便于审核大大们查看是否有重复:注入点是前台用户注册的地方(会员中心----注册,doccms的各个模块后台都是可以打开或关闭的,本地测试时,如果没有打开,请后台自行打开),注入参数为:nickname、name、sex、qq
下面来研究一下如何绕过防注系统:
Doccms中首先对输入进行了全局过滤,但是后面为了过滤XSS,又对经过全局过滤的用户输入进行了html解码,因此,可以通过编码绕过过滤进行注入。
Doccms在/loader/doc.php对输入的内容进行了全局的过滤,如下
跟进cleanArrayForMysql看一下,/inc/function.php
可以看到对用户的输入调用了mysql_real_escape_string()进行过滤,这个函数把sql的几个特殊字符过滤掉了,特别是’,但是这个函数并不过滤%,后面会用到这个特性。
在用户有输入的地方,doccms对用户的输入进行XSS过滤。比如本次注入的地方,在 会员中心,注册新会员时,会调用/content/user/index.php 文件中的reg函数
可以看到
调用了RemoveXSS()函数,RemoveXSS()内容如下
为了更好的过滤XSS,RemoveXSS把用户输入进行了html解码,因而整个流程是这样的:用户输入内容--->mysql_real_escape_string()---->RemoveXSS()---->mysql_query(),也就是说用户输入内容首先被mysql_real_escape_string()过滤掉sql特殊字符,然后RemoveXSS()进行html解码,最后执行sql语句。
因此问题就来了,先把SQL特殊字符进行html编码,绕过mysql_real_escape_string(),然后由RemoveXSS()解码还原,然后就可以执行了,注入也就产生了。
这样产生的注入虽然可以引入’,但是由于RemoveXSS()无法使用逗号,这也给注入带来了点点麻烦。不过不用逗号一样可以构造注入语句。
注入不能使用逗号,且注入是在insert处,因此使用case when then 进行注入,可以有效的避开逗号问题。
因是在insert的values中构造注入语句,又不能使用逗号,暂时没想到如何使用case when then +bool-based 来注入。本次注入使用case when then +time-based blind进行注入。
以“nickname”为例进行验证:
Payload(html编码前):
编码以后的payload为:
Time-based blind 注入
根据提交成功返回的时间即可判断doc_user中第一个用户的用户名是不是以a开头的,若是返回时间约为5s。
可以使用burpsuite辅助测试或写个脚本进行时间盲注。最后测试的结果为管理员用户名为admin
漏洞证明:
见 详细说明
修复方案:
入库前过滤
版权声明:转载请注明来源 路人甲@乌云
漏洞回应
厂商回应:
未能联系到厂商或者厂商积极拒绝