目录
(图片来源于网络)
一、什么是文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。显然这种漏洞是getshell最快最直接的方法之一,需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。
二、漏洞产生的原因
- 没有对上传的文件做校验,导致具有危害性的脚本被保存到了服务器上;
- 没有控制服务器对上传目录的解析和执行行为,导致误执行了危害性的脚本;
三、常见校验上传文件的方法
客户端校验
- 通过javascript来校验上传文件的后缀是否合法,可以采用白名单,也可以采用黑名单的方式
- 判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。(服务端没有得到数据--burpsuite无法抓包)
通常情况下,如果白名单能满足需求,就尽量使用白名单,因为白名单更加的安全,而黑名单容易被意想不到的方法进行绕过。
服务器端校验
- 校验请求头 content-type字
-
HTTP协议规定了上传资源的时候会在请求头Header中添加一项MIMETYPE,即Content-Type,用来标识上传资源内容的类型,这个动作一般由浏览器来完成,常见的MIMETYPE类型如下:
- text/plain,纯文本
- text/html,HTML文档
- text/javascript,JS代码
- application/x-www-urlencoded,POST方法提交的表单
- application/msword,MicrosoftWord文件
- application/变成语言,该种编程语言的代码
- application/pdf,PDF文档
- application/octet-stream,二进制数据
- application/xhtml+xml,XHTML文档
- image/gif+jpeg+png,各种类型的图片
- vedio/mpeg,动画
- multipart/form-data,POST提交时伴随文件上传的表单
-
后端在处理上传请求的时候,可以获取header种的Content-Type类型,来判断上传的文件是否符合要求。当然这种方式也很容易被绕过,使用BP工具,拦截浏览器请求,修改Content-Type类型就行了,虽然这种方法不保险,但是加上一层防护也还是必
2.后缀扩展名
- 黑名单策略,
文件扩展名在黑名单中的为不合法
- 白名单策略
文件扩展名不在白名单中的均为不合法
3.通过自己写正则匹配来判断文件幻数(文件头)内容是否符合要求,一般来说属于白名单的检测,常见的文件头(文件头标志位)
- JPG,JPE,JPEG对应
FF D8 FF E0 00
”JPGGraphicFile” - GIF对应
47 49 46 38 39 61
”GIF89A” - PNG对应
89 50 4E 47
- ZIP对应
50 4B 03 04
”ZipCompressed” - RAR对应
52 61 72 21
- DOC/XLS/PPT对应
D0 CF 11 E0 A1 B1 1A E1
-
doc;.xls;.xlt;.ppt;.apr,”MSCompoundDocumentv1orLotusApproachAPRfile”(D0CF11E0A1B11AE1)
后端可以检查文件头的前几位字节,就可以判断是否为合法的文件类型,但是这种方式也不是完全保险的,并不能替代检查文件后缀的方式,因为黑客完全可以构造一个脚本文件,其文件头伪装成正常的上传文件类型。
4.文件加载检测:一般是调用API或函数去进行文件加载测试,例如图像渲染测试,当测试结果正常的时候才允许上传
- 一次渲染(代码注入)
- 二次渲染
5. 后缀名黑名单校验
6. 后缀名白名单校验
7. 自定义
WAF校验,即使用不同的WAF产品来进行过滤,通常是独立与服务程序的一段中间程序或者硬件
四、绕过方法
1.前端绕过
- 通过浏览器F12很简单的修改文件后缀名就可以完成绕过检查。
- 木马修改后缀名后上传,通过改包工具修改上传。
- 如果是JS脚本检测,在本地浏览器客户端禁用JS即可。可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现绕过。
准备一句话木马:
<?php @eval($_POST['cmd']); ?>
并且修改后缀名为jpg,上传操作,通过burpsuit抓包改包,使其后缀名修改回php。
2. 校验请求头content-type字段绕过
使用各种各样的工具(如burpsuite)强行篡改Header就可以,将Content-Type: application/php改为其他web程序允许的类型
3. 文件头检查文件
给上传脚本加上相应的幻数头字节就可以,php引擎会将 <?之前的内容当作html文本,不解释而跳过之,后面的代码仍然能够得到执行比如下面:
(一般不限制图片文件格式的时候使用GIF的头比较方便,因为全都是文本可打印字符。)
4.二次渲染绕过
往是在图片后头附件一段php代码,或者是改包发送一个图片马。但是如果使用了二次渲染。我们上传的文件名称会被修改,并且文件末尾段一些冗余的信息(一句话木马)会被删除。
所以很明显,我们只需要将我们需要写入的东西塞在图片中间(虽然会使图片损坏,但是我们又不需要图片。。),用winhex或者是010editor等在文件内进行修改即可。
————————————————
版权声明:本文为CSDN博主「Fasthand_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43390703/article/details/104858705
5.文件加载检测:
通过例如加载文件进行图像渲染的方式来测试,这个时候就一般需要在正常的文件中插入木马代码了,例如图像,那么插入的代码一般会放在图像的注释区,因此不会影响图像正常渲染绕过这种检测,此时可以使用工具(称为插马器)来进行插入,例如edjpgcom,或者直接用copy命令来合成也可以。当然这种检测不一定能够完全绕过
-
后缀名检测
后缀黑名单检测:找查blacklist(黑名单列表)的漏网之鱼,例如
-
大小写:如果检测的时候不忽略大小写,那么可以改变后缀名的大小写绕过
-
扩展名:列表中如果忽略了某些后缀
-
能被解析的文件扩展名列表:
-
jsp jspx jspf
-
asp asa cer aspx
-
php php php3 php4 pht
-
exe exee
-
-
后缀白名单检测:白名单检测还是会比黑名单强一点,常见的绕过方法有%00截断,还有服务器的解析漏洞
-
%00截断漏洞:如果存在这类漏洞,那么后缀名的检测都可以绕过,此时我们可以如下命名一个上传文件
test.php%00.jpg
-
解析漏洞:这类漏洞是本身服务器的中间件产生的,例如apache,nginx都被爆出过存在解析漏洞,存在解析漏洞的话,上传的安全性几乎就完全失去了,下面再详细分析。文件上传漏洞 )
五、文件防御
文件上传漏洞防御
- 首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
- 其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。
- 最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
防范文件上传漏洞常见的几种方法:
1.文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。2.判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。3.使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。4.单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
作者还是小白菜鸟阶段,文章总结有些不全,望见解,后续会逐渐完善
更多知识点详情请见: