什么是文件上传漏洞
上传文件时,如果服务器代码未对客户端上传的文件进行严格的验证和过滤,就容易造成可以上传任意文件的情况,包括上传脚本文件(asp、aspx、php、jsp等格式的文件)
主要危害
上传网站后门文件
前端绕过主要依赖于修改或绕过客户端的JavaScript验证。JavaScript的验证通常较为简单,容易被绕过。
1、删除浏览器事件:直接删除或禁用浏览器中的JavaScript,从而避免执行前端的验证代码。
2、Burp Suite抓包修改:使用Burp Suite等网络抓包工具,拦截并修改上传文件的HTTP请求,包括文件后缀名等。
3、构造本地上传表单:创建一个新的HTML表单,绕过原有的前端验证页面,直接提交文件到服务器。
Web系统可能会采用黑名单的方式进行过滤。而过滤的方式存在一定的缺陷,比如存在过滤的黑名单不全,未考虑大小写,以及要上传文件的名称存在敏感字符。基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。使用黑名单过滤方式,肯定会存在缺陷;【对上传文件名称进行敏感字符清除。】
利用服务器解析漏洞,上传一些看似不合法的文件后缀如.php5、.phtml等,这些文件在某些配置下可能会被当作PHP代码执行。
前提条件
在apache配置文件中有如下配置:
AddHandler application/x-httpd-php .php .php3 .php4 .php5 .phtml
当然防御也就是将上面这句配置修改为:
AddHandler application/x-httpd-php .php
通过Burp抓包
在文件后缀名中添加空格或点(.),如file.php. file.php 或者file.php. .,有时服务器会忽略这些字符。
空格绕过
文件上传功能过滤不完善,没有考虑到空格的情况,将文件【shell.php(空格)】认为是以(空格)结尾的特殊文件,允许上传,当文件成功上传到windows系统下时,因为Windows系统特性会被作为空处理,也就是删除文件最后的空格,结果为【shell.php】
点饶过
windows特性,只能在Windows系统下生效;
- Windows 系统下,文件后缀名最后一个点会被自动去除。
- Linux 系统下,文件后缀名最后一个点不会被自动去除。
点空格点
上传如file.phphpp的文件,服务器在处理时可能将php替换成空,从而保留.php后缀。
同样双写也适用于绕过XSS漏洞
上传File.PhP等大小写混合的文件名,如果服务器在过滤时没有进行大小写统一处理,则可能绕过过滤。
同样大小写也适用于绕过XSS漏洞
通过上传.htaccess
文件,修改服务器配置,使特定类型的文件被当作PHP代码执行
什么是.htaccess文件
.htaccess 文件是Apache服务器中的一个配置文件,用于实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
准备一个名为.htaccess的文件,文件内容
AddType application/x-httpd-php .png
或者
<FilesMatch "文件名">
SetHandler application/x-httpd-php
</FilesMatch>
利用思路:第一步:将.htaccess文件进行上传 第二步:上传后缀名为.png的图片马
在window的时候如果文件名+"::会把DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。基于widows系统文件命名规则的特殊利用 。
例如:"phpinfo.php::会自动去掉末尾的DATA变成"phpinfo.php"
所以知道这个特性之后,我们就可以抓包修改文件名:+::$DATA即可
MIME类型(也称为媒体类型或内容类型)用于标识文件的性质和格式。通过修改文件的MIME类型,较为少见
常见图片MIME类型: image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
服务端代码是通过Content-Type的值来判断文件的类型,这样我们可以直接对文件的Content-Type进行修改来绕过此防御方式
分为GET和POST两种方式进行阶段截断
在url中%00表示ascll码的0 ,而ascii码的0,表示字符串结束,所以当url中出现%00时就会认为读取已结束
产生的条件
举例:
www.xxx.com/shell.jpg
www.xxx.com/shell.php%00.jpg => www.xxx.com/shell.php
GET类型的%00截断
POST类型的%00截断
同%00截断原理相同
对于基于文件内容检查(如图片马)的上传过滤,可以通过在合法文件(如图片)中嵌入恶意代码来绕过。这种方法需要服务器在处理文件时未进行充分的渲染或过滤
文件头检测通过读取上传文件的前几个字节(通常是文件的前几个字节,也称为“魔术数字”或“文件签名”),并与已知的文件类型签名进行比较,以确定文件的真实类型。这种方法比简单地检查文件扩展名更为可靠,因为文件扩展名可以轻易地被修改。
1.1制作图片马来绕过
图片码制作比较简单。需要一张真的图片,需要一个后缀为php的木马文件,然后将图片和php文件组合在一起即可。准备一张图片和一句话木马:
ime 1.png
shell.php
然后在cmd中执行:
copy 1.png /b + shell.php shell.png
1.2文件头绕过
常见文件头
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
XML (xml),文件头:3C3F786D6C
ZIP Archive (zip),文件头:504B0304
利用思路
1、先将一句话木马写入txt文件,改文件后缀为png格式;
2、用winhex打开,找到你所改成图片的文件头(例如我想改成的是png格式,也可以jpg等,png图片的格式头是89504E47),只要将其放在文件头部(也就是放在一句话的前面),保存即可。
3、上传,用bp抓包,然后修改文件后缀为.php格式,放包即可,用蚁剑连接即可
什么是二次渲染
在用户上传文件后,网站为了满足特定的显示或存储需求,会对文件(尤其是图片文件)进行二次处理。这些处理可能包括格式转换、尺寸调整、压缩等。服务器在处理完成后,会根据用户上传的原始文件生成一个新的文件,并将其用于显示或存储。
2.1、修改内容:把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,再重新上传即可绕过。
使用使用HxD Hex Editor进行比较
2.2、条件竞争
利用思路:直接上传一个php文件,利用burp抓包,然后跑一个Nullpayloads,不停的访问,赶在应用程序删除它之前,访问成功。
2.3、配合文件包含漏洞
利用思路:
1、攻击者首先制作一个包含恶意代码的图片文件(图片马),
2、然后将其上传至网站。网站对图片进行二次处理后,恶意代码可能会被保留在图片的某些部分中。
3、攻击者随后利用文件包含漏洞来包含并执行这些恶意代码。
1.php.jpg
的文件名,利用Apache的解析漏洞将.php
文件当作PHP代码执行。xxx.asp;xxx.jpg
时,IIS可能会将其当作ASP文件执行