1. 例题:文件上传限制
1)上传漏洞靶场介绍
- 项目名称: upload-labs
- 开发语言: 使用PHP语言编写
- 功能定位: 专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场
- 关卡数量: 目前共21关,每关包含不同上传方式
- 注意事项:
- 每关没有固定通关方法,不要自限思维
- 提供的writeup仅供参考,鼓励分享个人通关思路
- 没有思路时可查看提示
- 黑盒情况下实在做不出可查看源码
2)白名单与黑名单机制
- 白名单机制:
- 定义: 只允许特定格式文件上传
- 比喻: 类似机关大院停车场,只有放通行证的车辆才能进入
- 示例: 本关只允许上传jpg/png/gif类型文件
- 黑名单机制:
- 定义: 禁止特定危险格式文件上传
- 比喻: 类似办公大楼"衣冠不整者禁止入内"的告示
- 示例: 禁止上传php/asp/jsp等脚本文件
- 组合使用: 白名单和黑名单机制可以结合使用
3)绕过前端JS校验的方法
- 禁用JavaScript
- 方法原理: 前端校验依赖JavaScript执行,禁用后校验失效
- 操作步骤:
- 浏览器地址栏输入about:config
- 搜索javascript.enabled
- 将值从true改为false
- 注意事项:
- 修改浏览器配置可能影响性能和安全性
- 禁用后许多网站功能会失效
- 修改客户端代码
- 操作步骤:
- 按F12打开开发者工具
- 定位到表单提交事件(如checkFile函数)
- 删除onsubmit事件绑定
- 优势: 比完全禁用JavaScript更精准,不影响其他功能
- 操作步骤:
4)实战演示
- 验证方法:
- 上传webshell文件(shell.php)
- 通过浏览器直接访问上传文件
- 使用中国蚁剑等工具连接验证
- 异常现象解释:
- 图片裂开是因为系统尝试将非图片文件作为图片解析
- 不影响webshell功能正常使用
5)其他绕过技巧
- 浏览器插件:
- 使用油猴脚本等插件禁用特定网站的JavaScript
- 复制限制案例:
- 以360doc网站为例说明前端检测机制
- 类比上传校验的绕过思路
2. 例题:文件上传限制
1)MIME类型基础
- 定义: MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型,用于标记互联网通信和文件传输场景中的文件类型。
- 生成机制: 由浏览器根据文件扩展名自动生成,如.jpg文件对应image/jpeg类型。
- 常见类型:
- 图片: image/jpeg, image/png, image/gif
- 文本: text/html, text/plain
- 数据: application/json
- 二进制: application/octet-stream
- 官方标准: IANA是MIME媒体类型的官方注册机构,维护所有官方MIME类型列表。
- 默认类型:
- text/plain: 文本文件默认值
- application/octet-stream: 其他情况的默认值
2)应用案例
- 例题:浏览器请求头的contentType
- 客户端用法:
- Content-Type: 在POST请求头中指定上传文件类型
- Accept: 告诉服务端允许接收的响应类型
- 服务端用法:
- 响应头Content-Type: 告知客户端响应数据类型
- 实战观察:
- 百度响应头包含Content-Type: text/html
- 请求头包含Accept字段声明可接收类型
- 文件上传时会自动生成Content-Type字段
- 客户端用法:
3)Burp代理抓包环境配置
- JDK要求: Burp Suite需要JDK 9+,推荐使用JDK 11
- 常见问题:
- 版本冲突:与冰蝎/哥斯拉工具所需的JDK 8可能冲突
- 解决方案:修改JAVA_HOME环境变量切换版本
4)Burp代理使用
- 配置步骤:
- 启动Burp监听8080端口
- 浏览器配置代理插件(如FoxyProxy)
- 切换代理到Burp
- 实战操作:
- 拦截文件上传请求
- 修改Content-Type为合法图片类型(如image/jpeg)
- 绕过服务端MIME类型检查
- 验证方法:
- 观察是否返回上传成功提示
- 检查服务器目录确认文件存在
- 注意文件名是否被重命名
3. 例题:文件扩展名拦截
- 拦截机制:无论前端还是后端校验,都有机会被修改绕过
- 关键点:不能仅依赖浏览器自动生成的MIME类型进行校验
- 源码分析:需要检查文件扩展名的处理逻辑
4. 等价扩展名
- 黑名单机制:通过数组匹配禁止上传的扩展名(.asp/.aspx/.php/.jsp)
- 处理流程:
- 获取文件扩展名并进行多重处理(删除末尾点、转小写、去除特殊字符等)
- 最终与黑名单数组进行比对
- 绕过思路:利用黑名单不完整的特点,尝试使用等价扩展名
1)常见等价扩展名
- ASP:.asa, .cer, .cdx
- ASPX:.ashx, .asmx, .ascx
- PHP:.php2, .php3, .php4, .php5, .phps, .phtml
- JSP:.jspx, .jspf
- 产生原因:程序语言版本发展过程中衍生的扩展名
2)例题:文件上传尝试
- 实践步骤:
- 将webshell.php改为webshell.php3
- 上传后访问时出现下载框(需配置服务器解析)
- 成功连接中国蚁剑进行管理
- 服务器配置:
- 修改Apache的httpd.conf文件
- 添加AddType application/x-httpd-php .php .phtml .php3 .php5
- 确保服务器能解析这些等价扩展名
- 题目解析
- 关键突破点:利用黑名单未包含的PHP等价扩展名
- 环境要求:需要配置服务器解析这些特殊扩展名
- 文件重命名:上传后系统会自动重命名文件(基于时间戳+随机数)
- 连接验证:通过中国蚁剑成功连接验证webshell有效性
5. 例题:文件扩展名拦截
1)黑名单过滤机制
- 过滤逻辑:通过检查文件扩展名是否在黑名单中决定是否允许上传,黑名单包含".php",".php5",".php4"等常见PHP扩展名。
- 处理流程:
- 删除文件名末尾的点
- 转换为小写
- 去除字符串"::$DATA"
- 收尾去空
- 漏洞原因:黑名单不全面,存在遗漏的PHP变种扩展名。
2)黑名单强化
- 新增拦截项:".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa"等
- 防御效果:基本覆盖了所有常见的PHP变种扩展名,使简单的扩展名修改攻击失效。
3)绕过方法探索
- 思路转变:当无法通过修改扩展名绕过时,尝试上传伪装成图片的PHP文件。
- 实施步骤:
- 将PHP文件扩展名改为.jpg等图片格式
- 成功上传后文件实际内容仍是PHP代码
- 限制:虽然能上传成功,但服务器不会将图片文件当作PHP代码执行。
4).htaccess文件利用
- 功能:Apache服务器的配置文件,可改变文件扩展名、配置重定向等。
- 攻击应用:通过上传.htaccess文件强制服务器将特定文件(如.jpg)当作PHP解析。
- 实现原理:添加"AddType application/x-httpd-php .jpg"指令。
5)完整攻击链
- 步骤:
- 上传伪装成图片的PHP文件
- 上传自定义的.htaccess文件
- 访问图片URL触发PHP代码执行
- 使用中国蚁剑等工具连接webshell
- 关键点:需要服务器允许.htaccess文件覆盖配置。
6)防御建议
- 白名单机制:仅允许特定安全的文件类型
- 文件内容检查:验证文件实际内容与扩展名是否匹配
- 禁用.htaccess:在Apache配置中禁止覆盖
- 权限控制:上传目录禁止脚本执行
6. 应用案例
1)例题:伪静态网站文件查看
- 动态网站架构:Discuz论坛使用PHP搭建,属于动态网站,通过PHP文件处理请求并从数据库获取数据动态生成页面内容。
- 伪静态原理:实际URL应为动态形式如"thread.php?id=xxx&page=1",但通过.htaccess重写规则伪装成静态HTML路径"thread-xxx-1-1.html"。
- SEO优化目的:搜索引擎更偏好静态内容,伪静态可提高收录率。真实路径仍保持动态特性,仅URL显示为静态形式。
- 技术实现:通过服务器配置文件.htaccess实现URL重写,将静态形式URL映射到真实PHP处理程序。
- 数据获取方式:页面内容(标题、正文、评论、用户信息等)均从数据库动态获取,PHP文件仅作为处理框架。
- 路径伪装示例:看似独立HTML文件"thread-1530418-1-1.html",实际由thread.php处理参数id=1530418和page=1。
2)例题:图片文件伪装
- 文件解析控制:通过.htaccess的SetHandler指令可指定特定文件类型按PHP解析。
- 精确控制方法:使用<Files>指令限定仅特定文件(如a.jpg)按PHP处理,避免全局影响。
- 实际应用:将恶意代码存入图片文件,配合.htaccess使服务器将其作为PHP执行,实现Webshell功能。
- 防御措施:服务器应限制.htaccess使用权限,禁止用户上传此类配置文件。
- 多功能性:除URL重写外,.htaccess还可实现IP限制、访问控制等安全功能。
- 执行验证:成功上传.htaccess后,访问伪装图片(a.jpg)会触发PHP解析执行,证明配置生效。
二、知识小结
知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
文件上传漏洞原理 | 通过伪造文件类型绕过前端/后端校验,上传恶意脚本(如Web Shell) | 前端JS校验可被禁用或篡改,后端校验需关注MIME类型与扩展名黑名单 | ⭐⭐ |
MIME类型绕过 | HTTP请求头中的Content-Type字段可被篡改(如将application/x-php改为image/jpeg) | 浏览器自动生成MIME类型,需通过代理工具(如Burp Suite)拦截修改 | ⭐⭐⭐ |
黑名单与白名单机制 | 白名单仅允许指定格式(如.jpg/.png),黑名单禁止危险扩展名(如.php/.asp) | 等价扩展名绕过(如.php3/.phtml需服务器配置支持) | ⭐⭐⭐ |
.htaccess文件利用 | 通过自定义Apache配置强制将特定文件(如.jpg)解析为PHP | 需服务器允许覆盖配置,且文件需与恶意脚本同目录 | ⭐⭐⭐⭐ |
动态与伪静态网站 | 动态网站通过参数查询数据,伪静态伪装路径以优化SEO(如Discuz论坛) | .htaccess实现重定向与解析规则覆盖 | ⭐⭐ |
工具链使用 | Burp Suite改包、浏览器禁用JS、F12开发者工具篡改前端代码 | 环境依赖问题(如JDK版本冲突需切换) | ⭐⭐⭐ |