一、文件上传漏洞介绍
1、文件上传:现代互联网的功能,允许用户上传图片、视频及其他类型文件,向用户提供的功能越多,Web受攻击的风险就越大。
二、文件上传漏洞
- 上传文件时,如果未对上传的文件进行严格的验证和过滤,就容易造成文件上传漏洞,上传脚本文件(包括asp、aspx、php、jsp等)
注:asp aspx对应IIS解析、php对应apache解析jsp对应java - 恶意上传行为:可能导致网站甚至整个服务器被控制。恶意的脚本文件又被称为WebShell、WebShell具有强大的功能,如查看服务器目录、服务器中文件、执行系统命令等
三、文件绕过
1.JS绕过
检测原理
(1)、调用JS的toLowerCaaw()函数,先将文件名转换为小写,然后通过substr获取文件名最后点号后面的后缀(包括点号)进行判断。
(2)、substr() //返回字符串
//enctype=“multipart/form-data” 专门处理文件上传的文件流
//return selectFile() 提供点击提交按钮,完成文件上传
1、第一种绕过方式
(1)代码
(2)、网站访问前端代码,进行浏览器前端绕过文件上传
按FN+F12调出控制台点击thml将onsubmit值修改为空。
详:通过F12打开开发者模块,将onsubmit的值删除,这里οnsubmit=""调用的函数即为我们编写的判断(过滤)方法。将此处值删除后再次点击上传我们想要上传的任意文件,观察实验。
上成功后,再URL中访问上传后的文件。
第二种:使用抓包修改进行绕过
1、使用burpsuit抓包,这里必须先上传jpg格式的文件
如果想上传php等其他类型的文件可以先修改文件后缀或者使用文件合成方法等抓包的时候修改回即可。
还有一种方式图片与代码合成,然后上传jpg后缀文件然后进行抓包修改后缀为.PHP放包即可
图片合成的方法:将需合成的文件放到一个文件目录下然后进入该目录输入cmd然后输入命令
copy 1.jpg + 2.php 3.jpg
文件1 + 文件2 合成文件3
注:这里将33.jpg文件后缀修改回.php后放包,文件即可成功上传。
2.文件后缀名绕过
1.检测原理
通过方法pathinfo()获取文件后缀,将后缀转为小写后判断是不是php文件。
注:pathinfo() //返回文件路径信息
2.修改配置文件绕过
- 有些中间件允许解析其他文件后缀的,如在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件。所以上传一个后缀名为php3、phphtml的文件即可绕过黑名单。
2、黑名单绕过
(1)前端代码
后端代码
(2)、网络访问我的前端代码,进行文件上传
**注:**这里我们尝试上传了html,txt等发现只有php无法上传,通过代码我们也知道此处php文件已经被加入黑名单,不允许后缀为php的文件上传。
3、畸形文件名上传绕过(还是使用上面的源码进行实验)
这里我们上传一个后缀名为php3的文件,如下图,我们发现上传成功,但是访
问该文件时,php文件未解析。
**注:**我们此模块的内容主要讲文件解析及上传,这里文件上传已经成功,接下来要做的就是文件解析。
4、修改httpd.conf配置文件
- (1)、有些中间件允许解析其他文件后缀的,如httpd.conf配置文件中,配置代码如下图,则能够解析php、php3、phtml文件。所以上传一个后缀名为php3、phtml的文件即可。
- 打开方式:phpstudy面板,点击【设置】->【配置文件】->【httpd.conf】->点击apache的版本 打开文件:
-
(2)、在文件处使用Ctrl+F进行查找,先查找AddType
如图:找到一下内容,在下面加入以下3条命令:
-
AddType application/x-http-php .php
-
AddType application/x-http-php .php3
-
AddType application/x-http-php .phtml
**注:**这里添加消息的含义是要能够解析php3,phtml 这里是将添加的这两种后缀按照php文件解析。
修改被指文件后,重启apache服务,重新访问刚才上成功的.php3文本,发现php3文件可以被正常解析。
5、绕过方法(apache解析漏洞)
(1)、结合Apache文件解析机制,从右向左开始解析文件后缀,若后缀名不可识别,则继续判断直到遇到可解析的后缀为止,若全部不认识,则会暴露文件内容。
6.绕过方法(windows特性:文件流绕过)
(1)、在程序开发部署的时候,没有考虑到系统的特性会导致限制被绕过,利用windows特性。可以在后缀名中加".“或”::$DATA"绕过。
过程略,绕过上传成功后文件根目录注意观察我们上传的文件的后缀。
抓包filename尾部添加::$DATA进行绕过
在浏览器中访问发现.过滤掉了,可以正常解析。
注:这里我们给文件名直接加. windows本身特性会自动删除,限制如此修改文件后缀,这里就需要使用burpsuit来进行修改。
2.文件类型绕过
1、检测原理
-
判断$_FILES[“file”][“type”]是不是图片格式(image/gif、image/jpeg、image/pjpeg),不是则不允许上传。
-
$_FILES[“file”][“type”]的值是从请求数据包中Content-type中获取的。
2、绕过方法一 -
通过抓取数据请求包,上传php文件时,Content-Type值为application/octer-stream,上传jpg的文件时Content-Type值为image/jpeg。可修改文件类型进行绕过。
3、绕过方法二 -
如果代码使用getimagesize()函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。
-
在图片文件脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码(这里就是第一种方式讲过图片+代码合成新图片的知识模块)
**(1)**这里我们将文件头部值写入文件即可
**注:**下图显示的47 49 46……这些是16进制数,可以通过01编辑器进行编辑,我们通过nt++编辑时可直接在代码前面编写GIF89a,我们可以通过编码转换进行验证。
**(2)**方法2 合成图片这种方法前面已经讲过,这里不再讲。下面再将一种方式.加粗样式
直接将图片使用记事本模式打开,在乱码后面直接加入我们需要加入的PHP代码。
**注:**这里我们修改完后文件后缀名依旧是.JPG 我们虽然修改了文件内容,但是上传成功后.JPG文件依旧无法解析。这里我们要将添加完代码的图片后缀名改为.php后再次上传,上传后即可实现解析。但这里操作没有方法1方便,操作时也可将合成图片上传后,在burpsuit中将后缀名改为php后放包,即可实现上传绕过,也可实现解析。
未结束…加粗样式