对文件上传绕过方式和解析漏洞的概念性总结。文件上传部分总结自upload-labs,中间件解析漏洞复现使用vulhub环境。
c0ny1/upload-labs
vulhub
客户端
js检查
服务端
检查后缀
黑名单
上传特殊可解析后缀
上传
上传
后缀大小写绕过
点绕过
空格绕过
配合解析漏洞
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
Apache HTTPD 多后缀解析漏洞
Nginx 解析漏洞
IIS7.5解析漏洞
IIS6解析漏洞
双后缀名绕过
白名单
MIME绕过
截断
截断
截断
检查内容
文件头检查
突破getimagesize()
突破exif_imagetype()
二次渲染
其他
条件竞争
客户端
在console中,破坏函数/修改js添加白名单/删除js黑名单。
使用浏览器插件禁用js。
拦截数据包修改。(如果能够拦截到数据包,说明已经通过前端检测了!)
服务端
黑名单
黑名单规则不严谨,在某些特定的环境中,某些特殊的后缀名仍然会被当做php文件解析。
比如,黑名单禁止上传.asp|.aspx|.php|.jsp后缀文件。
但是Apache的httpd.conf配置文件中,有这样一行内容:
这里上传、、后缀的文件都可以当做php文件来执行。
在Apache里,是一个配置文件。它可以用来控制所在目录的访问权限以及解析设置。可以通过修改该文件的配置项,将该目录下的所有文件作为php文件来解析。
可以写入apache配置信息,改变当前目录以及子目录的apache配置信息。
应用场景:黑名单没有禁止文件上传。
绕过 *** :首先上传一个文件,文件内容如下。如果Apache允许文件生效,并且文件没有被重命名。那么就可以改变当前目录以及子目录的Apache配置信息,将其他后缀的文件作为PHP文件解析。
服务端允许文件生效,需要在中,修改两处配置项:
Apache加载rewrite模块
(默认为None)
文件中有两种写法
<FilesMatch "xxx.png">
SetHandler application/x-httpd-php
</FilesMatch>
xxx.png即可作为php脚本解析
或者是
AddType application/x-httpd-php .gif
.gif为后缀额度文件都当做php解析
应用场景:没有将文件后缀统一转换为大写或者是小写,而黑名单不严谨。
绕过方式:大小写绕过
比如:禁止上传后缀文件,但是没有使用函数。
应用场景
服务器脚本语言为PHP,并且使用CGI/FastCGI模式,php版本>5.3.0
上传目录下要有可执行的php文件
,它会影响中的配置,从而将指定的文件内容按php来解析,影响的范围该文件所在的目录以及子目录。需要等待中的设置的时间或重启Apache才能生效,且只在php5.3.0之后的版本才生效。比用的更广,不管是,只要是以运行的php都可以用这个办法。如果使用Apache,则用文件有同样的效果。
注意:只能用于Apache。
在中,有两个新的INI指令
; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
; 用户自定义的php.ini文件的名字,默认是.user.ini
user_ini.filename=".user.ini"
?
; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes)
; 重新读取用户INI文件的时间间隔,默认是300秒(5分钟)
user_ini.cache_ttl=300
大致意思是:我们指定一个文件(如,xxx.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:
这两个设置的区别只是在于是在文件前插入;在文件最后插入(当文件调用时该设置无效)。
利用 *** :
可以上传一个这样的
auto_prepend_file=xxx.jpg
然后再上传一个图片马
<script language='php'>system('whoami');</script>
如果在上传目录中还有一个可执行的php文件,访问php文件,就达到了执行系统命令的效果。
总结一下:上传目录中有一个可执行的php文件,我们先上传一个文件,这个文件的内容为。起到的作用相当于在可执行的php文件前插入图片马中的内容。然后图片马中的恶意代码也会被当做PHP解析。
利用Windows对于文件和文件名的限制,以下字符放在结尾时,不符合操作系统的命名规范,在最后生成文件时,字符会被自动去除。
上传文件名 | 服务器文件名 | 说明 |
---|---|---|
file.php[空格] | file.php | |
file.php[.] | file.php | 无论多少个.都可以 |
file.php[%80-%99] | file.php | Burp抓包,在文件名结尾输%80,CTRL+SHIFT+U进行URL-DECODE,或者增加一个空格,再在HEX视图中把20修改为80 |
上传文件名 | 服务器生成文件名 | 内容 |
---|---|---|
file.php::$DATA | file.php | file.php中的实际内容 |
file.php::$DATA...... | file.php | 实际 |
应用场景:服务器为Windows平台,在对用户上传的文件名进行处理时,没有使用函数去除字符串收尾处的空白字符。
利用方式:用户上传图片马时,用Burp拦截,在文件尾部加入空格。例如:。带有空格的后缀可以绕过黑名单的检测,而文件存在在Windows服务器上,会自动去除后缀中的空格。
应用场景:Windows平台,服务端没有使用删除文件名末尾的点。
利用方式:上传名为的文件。在Windows服务器中,后缀名之后的点,在保存时,会被自动忽略。
应用场景:Windows平台,没有使用将替换为空,导致可以利用NTFS文件流特性。
利用方式:
假设xxx.php的内容为
上传的文件名 | 服务器表面现象 | 生成的文件内容 |
---|---|---|
xxx.php:a.jpg | 生成xxx.php | 空 |
xxx.php::$DATA | 生成xxx.php | |
xxx.php::$INDEX_ALLOCATION | 生成xxx.php文件夹 | |
xxx.php::$DATA.jpg | 生成0.jpg | |
xxx.php::$DATA\aaa.jpg | 生成aaa.jpg |
这里,我们上传一个名为的木马,然后,在浏览器中访问。
应用场景:黑名单、使用将匹配到的黑名单中的内容替换为空。
利用方式:因为仅将黑名单中的内容一次替换为空,可以重写绕过。
这里的部分解析漏洞使用vulhub的环境进行复现。
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
在index.php中,使用了黑名单对文件后缀进行检测
?if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
? ? ?exit('bad file');
}
上传一个名为1.php的文件,被拦截
在1.php后面插入一个(注意,不能是,只能是一个),不再拦截:
社区版Burp点击1.php后面的一个字节,然后右键->。再将插入的00修改为0a。
访问刚才上传的,发现能够成功解析,但是这个文件的后缀不是php后缀,说明目标存在解析漏洞:
Apache HTTPD 多后缀解析漏洞
Apache HTTPD支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如,如下配置文件:
AddType text/html .html
AddLanguage zh-CN .cn
其给增加了一个media-type,值为;给后缀增加了语言,值为。此时,如果用户请求文件,它将会返回一个中午的html页面。
以上就是Apache多后缀的特性。如果运维人员给后缀增加了处理器:
AddHandler application/x-httpd-php .php
那么,在有多个后缀的情况下,只要有一个文件含有后缀即将被识别为PHP文件,没有必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。
访问上传目录,即可发现,phpinfo被执行了,该文件被解析为php脚本。
上传完成后并未重命名。可以通过上传文件名为或的文件,利用Apache解析漏洞getshell。
Nginx 解析漏洞复现
版本信息:
Nginx 1.x 最新版
PHP 7.x最新版
由此可知,该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
访问和即可查看效果。
增加后缀,被解析为PHP文件:
访问可以测试上传功能,上传代码不存在漏洞,但利用解析漏洞即可getshell:
使用命令行生成图片马
中的内容
copy Koala.png/b+1.php/a shell.png
上传shell.png后,成功访问,在后面加上getshell。
Web中间件漏洞总结之IIS漏洞
环境:
Microsoft-IIS/7.5
PHP 5.4.45
Windows Server 2008 R2
利用条件:
Fast-CGI运行模式
php.ini里
取消勾选程序的"invoke handler only if request is mapped to"。也就是取消勾选模块映射中的请求限制。
利用方式:在上传的文件名后面加上,可以被作为PHP文件解析。
漏洞修复:
限制上传的脚本执行权限,不允许执行脚本
将php.ini的
在模块映射中勾选请求限制
编辑器漏洞手册
Web中间件漏洞总结之IIS漏洞
环境:
Microsoft-IIS/6.0
Windows 2003
路径解析
原理:在、目录下的任意文件都会以格式解析
文件解析(截断)。
原理:在IIS 6.0下,服务器默认不解析后面的内容。
上传会被解析为asp。
解析文件类型
原理:IIS 6.0默认的可执行文件除了还包含、、,会将这三种扩展名文件解析为asp文件。
FCKeditor 查看编辑器版本
FCKeditor V2.6.6版本
FCKeditor/editor/filemanager/connectors/asp/config.php
这里FCKeitor的版本较新,也就不能利用IIS6中截断的漏洞。
路径解析:
FCKeditor查看文件上传路径
上传路径为
利用2003路径解析漏洞上传木马
漏洞描述:利用系统2003路径解析漏洞的原理,创建类似的目录,再在此目录中上传文件即可被脚本解析器以相应脚本权限执行。
强制建立shell.asp目录:
建立的shell.asp目录的路径为
上传图片马到shell.asp目录下就可以。可以使用冰蝎server中的shell.asp,将后缀改为png。上传的shell.png到shell.asp目录下会被解析为asp脚本,用冰蝎连接。
上传路径在:
防御:
限制上传的脚本执行权限,不允许执行脚本
对新建目录文件名进行过滤,不允许新建包含的文件
不允许新建目录
过滤,通过组件过滤
白名单
MIME类型是描述消息内容类型的因特网标准。
HTTP头部的Content-Type字段的内容就是MIME类型。
只需要将MIME类型修改为白名单中允许的类型即可。
比如,图片上传点,允许上传gif、jpeg、png。用Burp抓包,将HTTP头部的Content-Type字段内容修改为:
或或
%00是chr(0),空字符。
程序会把%00当做结束符,后面的数据直接忽略掉。
在文件上传中,利用%00截断,在文件扩展名验证时,是取文件的扩展名来验证,但是最后文件保存在本地时,%00或截断文件名,只保存%00之前的内容。
应用场景:白名单、上传路径可控、php.ini中的为off
利用方式:
如果上传文件的路径为:用户可控的上传路径/随机数.白名单中的后缀
正常情况下,服务器拼接得到的上传路径为:
而用户在可控的上传路径中,使用后,拼接得到的上传路径为:
对后缀进行白名单检测,为gif。但是保存在服务器上的文件,却是,因为%00之后的内容被截断了。
条件:php版本<5.3.4、php.ini中的设置为off、上传路径可控、白名单
利用方式:
如果上传文件的路径为:用户可控的上传路径/随机数.白名单中的后缀
正常情况下,服务器拼接得到的上传图像地址为
但是,用户如果在可控上传路径中写入一个php后缀,并且php后缀后面有一个字符
服务器拼接得到的上传图像地址会变为
对后缀进行白名单检测,为gif。但是保存在服务器上的文件,却是,因为之后的内容被截断了。
原理同上
检查内容
上传具有正常文件头的图片马即可。
的文件头为;的文件头为;的文件头为
此时如果不存在上述的漏洞,只能上传图片格式的后缀,还需使用文件包含漏洞运行图片马中的恶意代码。
函数会返回一个数组,其中下标2是图像的类型。1=GIF,2=JPG, 3=PNG。这里上传一个正常图像后缀的图片马,使用文件包含漏洞运行图片马中的恶意代码即可。
— 判断一个图像的类型。检查图像的之一个字节。可能返回的常量有;;;文件头不正确返回false。
上传具有正常文件头的图片马即可。
的文件头为;的文件头为;的文件头为。然后使用文件包含漏洞运行图片马中的恶意代码。
gif:找到渲染前后没有变化的位置,将PHP代码写进去。
png:写入IDAT数据块
使用脚本生成图片马
<?php
$p=array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
? ? ? ? 0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
? ? ? ? 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
? ? ? ? 0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
? ? ? ? 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
? ? ? ? 0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
? ? ? ? 0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
? ? ? ? 0x66, 0x44, 0x50, 0x33);
$img=imagecreatetruecolor(32, 32);
for ($y=0; $y < sizeof($p); $y +=3) {
$r=$p[$y];
$g=$p[$y+1];
$b=$p[$y+2];
$color=imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'https://www.freebuf.com/articles/web/idat.png');
?>
?
可以看到,在IDAT数据块中,有一句话木马:,这里利用了PHP中的短开标签。
注意:使用短开标签,需要在php.ini中,将
jpg:未测试成功。
其他
条件竞争漏洞(Race condition)官方概念是“发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
upload-labs中的Pass-17是一个典型的条件竞争上传
代码执行逻辑:先移动,后检测,不符合再删除,符合则改名字。
因此我们可以让burp一直发包,让php程序一直处于移动php文件到upload目录这个阶段
我们使用多线程并发访问上传的文件,总会有一次在上传文件到删除文件这个时间段访问到上传的php文件,一旦我们成功访问到上传的php文件,那么它就会向服务器写一个shell。
服务端文件扩展名使用白名单+文件重命名
对文件内容进行检测
对中间件进行安全配置
此刻有不少人想要通过加盟创业的方法来实现本身的人生抱负,个中想要加盟到餐饮行业中的人事很是多的,在浩瀚加盟项目中,我小我私家较量看好郎氏大缸烧烤加盟项目,该项目创立多年,品牌形象已经深入人心,是浩瀚消...
两人开过房能查出吗(能够 查是和谁开的房吗),现如今,诸多社群营销方式让人际关联越来越愈来愈不好未来展望,但一片面性不能够成空对他人的私募基金。尤其是...
让手机变成黑客(黑客定位手机位置教程)(tiechemo.com)一直致力于黑客(HACK)技术、黑客QQ群、信息安全、web安全、渗透运维、黑客工具、找黑客、黑客联系方式、24小时在线网络黑客、黑客...
宾馆开放房的记录怎么查询的做法大全(网上怎么查开宾馆记录)“这类网站太差了,只有输入姓名就能查到电话号码、地点等消息,难怪许多贩卖电话都在骚扰咱们!”昨日,市民郭师傅向本报反应,网站“查房我帮你”涉嫌...
小无名1995用户黑客帝国以上百度云已经分享同求者搜百度云id:那好克间配手机用户的话需要下载百度云app登录才能接收资源 我这里有黑客帝国1-3全系列1080P的中英双字幕无删减版,望采纳点赞,感谢...
防止SQL注入绕过姿态二:空白字符这是一个存在sql注入缝隙的代码,能够看出来由于履行的SQL句子。 首要勘探一下麦芽地的网站以及子域名,咱也直接就上 Google 大法。 查询成果有以下几个域名:0...