文件上传 文件解析漏洞详解
Nginx+php配置错误导致的解析漏洞
cgi.fix_pathinfo =1
该配置在php.ini文件中设置,现在是默认注释掉了
利用:http://x.x.x.x/test.jpg/test.php nginx发现后缀是php便交给php去处理,而/test.jpg/test.php不存在,于是对路径进行修复,去掉/test.php,然后对test.jpg进行php解析
另外新版php还增加了“ security.limit_extensions ” 限制了解析文件的后缀 只能为.php,否则返回
Access denied 。
Nginx空字节代码执行漏洞
在fast-cgi关闭的情况下,nginx版本:0.5., 0.6., 0.7-0.7.65, 0.8-0.8.37,nginx在图片后附加php代码然后通过访问
test.jpg%00.php
即可执行php代码
原理: URL里面在遇到%00空字节时与FastCGI处理不一致
Nginx配置不当目录穿越
如果绝对路径"/home/"的URL映射是网站目录"/files/",配置写成了"/files"
location /files {
alias /home/;
}
就可以访问"/files../",穿越路径,访问到绝对路径根目录"/"下的文件列表
Nginx文件名逻辑漏洞(CVE-2013-4547)
受影响的nginx版本: 0.8.41至1.4.3和1.5.7之前的1.5.x
正常上传一个附加代码的图片"test.jpg",访问时后面+"空格"+"\0"+".php",即让图片作为php文件解析
"/test.jpg \0.php"
Apache未知扩展名解析漏洞
Apache对文件的解析主要是从右到左开始判断并进行解析,如果判断为不能解析的类型,则继续向左进行解析,如test.php.xyz将被解析为PHP类型。
另外使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞,使用fastcgi模式与php结合的所有版本apache不存在此漏洞
我在本地实验moudle模式结合,依然可以执行成功
参考: https://www.cnblogs.com/milantgh/p/5116955.html
Apache换行解析漏洞 (CVE-2017-15715)
其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略
php不常见后缀名
php可识别的后缀名如下:
php、php3、php4、php5、phpt、phtml
利用该条件即可绕过黑名单检查
htaccess文件解析
htaccess文件生效条件:
-
Apache的配置文件中,要写上: AllowOverride All
-
Apache要加载mod_Rewrite模块。加载该模块,需要在Apache的配置文件中写上:LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
需要注意Apache可能有多个配置文件,后加载的配置文件会覆盖先加载的配置文件中的配置
.htaccess文件可以修改MIME类型,这使得该.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件。
AddType application/x-httpd-php xxx
或者:
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
该语句会让Apache把shell.jpg文件解析为php文件
iis 6.0解析漏洞
影响范围iis<=6.0
- .asp或者.asa结尾的目录下所有文件都被iis当做asp文件来解析
- 文件解析 xx.asp;.jpg 在iis6.0下,分号后面的不被解析,所以xx.asp;.jpg被解析为asp脚本得以执行。 默认的可执行文件后缀还有三个".asa"、".cer"、".cdx"
IIS 7.0&7.5畸形解析漏洞
默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件
上传个xx.jpg小马,然后访问xx.jpg/.php 或者 或xx.jpg/abc.php ,该jpg文件就会被当做php文件解析
widows文件命名特性
- 大小写不敏感
- 自动去除文件名末尾的. 和空白符
- 0x7F—0xFE 范围间的字符如果要是出现在文件名的(不包括文件夹名)最后一位,会被去除。即创建名为test.asp + chr(0x7F)的文件时,实际上会创建一个"test.asp"文件,最后一个ascii码为0x7F的字符会被去除
参考: