漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-080633
漏洞标题:DocCms最新版insert注入又一枚
相关厂商:DocCms
漏洞作者: 路人甲
提交时间:2014-10-27 14:27
修复时间:2015-01-25 14:28
公开时间:2015-01-25 14:28
漏洞类型:SQL注射漏洞
危害等级:中
自评Rank:10
漏洞状态:未联系到厂商或者厂商积极忽略
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-10-27: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-01-25: 厂商已经主动忽略漏洞,细节向公众公开
简要描述:
DocCms最新版insert注入又一枚
详细说明:
首先大致说下这个SQL是如何产生的,由于受 WooYun: DocCms最新版sql注入漏洞 的启发(利用url编码绕过过滤进行了注入),前面已经发了一个通过编码绕过过滤的漏洞: WooYun: DocCms最新版SQL注入(insert注入技巧) ,今天再来一发 (与前面的漏洞发生在不同目录下的不同函数)。
Doccms中首先对输入进行了全局过滤,但是后面为了过滤XSS,又对经过全局过滤的用户输入进行了html解码,因此,可以通过编码绕过过滤进行注入。
Doccms在/loader/doc.php对输入的内容进行了全局的过滤,如下
跟进cleanArrayForMysql看一下,/inc/function.php
可以看到对用户的输入调用了mysql_real_escape_string()进行过滤,这个函数把sql的几个特殊字符过滤掉了,特别是’,但是这个函数并不过滤%,后面会用到这个特性。
在用户有输入的地方,doccms对用户的输入进行XSS过滤。比如本次注入的地方,在 联系我们-->招贤纳才-->应聘,这里可以提交很多内容,而且都存在同样的问题,会调用/content/order/jobs/index.php 文件中的send()函数
可以看到
调用了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 '
漏洞证明:
见 详细说明
修复方案:
过滤
版权声明:转载请注明来源 路人甲@乌云
漏洞回应
厂商回应:
未能联系到厂商或者厂商积极拒绝