日志文件包含LFI
本文介绍了Web服务器日志机制的安全隐患及攻击利用方式。日志文件通常存储在/var/log/nginx/等目录,记录请求信息。攻击者可通过User-Agent注入PHP木马(如<?php eval($_POST[1]);?>),利用文件包含漏洞执行日志中的恶意代码。php://input可绕过常规参数检测直接读取请求体,配合eval实现RCE(远程代码执行)。典型攻击链为:注入恶意代码
所有测验请在授权的地方进行测验,遵守法律
1.什么是日志
简单来说,Web服务器(如Nginx、Apache、IIS、Tomcat)在处理每一个HTTP请求时,都会自动"登记"一条记录。
- 工作原理:Web服务器的内部有一个专门负责日志的模块或"阀门"。当它收到请求并返回响应后,会立即把这次交互的关键信息(时间、客户端IP、请求内容、状态码等)格式化成一条文本,追加到日志文件里。
- 存储位置:日志文件通常存放在服务器文件系统中的特定目录下,且这个目录一般不在网站根目录(如
/www/html)里,以避免被攻击者通过Web直接访问。
-
- Nginx/Apache (Linux):通常位于
/var/log/nginx/或/var/log/apache2/目录下。 - IIS (Windows):默认在
%SystemDrive%\inetpub\logs\LogFiles\目录下。 - Tomcat:一般在
$TOMCAT_HOME/logs目录下。 - 其他:像Django这类应用框架也可能有自己的日志配置。
- Nginx/Apache (Linux):通常位于
下面这是典型的一个日志行
192.168.1.100 - - [10/May/2026:13:45:22 +0800] "POST / HTTP/1.1" 200 5324 "https://971f9656-015c-4b4c-abe0-1eeae3d7dd09.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/122.0.6261.95 Safari/537.36"
2.日志文件包含攻击思路:
1.php://input
2.web服务器在处理每一个http请求时,都会自动“登记”一条记录
3.查看该条http响应头(服务端)server头的信息,发现是nginx(或者其他头)
4.找对应的一般日志存放路径
5.nginx为:/var/log/nginx/access.log
6.将一句话木马放到user-agent头(原因:选择 User-Agent 进行注入,正是因为它“无关紧要”——对请求的正常功能、性能、以及服务器的响应结果几乎没有影响,但它的内容却会被服务器忠实地记录到日志文件中。):<?php eval($_POST[1]);?>
7.当服务器执行读操作时会执行这一句话木马
8.后端简要解释:

include的主要行为:
当包含一个 PHP 文件时:include 会切换成 PHP 解析模式,执行该文件中所有的 PHP 代码(<?php ... ?> 之间的内容),然后将执行结果(如果有)返回给 include 语句所在的位置。文件中的非 PHP 代码(HTML 文本)会直接输出
当包含一个非 PHP 文件(如 .txt、日志文件)时:PHP 引擎会读取该文件的全部内容,并尝试将其中的任何 PHP 标签(<?php ... ?>)作为代码来执行。无法被识别为 PHP 代码的部分,会直接作为文本字符串处理。
这就是为什么将 <?php eval($_POST[1]);?> 写入日志文件,再通过 include 包含它,能够实现 RCE(远程控制) 的根本原因。
7.POST[1],1是参数名,$_POST[1],即将参数名的值获取存到变量post然后被执行,此时就可以通过把想要执行的php代码放到1的值中,每次获取file的数据时,post[1]都会被执行
8. 1=system("ls");
1=system("tac flag.php");
9.Content-Type: application/x-www-form-urlencoded 要求数据是 key1=value1&key2=value2 格式
10.攻击链条:恶意 User-Agent → 写入日志文件 → 文件包含漏洞 → PHP 执行日志内容 → 触发 eval() → RCE → 服务器沦陷
4.php://input
代表攻击者试图不通过 $_POST 变量,而是直接从HTTP请求的原始Body(正文)中读取数据。
body(请求体) 请求体空一行下面
php://input是 PHP 提供的一个只读流。- 它的作用是:访问 HTTP 请求的原始内容。
- 与
$_POST的区别:当Content-Type是multipart/form-data(表单上传文件)时,php://input无效;但在其他情况(如 JSON、XML、纯文本数据)下,它可以读取整个请求体。 - 核心目的是:绕过网站对标准表单参数的检测,直接植入恶意代码。
即如果用上面的post参数很容易被一些防火墙给拦截,用php://input可以直接读取请求体,如果此时请求体已经是一句话木马就会被执行
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)