sqli-labs靶场实录: Advanced Injections
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 =