先放payload
?file=source.php?../../../../../ffffllllaaaagggg
打开一看,是一张大笑脸,无语
没办法,先看看源码,目测是代码审计题
开始看源码
body里发现一个很明显的绿色注释,source.php,至于下面那个划横线的链接,可以点进去看一下,就是刚刚那张可恶的大笑脸 。
下面看看source.php:
用了一下hackbar,比较方便,可以看到里面确实有东西
下面就是正题,代码审计。
我做这类题一般跳过条件函数,先看执行语句:
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后面跟随三个判断条件:
1.输入"file"不空
2.输入"file"为字符串
3.能够通过上述条件函数(emmm中的checkFile)
通过判断条件后,文件包含成功,语句也就顺利执行了。
上述分析结束,发现重点还是在条件函数:
逐段分析:
emmm类中首先有一个静态公共方法,包含了下面的几个条件
这是第一个条件,语义如下:
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;
}//如果取值失败,不存在或不是字符串,返回false
if (in_array($page, $whitelist)) {
return true;
}//取值成功且在白名单中有输入字段,通过条件
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);/*这个判断中存在两个函数,mb_substr用于截断输入值,
从0位置开始。mb_strpos函数用于判断输入字符串中?
在第几个位置出现,并返回数值。综合来看,其功能
就是截取输入字符?之前的语句内容,?以后不管*/
if (in_array($_page, $whitelist)) {
return true;
}//in_array判断同上
$_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;
}
}
上述语句判断完成
基本可以得出如下payload
?file=source.php?../../../../../ffffllllaaaagggg
?file用于传参,
为了应对截断后的白名单匹配,加了source.php,加hint.php也可以,同时用问号匹配截断条件;
../的用法是为了实现路径穿越,我也不知道加多少,反正就是一路穿,不一定加到第几个,就出来了;
最后的文件名字是在hint.php里得到的,一开始看它就不像好人,进去看看果然有东西。
以上就是做这道题遇到的全部问题,欢迎交流指正。