buu Web 题库 (1)
[极客大挑战 2019]EasySQL
很简单的 sql 题,用户名随便写,密码先尝试一下单引号闭合 1',结果如下

ok, 那明白了,可以直接输入:1' or 1=1 #, 也就是万能密码试试。结果如下:

结束!
[极客大挑战 2019]Havefun
页面上啥也没有,先看看源码,在源码上找到如下代码:

很明显了,get 方式传入参数为 dog。
也就是 http://d38dc0d1-a4b8-4df9-a9e6-3ca8697bc23e.node4.buuoj.cn:81/?cat=dog

结束!
[HCTF 2018]WarmUp
同样的,页面上就只有一张滑稽图,看看源码吧,提示我们去 source.php.
进入后,开始代码审计。

里面有个 hint.php, 先去看看,告诉我们
flag not here, and flag in ffffllllaaaagggg
ok,先读代码。
具体来看
<?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;
}
// 判断 page 参数是否存在,且是否为字符串
if (in_array($page, $whitelist)) {return true;}
// 在白名单中匹配 page 参数
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
// 先看 mb_strpos(str,find_str,offset,encoding): 返回 str 中从 offset(默认为 0) 开始第一次出现 find_str 的位置。此处就是返回第一个? 的位置
// 再看 mb_strpos()。此处就是截取并返回从字符串开头到第一个? 出现位置的字符串
if (in_array($_page, $whitelist)) {return true;}
$_page = urldecode($page);
// 将参数进行 url 解码,? 解码后仍为?
$_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'])
// 通过参数名为 file 的参数传入,且为字符串,并且 checkFile 函数返回值为 true
) {include $_REQUEST['file'];
exit;
} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";}
?>
通过以上代码的分析,很明显,我们需要让这几个 if 语句全部返回为 true。
因此我们的 payload 为 ?file=source.php?../ffffllllaaaagggg
尝试过后失败,猜测是不是目录出了问题,而文件名提示我们需要先进行四次../
于是最终 payload 为 ?file=source.php?../../../../../ffffllllaaaagggg

结束!
[ACTF2020 新生赛]Include
打开环境,顺着它点击,发现啥也没有,而源码里也啥也看不到。
此时我们看到 url 为 xxxxx?file=flag.php
猜测一下是不是 php 伪协议,一个简单的文件包含漏洞
试一下,payload 为 ?file=php://filter/convert.base64-encode/resource=flag.php
将得到的 base64 进行解码

结束!
[ACTF2020 新生赛]Exec
只有一个 ping, 试试 127.0.0.1;ls

很显然,连最简单的分号都没有过滤,那么直接找 flag 所在目录吧,最后的命令是 127.0.0.1;cd ../../../;cat flag

结束!
[GXYCTF2019]Ping Ping Ping
上来只有一个 /?ip=, 很显然,随便传个参数,构造 payload 为 /?ip=127.0.0.1;ls

ok, 分号没过滤,直接 ip=127.0.0.1;cat flag
显示过滤了空格,这里我们可以用 $IFS$1, 来代替空格也就是 ip=127.0.0.1;cat$IFS$1flag, 显示过滤了 flag,那我们就先看 index.php, 找到了源码。

分析源码,过滤了好多,最重要的就是 flag 给过滤了,这里可以变量替换传入,具体如下:
ip=127.0.0.1;a=g;b=fla;cat$IFS$1$b$a.php
这里的变量拼接不唯一,但是好多拼接方式都不可以,不行的话,可以换角度多方面试试,例如 ip=127.0.0.1;a=ag;b=fl;cat$IFS$1$b$a.php
ok, 成功进入,看源码拿 flag。

最后顺便说一下用来代替空格的 $IFS$1:
$IFS 在 Linux 下表示为空格,$1 是当前系统 shell 进程第 1 个参数持有者,始终为空字符串,$ 后可以接任意数字
结束!