文件上传
将客户端数据以文件形式封装,通过网络协议发送到服务器端,在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存,通常一个文件在以HTTP协议下上传时,将以POST请求发送至Web服务器,Web服务器收到请求并同意后,用户与Web服务器将建立连接,并传输数据。
产生漏洞的原因:
1. 服务器配置不当;
2.文件上传限制被绕过
3.开源编辑器的上传漏洞
4.文件解析漏洞导致文件执行
攻击者通过上传恶意文件——恶意文件被称为WebShell
可能存在的位置:
- 图片上传功能;
- 头像上传功能;
- 文档上传功能;
对文件上传的检测方式:
客户端Javascript检测——检测文件扩展名——前端脚本
服务端MIME类型检测——检测content-type字段内容
服务端目录路径检测——检测跟path参数相关的内容
服务端文件扩展名检测——检测跟文件extension相关的内容
服务端文件内容检测——检测文件里的内容是否合法
文件上传的绕过:
利用bp进行抓包改包的过程,进行绕过
绕过客户检测:
原理:通常在上传页面里含有专门检测文件上传的Javascript代码,最常的就是检测文件类型和扩展名是否合法
方法:在本地浏览器客户端禁用JS即可(可使用火狐的Noscript插件、IE中禁用JS等方法)
判断该网站是否有被过滤;使用bp上传时查看情况
发现此时bp没有收到get.php的请求,说明被过滤(图中的是之前的)
思考:
检查代码
发现前端里有一个checkfile()的代码
利用前端可修改的特定,将其删除
抓包绕过
此时的请求包是发送到服务端的,此时就把前端的过滤给跳过了。
将filename改成php,点击foword,可以发现页面跳成对应的形式,这时证明上传成功
然后依之前的进行输入
过滤成功
绕过服务端的检测:
服务端的检测:
MIME类型、文件后缀、文件内容
绕过MIME类型检测:
检测图片类型文件上传过程中http包的content-type字段的值来判断上传文件是否合法。
方法:用BP截取并修改数据包中文件的conten-type类型进行绕过
绕过文件后缀检测——黑名单:
方法:
- 后缀大小写绕过(.Php):
- 空格绕过(.php )
- 点绕过(.php.)
- 后缀改写绕过(.php3、.php4、.php5.....)
- ::$DATA绕过(.php::$DATA)
- 配合Apache解析漏洞:Apache解析有一个特点,解析文件是从右往左判断的,如果不可识别解析再往左进行判断,如aa.php.owf.rar文件,Apache不可识别解析’.owf’ 和 ‘,rar’,于是就解析成.php文件。
- .htaccess文件:配合名单列表绕过,上传一个自定义的.htaccess,就可以绕过检测,.htaccess文件(分布式配置文件),提供了针对目录改变配置的方法;在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录作为用户,所能使用的命令受到限制。
如; 新建一个htaccess文件
<FilesMatch “get.png”>
SetHandler application/x-httpd-php——是apache服务端对此文件进行php解析
</FilesMatch>
通过一个.htaccess文件调用php的解析器去解析一个文件名中只要包含“haha”这个字符串的任意文件,所以无论文件名是什么样子,只要有“haha”这个字符串,都可以被以php方式来解析,一个自定义的.htaccess文件就可以以各种各样的方式去绕过很多检测机制。
绕过文件后缀检测——白名单
不在名单里的为不合法的
绕过方法:
服务端判断文件类型是从后往前,而对文件解析是从前往后,所以利用00截断的方式进行绕过,包括%00截断与0x00截断。——截断只能用php5.2的版本
%00截断:
Url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容
在GET(这里的GET,不是指请求数据包的方式)的方式中
直接写入
POST的方式中:
%00是复制不出来的
需要先输入空格,
然后找到对应的编码,(空格编码为20),修改为00
保存后就是
0x00截断同理
绕过文件内容检测:
- 通过检测上传文件内容开始处的文件幻术书来判断
通常通过判断前10个字节,基本就能判断出一个文件的真实类型
文件幻数:用来标记文件或者协议的格式,很多文件都有幻数标志来表明文件的格式
使用winhex查看文件的十六进制的一些数据
- 文件加载检测
一般是调用API或函数对文件进行加载测试,常见的是图像渲染测试,以及二次渲染
放一个正常的图片并进行代码注入
在不破坏文本本身的渲染情况下找一个空白区间进行填充代码,一般是图片的注释区,这样
能保证本身文件结构是完整的
二次渲染: