文件上传基础
什么是文件上传
将客户端数据以文件形式封装·通过网络协议发送到服务器端,在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存。
通常一个文件以HTTP协议进行上传时,将以POST请求发送至Web服务器,Web服务器收到请求并同意后,用户与Web服务器将建立连接,并传输数据
文件上传产生漏洞的原因
文件上传漏洞危害
上传文件的时候,如果服务器端脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件的情况。
攻击者通过上传恶意文件传递给解释器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理、命令执行等恶意操作·从而控制整个网站,甚至是服务器·这个恶意的文件( php、asp、aspx、jsp等),又被称Webshell。
可能存在漏洞的位置
1.图片上传功能
2.头像上传功能
3.文档上传功能
这一类的功能,往往都可能材质上传文件建议不严格的安全缺陷。
文件上传检测方式
一般一个文件上传过程中的检测方式有:
客户端JavaScript检测(检测文件扩展名)
服务端MIME类型检测(检测content-type内容)
服务端目录路径检测(检测跟path参数相关的内容)
服务端文件扩展名检测(检测跟文件extension相关的内容)
服务端文件内容检测(检测内容是否合法是否含有恶意代码)等
文件上传绕过
绕过客户端检测
原理
通常在上传页面里含有专门检测文件上传的JavaScript代码,最常见的就是检测文件类型和扩展名是否合法
方法
在本地浏览器客户端禁用JS即可;可使用火狐浏览器的Noscript插件IE中禁用JS等方式实现
测试
upload-labs靶场进行测试https://gitcode.com/c0ny1/upload-labs/overview
绕过服务器检测
服务器检测
upload检测:
1.客户端效验
2.服务器效验:
MIME类型:
文件内容:文件幻数、文件相关信息、图片渲染、二次渲染
文件后缀:黑名单、白名单
常见的MIME类型
超文本标记语言.html文件:text/htm
普通文本.txt文件:text/plain
PDF文档.pdf:application/pdf
Microsoft Word文件.word : application/msword
PNG图像.png :image/png
GIF图像.gif:image/gif
MPEG文件.mpg.mpeg : video/mpeg
AVI文件.avi : video/x-msvideo
绕过MIME类型检测
原理:检测图片类型文件上传过程中http包的Content-Type字段的值,来判断上传文件是否合法
绕过方法: 用burpsuite截取并修改数据包中文件的content-type类型进行绕过
绕过文件后缀检测-黑名单
黑名单策略:
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件
1.后缀大小写绕过:(Php)
在对后缀的判断如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。
2.空格绕过:(php)
如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过
3.点绕过 :(php.)
如果黑名单没有对后缀名进行去处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的.,通过在文件名后加.进行绕过。
4.:: D A T A 绕过 : 如果黑名单没有对后缀名进行去 : : DATA绕过: 如果黑名单没有对后缀名进行去:: DATA绕过:如果黑名单没有对后缀名进行去::DATA处理,利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::SDATA,绕过对黑名单的检测。
5.配合Apache解析漏洞:
Apache解析有一个特点,解析文件时是从右往左判断,如果为不可识别解析再往左判断,如aa.php.owf.rar文件Apache不可识别解析’.owf’和’.rar’'这两种后缀,会解析成.php文件。
6…htaccess文件
配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测htaccess文件(或者"分布式配置文件"),全称是Hpertext Access(超文本入口)。提供了针对目录改变配置的方法即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录,作为用户所能使用的命令受到限制。
新建一个.htaccess文件:
<FileMatch "as.png">
SetHandler application/x-httpd-php
</FileMatch>
当遇到as.png文件他会解析成php文件
通过一个.htaccess 文件调用 php 的解析器去解析一个文件名中只要包含"haha"这个字符串的任意文件,所以无论文件名是什么样子,只要包含"haha"这个字符串,都可以被以 php 的方式来解析,一个自定义的.htaccess 文件就可以以各种各样的方式去绕过很多上传验证机制。
绕过文件后缀检测-白名单
白名单策略:
文件扩展名不在白名单中为不合法。
绕过方法:
服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。
%00截断
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。
总的来说就是他保存会变成png格式 当解析的时候%00相当于是注释掉后面的png 让他变成php格式
正常来说空格是20在十六进制里面 %00就是00
0x00截断
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束·但要注意是文件的十六进制内容里的00,而不是文件名中的00。
绕过文件内容检测
一般通过检测文件内容来判断上传文件是否合法
主要有两种检测方法:
1.通过检测上传文件内容开始处的文件幻数来判断。通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型
2.文件加载检测一般是调用API或函数对文件进行加载测试·常见的是图像染测试,再严格点的甚至是进行二次渲染
主要是检测文件内容开始处的文件幻数
文件格式幻数( 外语: magic number)·它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
绕过文件内容检测-文件幻数检测
常见图片类型的文件幻数如下:
1.要绕过 jpg 文件幻数检测就要在文件开头写上下面的值
Value = FF D8 FF EO 00 10 4A 46 49 46
2.要绕过 gif 文件幻数检测就要在文件开头写上下面的值
Value = 47 49 46 38 39 61
3.要绕过 png 文件幻数检测就要在文件开头写上下面的值
Value = 89 50 4E 47
然后在文件幻数后面加上自己的一句话木马代码就行了
绕过文件内容检测-文件加载检测
一般是调用API 或函数去进行文件加载测试,我们常见的是图像染测试,严格的进行二次渲染对渲染/加载测试的攻击方式是代码注入绕过对二次渲染的攻击方式是攻击文件加载器自身
1.对渲染/加载测试攻击- 代码注入绕过可以用图像处理软件对一张图片进行代码注入
这类攻击的原理是·在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般是图片的注释区,这样能保证本身文件结构是完整的,对于渲染测试基本上都能绕过
2.二次染的攻击方式 攻击文件加载器自身
这种情况下无法用代码注入绕过,二次染相当于吧原本属于图像数据的部分抓出来,在用自己的API或函数进行重新渲染,而非图像数据部分直接被隔离开了。
我们可以用溢出攻击对文件加载器进行攻击,上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测
试,加载测试时被溢出攻击执行shellcode
WEB解析漏洞简介
apache解析漏洞
形式: testphp.qwe.asd,任意不属于Apache解析黑名单且也不属于白名单的名称
原理:Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断,比如
testphp.qwe.asdqwe”和”asd” 这两种后是apache不可识别解析,apache就会把test,php.qweasd解析成php
www.xx.com/ testphp.qwe.asd
IIS 6.0解析漏洞
目录解析:
形式:www.xxx.com/xx.asp/xxjpg
原理: 服务器默认会把.asp目录下的文件都解析成asp文件
文件解析:
形式:wwwxxx.com/xxasp;jpg
原理:服务器默认不解析;号后面的内容,因此xxasp;jpg便被解析成asp文件了
IIS 7.0解析漏洞
形式:意文件名/任意文件名.php
原理:IS7.0/7.5 是对 php 解析时有一个类似于 Ninx 的解析漏洞,对任意文件名只要在 URL后面追加上字符串“/任意文件名.php“就会按照 php 的方式去解析
Nginx解析漏洞
形式:任意文件名/任意文件名.php
一个在任意文件名后面添加 /任意文件名.php 的解析漏洞·比如原本文件名是 testjpg·可以添加为test.jpg/x.php 进行解析攻击。
形式:任意文件名%00.php
对低版本的 Nginx 可以在任意文件名后面添加%00,php 进行解析攻击·( Nginx版本<=0.8.37 空字节代码执行漏洞)