标签:包含 .. mb hint 漏洞 warmup file php page
buu第一题。
get到的知识:
- ?二次编码的文件会被当成目录(phpmyadmin4.81的漏洞);
- 一个新的绕过姿势;
题目:
<?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;
} //检测传入的page变量是否为空
if (in_array($page, $whitelist)) {
return true; // 检测page变量是否在白名单中
}
$_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\" />";
}
?>
思路分析:
代码的总体思路已经写在注释里了。这里主要有两个点要注意:
1.?过滤中的php函数:
mb_substr():跟substr()差不多,截取目标串的相关区间的字符串。
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置。
2.关于?的二次编码:
简而言之,就是:如果我们对?进行二次编码/解码(传入url时解码一次,上文的代码中urldecode函数解码一次),那么所被包含的名称就会被认为是一个目录(文件夹)而不是一个特定的文件。
payload的构造和相关分析:
?file=hint.php?../../../../../ffffllllaaaagggg
- 前面的问号是为了使file在检测中被截断为hint.php,从而绕过白名单。
- ../../../../是因为传入的的hint.php被当作是一个目录,需要多个../去跨目录。具体是几层,大概是自己试出来的?
参考:
2.对于这个漏洞的详细分析:
https://blog.csdn.net/Mikasa_/article/details/88594749
标签:包含,..,mb,hint,漏洞,warmup,file,php,page 来源: https://www.cnblogs.com/csszl/p/14613001.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。