漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-080651
漏洞标题:DocCms最新版又一处SQL注入
相关厂商:DocCms
漏洞作者: 路人甲
提交时间:2014-10-27 10:40
修复时间:2015-01-25 10:42
公开时间:2015-01-25 10:42
漏洞类型:SQL注射漏洞
危害等级:中
自评Rank:10
漏洞状态:未联系到厂商或者厂商积极忽略
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-10-27: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-01-25: 厂商已经主动忽略漏洞,细节向公众公开
简要描述:
DocCms最新版又一处SQL注入
详细说明:
又一处编码绕过过滤注入成功的例子,幸好DocCms比较简洁,没有多少用户可以输入的地方。
首先大致说下这个SQL是如何产生的,由于受 WooYun: DocCms最新版sql注入漏洞 的启发(利用url编码绕过过滤进行了注入),前面已经发了两个通过编码绕过过滤的漏洞: WooYun: DocCms最新版SQL注入(insert注入技巧) ; WooYun: DocCms最新版insert注入又一枚 。今天一发又一发啊,这次问题是在/content/guestbook/index.php中的creat()函数(与前面提交的漏洞是不同模块下的不同函数,注入点也不一样)。
Doccms中首先对输入进行了全局过滤,但是后面为了过滤XSS,又对经过全局过滤的用户输入进行了html解码,因此,可以通过编码绕过过滤进行注入。
Doccms在/loader/doc.php对输入的内容进行了全局的过滤,如下
跟进cleanArrayForMysql看一下,/inc/function.php
可以看到对用户的输入调用了mysql_real_escape_string()进行过滤,这个函数把sql的几个特殊字符过滤掉了,特别是’,但是这个函数并不过滤%,后面会用到这个特性。
在用户有输入的地方,doccms对用户的输入进行XSS过滤。比如本次注入的地方,在 联系我们-->招贤纳才-->应聘,这里可以提交很多内容,而且都存在同样的问题,会调用/content/guestbook/index.php 文件中的creat()函数
可以看到
调用了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进行注入。
由于“在线留言”版块存在多注入点,这里以“留言框”为例进行验证:
单引号可以这样引入
留言框处编码前的注入payload:
留言框处编码以后的payload为:
根据提交成功返回的时间即可判断doc_user中第一个用户的用户名是不是以a开头的,若是返回时间约为3s后,若不是则立即返回提交成功。假若第一个字符是a,测试第二个字符时,固定a不变,修改b的值,payload如下:' or (select case when (select username from (select * from doc_user) as a where id=1) like 'ad%' then sleep(3) else sleep(0) end) or '
漏洞证明:
见 详细说明
修复方案:
过滤
版权声明:转载请注明来源 路人甲@乌云
漏洞回应
厂商回应:
未能联系到厂商或者厂商积极拒绝