在BUUCTF上做了一道web题,涉及到了堆叠注入,所以就来记录一下。

    在SQL语句中,语句的结束都是以;结尾,但是如果我们在;后面再加上一条SQL语句,两条语句会一起执行吗?这也就是造成堆叠注入的原因了

    最简单的语句select * from users;DELETE FROM test

    先查询user表,然后再从test数据库里删除user表。

    下面我们进行实战

    靶场:sql-libs38

    先判断闭合点,为’
    SQL注入-堆叠注入 - 图1
    再构造payload:?id=1’ order by 4 %23
    SQL注入-堆叠注入 - 图2
    判断出列数为3列

    第38关可以理解为盲注,第二条语句的对错不会给我们回显

    好,我们先构造payload:?id=-1'; insert into users(id,username,password) values(88,'aaa','bbb')%23
    ``
    但是呢
    SQL注入-堆叠注入 - 图3
    页面没有回显,我们去数据库看一下
    SQL注入-堆叠注入 - 图4
    最后一行,username:aaa,password:bbb已经成功插入进数据库

    如果我们添加的是管理员的账号和密码,那又是什么样的结果。

    这一关不明显,我们去试试第42关

    sql-libs-42
    SQL注入-堆叠注入 - 图5
    因为刚刚已经插入进去了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进行堆叠
    SQL注入-堆叠注入 - 图6
    登陆成功

    查看数据库
    SQL注入-堆叠注入 - 图7
    插入成功了

    去看了一下42关的源码

    1. $username = mysqli_real_escape_string($con1, $_POST["login_user"]);
    2. $password = $_POST["login_password"];

    对用户名进行了转义,但是password直接以post方式提交了,这就造成了堆叠注入。