漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-080539
漏洞标题:DocCms最新版SQL注入(insert注入技巧)
相关厂商:DocCms
漏洞作者: 路人甲
提交时间:2014-10-24 12:18
修复时间:2015-01-22 12:20
公开时间:2015-01-22 12:20
漏洞类型:SQL注射漏洞
危害等级:中
自评Rank:10
漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-10-24: 细节已通知厂商并且等待厂商处理中
2014-10-29: 厂商已经确认,细节仅向厂商公开
2014-11-01: 细节向第三方安全合作伙伴开放
2014-12-23: 细节向核心白帽子及相关领域专家公开
2015-01-02: 细节向普通白帽子公开
2015-01-12: 细节向实习白帽子公开
2015-01-22: 细节向公众公开
简要描述:
DocCms最新版SQL注入(insert注入技巧)
详细说明:
首先大致说下这个SQL是如何产生的,看到 WooYun: DocCms最新版sql注入漏洞 ,它利用url编码绕过过滤进行了注入,就有了点点想法,会不会还有其他编码绕过过滤的问题?
开始
Doccms中首先对输入进行了全局过滤,但是后面为了过滤XSS,又对经过全局过滤的用户输入进行了html解码,因此,可以通过编码绕过过滤进行注入。
Doccms在/loader/doc.php对输入的内容进行了全局的过滤,如下
跟进cleanArrayForMysql看一下,/inc/function.php
可以看到对用户的输入调用了mysql_real_escape_string()进行过滤,这个函数把sql的几个特殊字符过滤掉了,特别是’,但是这个函数并不过滤%,后面会用到这个特性。
在用户有输入的地方,doccms对用户的输入进行XSS过滤。比如本次注入的地方,在 联系我们-->招商加盟,点提交时,会调用/content/order/index.php 文件中的create()函数
可以看到
调用了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 + “布尔注入” 来注入。本次注入使用case when then + “延迟盲注”进行注入。
以“公司名称:”这个注入点为例进行验证:
单引号可以这样引入
公司名处的注入payload(未编码):or (select case when (select username from (select * from doc_user) as a where id=1) like 'a%' then sleep(3) else sleep(0) end) or '
编码以后的payload为:' or (select case when (select username from (select * from doc_user) as a where id=1) like 'a%' then sleep(3) else sleep(0) end) or '
根据提交成功返回的时间即可判断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 '
证明:
漏洞证明:
见 详细说明
修复方案:
过滤
版权声明:转载请注明来源 路人甲@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:12
确认时间:2014-10-29 08:52
厂商回复:
CNVD确认分析和验证过程(未在本地实例或互联网上复现),由CNVD尝试通过公开联系渠道向软件生产厂商通报。
最新状态:
暂无