目录
漏洞原理
漏洞危害
利用场景
检测方法
防御方法
绕过手段
前端JS绕过
构造可解析后缀
修改Content-Type(MIME)
大小写绕过
文件头绕过
图片马
截断与特殊文件名
其他绕过
尝试绕过的步骤
漏洞原理
原理
-
攻击者构造恶意文件进行上传,而服务端没有对上传点进行合法性校验,攻击者能得知文件上传的位置,且文件能够被正确解析执行。如图所示:
漏洞危害
-
攻击服务器:可以通过上传和执行webshell来运行命令、浏览系统文件、甚至是接管服务
器。
-
攻击客户端:上传恶意文件还可能是的网站容易受到客户端攻击,例如xss或者劫持等。
-
上传的文件可能会触发实时监控工具中的漏洞。
-
上传功能可能触发程序报错、泄露敏感信息(暴露内部信息,比如服务器内部路径)。
-
上传功能可能被恶意利用,比如被用来托管恶意软件、非法软件或成人内容。上传的文件还可
能包含使用隐写术隐藏的数据。
上传具体文件可能带来的危害:
- 允许上传脚本语言文件且解析 ==> getshell
- 允许上传html ==> xss、csrf、登陆劫持...
- 允许上传压缩包 ==> 压缩包DOS、解压文件getshell
- 允许上传pdf ==> pdf xss
- 允许上传excel、docx ==> xxe
利用场景
一切有上传点的地方
- 更换头像,背景图片
- 上传附件
检测方法
寻找到注入点
根据功能点寻找、爆破上传接口、富文本编辑器上传等等
上传目标点不允许上传的文件
通过任意上传、绕过防御上传、绕过waf上传、条件竞争上传等方式上传目标文件
找到上传文件的路劲进行访问
服务端直接返回完整访问地址、返回部分需要拼接、爆破访问地址等方式
防御方法
1.后缀白名单(最有效直接),只允许上传服务端允许上传的文件
2.内容完整性检测,检查上传的文件是否包含恶意代码
3.检查是否可以找到上传的文件的访问路径,并检查是否可以直接访问或执行
绕过验证或者限制措施
- 检查网站是否仅在客户端js验证了文件类型
-
检查网站是否仅通过http请求中的“content-type”检查文件类型
-
检查网站是否仅通过文件扩展名来检查
绕过手段
前端JS绕过
构造可解析后缀
上传特殊可解析后缀,通过各语言可解析的后缀进行绕过上传(通常针对黑名单)
语言 | 可解析后缀 |
asp/aspx | asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr |
php | php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtm |
jsp | jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml |
修改Content-Type(MIME)
后端通过Content-Type来校验文件类型,抓包拦截修改Content-Type为其允许的文件即可(如图),常见类型见下
文件类型 | 后缀名 | Content-type |
超文本标记语言文本 | .html、.html | text/html |
普通文本 | .txt | text/plain |
RTF 文本 | .rtf | application/rtf |
GIF 图形 | .gif | image/gif |
JPEG 图形 | .jpeg、.jpg | image/jpeg |
au 声音文件 | .au | audio/basic |
MIDI 音乐文件 | mid、.midi | audio/midi、audio/x-midi |
RealAudio 音乐文件 | .ra、.ram | audio/x-pn-realaudio |
MPEG 文件 | .mpg、.mpeg | video/mpeg |
AVI 文件 | .avi | video/x-msvideo |
GZIP 文件 | .gz | application/x-gzip |
TAR 文件 | .tar | application/x-tar |
大小写绕过
将文件后缀进行大小写混写,如:Php、PHp、PHP/jSp、JSP、jsP等
文件头绕过
文件头,文件幻数是用来唯一标识文件类型的一系列数字(十六进制),也就是我们常说的文件头,当白名单限制了文件幻数时,我们就要给我们的文件制造可以通过检测的文件头即可,常见对应文件的值如下:
.jpg | Value = FF D8 FF E0 |
.gif | Value = 47 49 46 38 ==> GIF89a |
.png | Value = 89 50 4E 47 |
.html | Value = 68 74 6D 6C 3E 10 |
.xml | Value = 3C 3F 78 6D 6C |
使用Winhex打开一张图片即可查看,也可进行修改,如下图:
图片马
图片马:如果后缀可以为jsp、php等,但是内容必须为图片,那么可以用图片马来进行getshell,常用的生成手法如下
在cmd中
copy test.gif/b+test.php/a gifshell.gif
- /b是二进制形式打开
- /a是ascii方式打开
截断与特殊文件名
截断:
0x00截断绕过:文件名后缀有一个%00字节,可以截断某些函数对文件名的判断。在许多语言函数中,处理字符串的函数中0x00被认为是终止符。
例如: 网站上传函数处理xxx.asp%00.jpg时,首先后缀名是合法的jpg格式,可以上传,在保存文件时,遇到%00字符丢弃后面的.jpg,文件后缀最终保存的后缀名为xxx.asp
截断条件:
php版本小于5.3.4 详情关注CVE-2006-7243
php的参数开关上设置里magic_quotes_gpc为OFF状态
特殊文件名:
特殊文件名绕过,在Windows下有一个特性就是如果文件后缀以点‘.’或者空格‘ ’结尾的后缀名时,系统在保存文件时会自动去除点和空格。但要注意 Unix/Linux 系统没有这个特性。因为有些服务器端的后缀名检测是取文件名最后一个.后面的字符串,拿这个字符串与黑名单列表对比
如下图:
其他绕过
1、条件竞争:如果网站的文件上传的过程是:“服务器获取文件–>保存上传临时文件–>重命名移动临时文件” 这样的步骤时,就可以通过不断地对文件进行上传和访问,从而使服务器还未重命名移动临时文件时,我们就利用时间差打开了文件,成功执行其中的恶意代码。
2、双后缀绕过,顾名思义,写两个后缀可能指检测到去掉一个
尝试绕过的步骤
根据网站时由什么语言开发。则上传什么脚本语言
1、前端绕过
2、黑名单绕过
3、白名单绕过
4、其他方式,竞争上传、双上传、文件内容等