登录后更精彩...O(∩_∩)O...
您需要 登录 才可以下载或查看,没有账号?立即注册
×
[HCTF 2018]WarmUp类型:[backcolor=rgb(91, 114, 144) !important]PHP [backcolor=rgb(91, 114, 144) !important]代码审计
第一步:直接访问:
第二步:查看源码,找到线索source.php
[HTML] 纯文本查看 复制代码 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!--source.php-->
<br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" /></body>
</html>
第三步:访问source.php,代码审计
[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\" />";
}
?>
访问hint.php获取到flag文件名称
flag not here, and flag in ffffllllaaaagggg
核心绕过逻辑在checkFile(&$page)里面
第一个 if 语句,对变量进行检验,要求$ page为字符串,否则返回 false。
第二个 if 语句,判断$ page是否存在于$ whitelist数组中,存在则返回 true。
第三个 if 语句,截取传进参数中首次出现?之前的部分,判断该部分是否存在于$ whitelist数组中,存在则返回 true。
第四个 if 语句,先对构造的 payload 进行 url 解码,再截取传进参数中首次出现?之前的部分,并判断该部分是否存在于$ whitelist中,存在则返回 true。
若以上四个if语句满足一个即可返回 true,若均未满足,则返回 false。 构造payload:
flag{6dd5ccdc-775f-48eb-b143-1e8f92de1c17}
php函数:
checkFile(&$page) 参数带&符号:两个变量来指向同一个内容
mb_substr() 函数返回字符串的一部分
mb_strpos() //mb_strpos()函数返回要查找的字符串在别一个字符串中首次出现的位置
本题,所涉及到的php函数
函数 描述
isset 用于检测变量是否已设置并且非 NULL,若是返回false。
is_string 检测变量是否是字符串,若存在返回true。
in_array() 函数搜索数组中是否存在指定的值,若存在返回true
mb_substr() 返回字符串的一部分
mb_strpos() 查找字符串在另一字符串中第一次出现的位置。
|