文章目录
- 1、文件上传概述
- 2、客户端检测
- 2.1 客户端检测原理及绕过方法
- 2.2 实际操作之client check
- 3、服务端检测
- 3.1 MIME type
- 3.3.1 检测原理
- 3.3.2 绕过方法
- 3.3.3 实际操作之MIME type
- 3.2 文件内容检测
- 3.2.1 检测原理
- 3.2.2 绕过方式
- 3.2.3 实际操作之getimagesize()
- 3.3 其他服务端检测
1、文件上传概述
上传文件时,如果未对上传的文件进行严格的验证和过滤,就容易造成文件上传漏洞,上传脚本文件(包括asp、aspx、php、jsp等)。恶意上传行为可能导致网站甚至整个服务器被控制。恶意的脚本文件又被称为WebShell,WebShell具有强大的功能,如查看服务器目录、服务器中文件、执行系统命令等。
2、客户端检测
2.1 客户端检测原理及绕过方法
客户端(Client):或称为用户端(前端),与服务器相对应。由于客户端对于文件上传漏洞的防御是通过JS代码实现的,所以客户端检测与绕过也称为JS检测与绕过。
由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传WebShell。
- 删除浏览器事件;
- 利用BurpSuite抓包修改文件后缀名;
- 构造上传表单。
2.2 实际操作之client check
(1)如何判断存在JS检测?
分别上传图片文件和非图片文件,通过抓包,如果流经Burp的数据包不同(有or没有),则说明存在JS检测。
- 上传正常图片文件:
- 上传非图片文件:
刚选择非图片文件,就弹出警告框,说明存在JS检测。
(2)绕过JS检测
1)第一种方法:删除浏览器事件。
可以看到,成功绕过JS检测。但是,需要注意的是,在谷歌浏览器上使用该方法可能会失效。
2)第二种方法:禁用JS
3)第三种方法:bp抓包,修改文件名。
3、服务端检测
3.1 MIME type
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME 类型如下:
文件拓展名 | Mime-Type |
---|---|
.js | application/x-javascript |
.html | test/html |
.jpg | image/jpeg |
.png | image/png |
application/pdf |
3.3.1 检测原理
判断$_FILES["file"]["type"]
是不是图片格式(image/gif、image/jpeg、image/png)
,不是则不允许上传。在HTTP 协议中,使用Content-Type
字段表示文件的MIME 类型。$_FILES["file"]["type"]
的值是从请求数据包中Content-Type
中获取。
3.3.2 绕过方法
通过抓取数据请求包,上传php
文件时,Content-Type
值是application/octer-stream
,上传jpg
格式的文件时Content-Type
值是image/jpeg
。可修改文件类型进行绕过。
3.3.3 实际操作之MIME type
3.2 文件内容检测
3.2.1 检测原理
利用getimagesize()
函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。
服务端主要检测文件幻数:
类型 | 文件幻数 |
---|---|
JPG | FF D8 FF E0 00 10 4A 46 49 46 |
GIF | 47 49 46 38 39 61 (GIF89a) |
PNG | 89 50 4E 47 |
3.2.2 绕过方式
在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码
3.2.3 实际操作之getimagesize()
在linux中使用cat test.png 1.php >> test1.jpg
制作图片马。
3.3 其他服务端检测
- 后缀名检测域绕过
- 00截断检测与绕过
- 条件竞争检测与绕过