文件上传绕过
Posted 会上树的老张
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传绕过相关的知识,希望对你有一定的参考价值。
1、绕过前端js检测
(1)将要上传的php文件改成jpg或在其他允许上传的文件格式,抓包,在bp里面将格式改回php
(2)F12查看源代码,将判断文件格式的函数删除
2、绕过content-type检测上传
上传脚本文件,抓包将content-type改成image/jpeg或其他允许上传的文件格式即可绕过上传
3、绕过黑名单上传
上传黑名单以外的后缀名,在iis里asp禁止上传了,可以上传asa、cer、cdx这些后缀,如果网站允许.net执行,可以上传ashx代替aspx。
在apache里如果开启了application/x-http-php,后缀名phtml、php3均被解析成php
4、htaccess重写解析绕过
如果黑名单过滤了所有可执行的后缀名,如果允许上传.htaccess文件。此文件可以实现:文件夹密码保护、用户自动重定向、自定义错误页面、改变文件扩展名、封禁特定ip地址的用户、只允许特定ip地址用户、禁止目录列表,以及使用其他文件作为index文件等功能。
在htaccess里写入SetHandler application/x-httpd-php可以重写成php文件。要htaccess的规则生效,需要在apache开启rewrite重写模块,大多数都是开启了这个模块的
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
先上传后缀改成jpg的恶意文件,再上传htaccess,就会将jpg后缀名改成php
5、大小写绕过
后缀名 Php、pHp、phP、PhP、PHp、PHP等
6、空格绕过
上传模块中采用黑名单上传,没有对空格进行去掉就可能被绕过
抓包在后缀加空格即可
7、利用windows系统特征绕过
(1)在windows中文件后缀名,系统会自动忽略. 所以shell.php.和shell.php的效果一样。
(2)如果后缀名没有对::$DATA进行判断,利用windows系统NTFS特征可以绕过上传,抓包将恶意文件后缀改成
.php::$DATA
8、利用windows环境叠加特征绕过
在windows中上传文件名name.php:.jpg的时候,会在目录下产生空白的文件名name.php
再利用php和windows环境叠加属性
以下符号再在正则匹配时相等
" 等于 .
> 等于 ?
< 等于 *
上传jpg文件,抓包,文件后缀改成name.php:.jpg,会在目录下生成一个name.php的文件,回到bp,后缀改成name.>>>然后将要写入的内容写在下方
9、双写后缀名绕过
有些会把黑名单后缀名替换成空,使用双写,asaspp、pphphp即可绕过
10、目录可控%00 截断绕过
上传参数目录可控攻击:在gpc关闭,php版本小于5.3.4的情况下,可以用%00对目录或文件名进行截断
上传后缀名为jpg的恶意文件,抓包,在路径上增加name.php%00
目录可控post绕过:上面时Get请求的,可以直接在URL输入%00即可截断,但是在post下需要把%00解码编程空白符才有效
上传后缀名为jpg的恶意文件,抓包,在路径上增加name.php%00,将%00转换成URl-decode
11、文件头检测绕过
1、制作图片一句话木马,使用copy name1.gif/b +name2.php shell.php,将php文件附加在gif图片上直接上传即可,上面的命令时将两个文件附加在一起形成新的文件,再将形成的文件改成能上传的后缀即可
2、上传脚本,抓包,在上传的数据包头加上能上传的文件的文件头即可
常见的文件头:jpg = FFD8FF png = 89504E47
gif = 47494638 tif = 49492A00 bmp = 424D
12、图片检测函数上传
getimagesize是获取图片的大小,只有是图片才能上传,用图片马绕过
13、绕过图片二次渲染上传
首先判断是否允许上传gif,gif图片在二次渲染后与原图片差别不大,所以二次渲染攻击最好用gif图片马,使用HxDHexEditor工具,用工具打开原图与二次渲染后的图片,在对应文本中对比下相同的地方,在相同的地方写入一句话木马覆盖
14、文件名可控绕过上传
文件上传时,文件名可被客户端修改控制,导致漏洞产生
1、上传文件,文件名用%00截断,例如1.php%00.jpg截断后成1.php
2、与中间件的漏洞配合使用,iis6.0里1.php;1.jpg apache里 1.php.a也能解析文件,也可以使用/. ,抓包在文件名后面加/.也可绕过
15、数组并接绕过
16、文件上传其他漏洞
在nginx 0.83 里,1.jpg%00php
apache 1x或者2x里,当apache遇到不认识的后缀名,就会向前解析,例如a.php.rar,不认识rar就会向前解析,直到它认识的后缀名
phpcgi漏洞(在nginx iis7或者以上)上传图片1.jpg。访问1.jpg/1.php也会解析成php
apache HTTPD换行解析漏洞(CVE-2017-15715)
apache通过mod_php来运行脚本,其2.4.0-2.4.29中存在apache换行解析漏洞,在解析php时,xxx.php\\0xA将被按照php后缀进行解析
17、文件上传漏洞检测方法
判断是否为黑白名单,如果时白名单,寻找可控参数。如果是黑名单禁止上传,可以用有危害的后缀名批量提交测试,寻找遗留的执行脚本
.php
.php5
.php4
.php3
.php2
.html
.htm
.phtml
.pht
.pHp
.phP
.pHp5
.pHp4
.pHp3
.pHp2
.Html
.Htm
.pHtml
.jsp
.jspa
.jspx
.jsw
.jsv
.jspf
.jtml
.jSp
.jSpx
.jSpa
.jSw
.jSv
.jSpf
.jHtml
.asp
.aspx
.asa
.asax
.ascx
.ashx
.asmx
.cer
.aSp
.aSpx
.aSa
.aSax
.aScx
.aShx
.aSmx
.cEr
.sWf
.swf
.htaccess
抓包,将后缀名设置成变量,加上面后缀名设置成字典批量测试
18、文件上传防御方法
服务器使用白名单防御,修复中间件的漏洞,禁止客户端存在可控参数,设置存放目录禁止脚本执行,限制后缀名
文件上传骚姿势合集
目录
也可以使用phpinfo.php:$DATA 命令上传并创建空白文件
黑名单规则绕过
绕过前端 js 检测方法
判断是否为前端检测还是后端服务器检测方法
前端绕过,我们可以通过浏览器中F12进入开发者模式修改前端代码
或者
上传一个jpeg等image格式的后缀,里面内容是恶意代码,通过BP抓包修改jpeg为.php后缀;达到绕过前端规则的目的
绕过 contnet-type 检测上传
对于一些上传模块,会对http类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败
因为服务器端是通过content-type判断类型,content-type在客户端可被修改。所以此文件上传也有可能被绕过风险
抓包修改content-type类型为后台允许的类型image/jpeg
在repeater中,方便查看响应包及其上传后的大马路径
通过在浏览器中输入大马所在路径,发现后台成功解析
常见MIME类型
超文本标记语言 .html | text/html |
---|---|
普通文本 .txt | text/plain |
RTF 文本 .rtf | application/rtf |
GIF 图形 .gif | image/gif |
PNG图形 .png | image/png |
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、asp等提示则判断为黑名单限制)进行检测,如果后缀名在黑名单列表内,则禁止上传改文件
上传黑名单以外的后缀名即可。
在 iis 里 asp 禁止上传了,可以上传 asa cer cdx 这些后缀,如在网站里允许.net执行,可以上传 ashx 代替 aspx。如果网站可以执行这些脚本,通过上传后门即可获取 webshell。
在不同的中间件中有特殊的情况,如果在 apache 可以开启 application/x-httpd-php
在 AddType application/x-httpd-php .php .phtml .php3
后缀名为 phtml 、php3 均被解析成 php 有的 apache 版本默认就会开启。
上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3。
此时我们上传一个后缀为php3的shell文件,发现后台成功上传且解析(另外在windows下搭建环境的话需要php为5.2.x的版本)
同解析后缀名
. htaccess 重写解析绕过上传
在文件上传处,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess
.htaccess文件的作用是 可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定 IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能。
在 htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文件。
要 htaccess 的规则生效 则需要在 apache 开启 rewrite 重写模块,因为 apache是多数都开启这个模块,所以规则一般都生效
本地创建.htaccess文件并将如下内容加入其中(意为上传的png图片,并且通过处于相同目录下的htaccess文件会将png文件当做php执行脚本去解析)
<FilesMatch 'png'>
SetHandler application/x-httpd-php
</FilesMatch>
之后将编辑好的.htaccess文件上传到后台
接下来上传内置好PHPinfo函数的图片,看是否后台能解析
大小写绕过上传
后台若是没有对上传的后缀名的大小写进行严格判断,导致可以更改后缀大小写可以被绕过。如 PHP、 Php、 phP、pHp
通过查看黑名单,发现phP没有禁止,我们尝试上传
空格绕过
如果文件名后缀没有过滤空格的话,我们可以抓包通过空格进行绕过
利用 windows 系统特征绕过上传
在win系统中,系统对文件名后缀有点的,比如.php.会把最后的点忽略系统最终解析为.php;因此针对于windows系统可以尝试后缀加点进行绕过
::$DATA (NTFS 交换数据流)绕过上传
如果后缀名没有对::$DATA 进行判断,利用 windows 系统 NTFS 特征可以绕过上传。
::$DATA # 其中一个冒号表示创建文件,两个冒号表示写入文件内容
利用 windows 环境的叠加特征绕过上传
在 windwos 中如果上传文件名 shell.php:.jpg 的时候,会在目录下生产空白的
文件名 shell.php
再利用 php 和 windows 环境的叠加属性,
以下符号在正则匹配时相等
双引号" 等于 点号.
大于符号> 等于 问号?
小于符号< 等于 星号*
文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名
先上传一个jpg文件,内置phpinfo函数
抓包修改后缀为ggbond.php:.jpg后发包,此时服务器已经创建了ggbond.php空白文件
接下来继续在repeater模块中操作
请求包中修改文件名为ggbond.>>>其中三个大于号表示匹配后面三个后缀并将内容写入到匹配的文件中
也可以使用phpinfo.php:$DATA 命令上传并创建空白文件
之后如何写入内容,同上
双写后缀名绕过
有的代码会把黑名单后缀名替换成空 $file_name = str_ireplace($deny_ext,"", $file_name);(str_ireplace则为此作用)
比如a.php会被后台将php替换为空,此时我们可以使用双写绕过
例如pphphp等绕过限制
白名单规则绕过
上面都是黑名单绕过姿势,如果黑名单上传检测后,没有限定后缀名,绕过的方法很多;
接下来就开始针对于白名单规则的一个绕过姿态,相对于黑名单而言,白名单较为安全,但是有可控的参数目录,也存在被绕过的风险
目录可控%00 截断绕过上传
PHP版本<5.3.4
关闭magic_quotes _gpc(magic_quotes _gpc=OFF)
代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是$_GET['save_path']服务器接受客户端的值,这个值可被客户端修改。所以会留下
安全问题。
在URL请求行中构造payload
../upload/ggbond.php%00
当ggbond.php%00和maggbond.jpg拼接之后在后端会被最终识别为ggbond.php(%00后面内容会被截断不会读取)
目录可控 POST 绕过上传
上面是 GET 请求的,可以直接在 url 输入%00 即可截断,但是在 post 下直接注入%00 是不行的,需要把%00 解码变成空白符,截断才有效。才能把目录截断成文件名。
第十二关代码同样是白名单限制后缀名,$_POST['save_path']是接收客户端提交的值,客户端可任意修改。所以会产生安全漏洞。
在请求体中对1构造的payload的%00进行编码绕过
成功上传
文件头检测绕过上传
有的文件上传,上传时候会检测头文件,不同的文件,头文件也不尽相同。常见的文件上传图片头检测 它检测图片是两个字节的长度,如果不是图片的格式,会禁止上传。
常见的文件头
- JPEG (jpg),文件头:FFD8FF
- PNG (png),文件头:89504E47
- GIF (gif),文件头:47494638
- TIFF (tif),文件头:49492A00
- Windows Bitmap (bmp),文件头:424D
将内置函数放入动图gif中(下面copy命令在windows的DOS命令行中执行生成)
copy 3.gif/b+phpinfo.php dt.gif
查看恶意gif文件是否成功创建
上传恶意gif文件并且复制上传后的gif文件路径
在文件包含漏洞处对其上传恶意文件进一步读取
成功解析
文件头检测绕过上传方法二
直接上传phpinfo文件,在抓取的数据包中手工写入符合需求的文件头
接着通过文件包含漏洞成功解析phpinfo动态脚本
图片检测函数绕过上传
getimagesize 函数是获取图片的大小,如果头文件不是图片会报错直 接可以用图片马绕过检测
方法可直接用上面上传gif恶意文件方法绕过,下面我再通过jpg文件型图片马进行演示
接着通过文件包含漏洞解析成功
uploadlabs第十五关时候phpstudy需要开启exif服务,如下图;之后绕过方法同上
绕过图片二次渲染上传
有些图片上传,会对上传的图片进行二次渲染后在保存,体积可能会更小,图片会模糊一些,但是符合网站的需求。例如新闻图片封面等可能需要二次渲染,因为原图片占用的体积更大。访问的人数太多时候会占用很大带宽。二次渲染后的图片内容会减少,如果里面包含后门代码,可能会被省略。导致上传的图片马,恶意代码被清除。
首先判断图片是否允许上传git文件;gif 图片在二次渲染后,与原图片差别不会太大。一般针对于二次渲染攻击最好用gif图片马
将原图片上传,下载渲染后的图片进行对比(原图会动,渲染后的新图片不会动了),找相同处,覆盖字符串,填写一句话后门,或者恶意指令
成功解析上传的二次渲染gif文件
文件名可控绕过上传
文件上传时,文件名的可被客户端修改控制,会导致漏洞产生。
%00截断
%00截断需要gpc关闭
php 版本小于 5.3.4
Nginx0.83
成功上传
分号;截断
;截断需要1在IIS6.0环境中才能绕过
/、绕过
杠点绕过,无版本限制条件
与中间件漏洞配合绕过
apache 1.x/2.x 遇到不认识的后缀名会先从后向前解析,具体分析如下
phpinfo.php.a 与apache中间件漏洞配合可以上传,但是是否能解析需要看相应中间件版本
phpinfo.php.a 会被中间件从右向左解析为a.php
数组绕过上传
有的文件上传,如果支持数组上传或者数组命名。如果逻辑写的有问题会造成安全隐患,导致不可预期的上传。这种上传攻击,它是属于攻击者白盒审计后发现的漏洞居多。
总结
判断是否为黑白名单,如果是白名单 寻找可控参数。如果是黑名单禁止上传,可以用有危害的后缀名批量提交测试,查找未加入黑名单的执行脚本。
防御手段
-
通过服务器后端对上传的⽂件进⾏过滤,防⽌本地⽂件上传限制被绕过
-
及时查看最新公布漏洞通告,如果服务器中涉及相关组件,要及时更新补丁包
-
对⽂件上传的⽬录进⾏控制,设置为不可执⾏ 。只要保证web容器⽆法解析该⽬录下⾯的⽂件,即使攻击者上传了脚本⽂件,服务器不对其进⾏解析,⽊⻢ 等也不会⽣效。
-
对上传⽂件类型进⾏判断。可以结合使⽤MIME Type、后缀检查等⽅式。在⽂件类型检查中,尽量使⽤⽩名单⽅式,⿊名单和前端都属于不可靠的。
-
使⽤随机数改写⽂件名和⽂件路径 。⽂件上传如果要执⾏代码,则需要⽤户能够访问到这个⽂件。在某些环境中,⽤户可以进⾏病毒⽊⻢等有害⽂件上传,但如果应⽤随机数改写了⽂件名和路径,攻击者在不知道程序源码情况下不了解随机数等规则,即不知道⽂件名称就不能访问。还有像shell.php.rar.rar 和crossdomain.xml 这种⽂件,都将因为重命名⽽⽆法攻击。
-
单独设置⽂件服务器的域名,⼀般信息搜集过程中都会进⾏的⼀项就是旁站和C端的收集,如果⽂件服务器和主站等在同⼀域名下,浏览器同源策略的关系,有可能攻击者通过⼀个点进⾏整体环境服务器的渗透。在单独设置⽂件服务器之后,⼀系列客户端攻击将失效,⽐如上传 crossdomain.xml、上传包含Javascript 的 XSS 利⽤等问题将得到解决。
以上是关于文件上传绕过的主要内容,如果未能解决你的问题,请参考以下文章