$__MSG"; echo "
$__FOOTER
";
?>
==========
有些渗透测试经验的话,看到 logRequest 函数大概就知道思路了。这里面有2个点:
1. $_SERVER['HTTP_USER_AGENT'] 变量可以控制;
2. 由于客户端能拿到会话 id,所以知道日志文件路径。
一个可能的利用思路是:通过 user-agent 传递 webshell,webshell 被顺利写入 log 文件,然后通
过代码审计看是否有通过 include/require 函数包含该日志文件的点。
很容易发现 safeinclude 函数中有调用 include 函数包含文件。
但不幸的是,safeinclude 函数在包含文件前,做了一些安全检查,包括将 ../ 删除和拦截包含
natas_webpass 关键字的请求。
日志文件路径并不包含 natas_webpass,而是在文件内容中包含,所以只需绕过删除 ../ 的机制。
通过 lang 参数传递的日志文件路径会和 "language/" 拼接,我们需要绕过它使得直接 include 日志
文件。怎么绕过?答案是 ....//,由于检查机制会删除 ../,所以 ....// 被处理后正好变成了 ../,
完美绕过。
至此,答案就呼之欲出了。
首先,在 user-agent 中追加 @@。然
后,请求 /?lang=....//....//....//....//....//....//....//....//....//....//var/
www/natas/natas25/logs/natas25_s9b78es9ml0have379p4go85t9.log。至于需要多少个
....//,尝试几次就好了。
include 包含 log 文件后,会执行其中的 php 代码,在页面显示 natas26 的密码。
......
[05.12.2022 07::53:00] Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/
537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/
537.36@@8A506rfIAXbKKk68yJeuTuRq4UfcK70k
"Directory traversal attempt! fixing request."
......