BUUCTF学习笔记-WarmUp
BUUCTF学习笔记-WarmUp
时间:2020/03/04
考点:代码审计
文章图片
先看看题目的描述,写着PHP和代码审计,估计是那种直接给一段PHP源代码,然后构造请求来获得flag。
文章图片
打开题目链接只有一个表情包的图片,右键查看源代码提示我们访问source.php,访问source.php能发现到题目的源代码。
"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 "
";
}
?>
代码审计下来能看到是要我们输入一个file的参数,只要这个参数不是非空、为字符串类型和能通过自定义的checkFile函数就能直接包含这个文件。那正式开始尝试,首先看第一次判断,因为没有对值进行任何操作,所以也不能存在任何绕过的可能性,只能输入默认的两个白名单参数。
仔细看一下checkFile这个函数,是一个类似白名单的判断的函数。一开始设立了一个白名单,包括两个文件名source.php和hint.php。然后会进行3次白名单的判断,只要成功一次算通过白名单。
第一次判断,没有进行任何操作,直接拿输入的值来进行白名单判断。
第二次判断,是取输入的值第一个?
号前面的字符串来进行白名单判断。
第三次判断,是取输入的值进行URL编码的解码,然后和第二次判断你的操作一样,取解码后的字符串的第一个?
号前面的内容来进行白名单判断。
输入尝试在第二次判断中绕过,因为是取第一个?file=source.php
,能看到页面上又加载了一次source.php的代码。
输入?file=hint.php
,能看到页面上加载了hint.php的内容flag not here, and flag in ffffllllaaaagggg。能看出来我们的目标是绕过白名单,使页面能加载ffffllllaaaagggg文件。
?
号前面的字符串来进行白名单判断。所以前面肯定是?file=source.php
或者?file=hint.php
。不然根本通不过白名单,但是我们可以在后面加上任何东西,应为他只取?
前面的来进行判断。这时就能想到用../
来跳出目录,找到对应的ffffllllaaaagggg
文件。输入尝试在第三次判断中绕过,因为和第二次判断相比,第三次判断前面的操作只是多了一次URL编码的解码,又因为本身浏览器解析的时候会进行URL的解码。所以我们需要对参数进行两次的URL编码。需要编码的其实也只有?file=hint.php?/../ffffllllaaaagggg
,没有加载出来。
输入?file=hint.php?/../../ffffllllaaaagggg
,没有加载出来。
输入?file=hint.php?/../../../ffffllllaaaagggg
,没有加载出来。
输入?file=hint.php?/../../../../ffffllllaaaagggg
,成功加载到页面,并看到flag。
?
这个字符。【BUUCTF学习笔记-WarmUp】?
第一从URL编码为%3f
,将%
再编码一次为%25
。所以合起来?
两次URL编码为%253f
。
在上面的payload中将?
替换成%253f
等到新的payload。file=hint.php%253f/../../../../ffffllllaaaagggg
输入后也能加载到文件,等到flag。
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- Android中的AES加密-下
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习