上一篇,Webshell 上传与解析 Part 1 —— 绕过文件上传检测
在无法上传可被直接解析的Webshell 时,我们就要考虑用其他手段来解析我们的Webshell 。比如说我们可以利用服务器的一些漏洞和“产品特性”来解析这些代码。
0x00 概述
某些服务器存解漏洞,导致错误类型的文件被解析。
除此之外,在运维人员不熟悉服务器某些“产品特性”情况下,没有正确配置服务器,服务器可能会出一些解析问题。
0x01 Apache
Apache 未知扩展名解析
Apache 对文件名是从后向前解析的,如果 PHP 以 module 方式工作在 Apache 上的话会跳过未知(未在 mime.type 中收录)的文件名,直到遇到已知的文件名,若是’.php’,’.php5’之类的话则当作 php 文件解析
比如
a.php.aaa.bbb.ccc
会被当作
a.php
来解析
具体可以看这篇文章 Apache解析漏洞详解
.hataccess 文件
.htaccess 文件是 Apache 的一个配置文件,它负责相关目录下的网页配置。
如果在 Apache 中 .htaccess 可被执行且可被上传,那就可以自己定义哪些文件可以被解析了。
比如我们可以在 .htaccess 中写入:
<FilesMatch ".(jpg)$">
SetHandler application/x-httpd-php
</FilesMatch>
所有的扩展名为 jpg 的文件都会被当作 php 被解析
0x02 IIS
IIS 6.0 解析漏洞
- 目录名里有”.asp”、”.asa”的目录中的所有文件都会被当作 asp 文件来解析
- 文件名像是”a.asp;b.jpg”时也会被当中 asp 文件解析
第一点的话很好理解
比如在根目录下名为”a.asp”的目录中有个名为”b.jpg”的 asp 图马
payload
http://127.0.0.1/a.asp/b.jpg
使用 payload 就能解析了
接下来是第二点
将一个 asp 图马命名为 a.asp;b.jpg 然后上传,只要访问这个文件就能解析了
payload
http://127.0.0.1/a.asp;b.jpg
IIS 7.0/7.5
过在 PHP FastCGI,并不是 IIS 的问题,会在后面讲到。
0x03 Nginx
00 截断
00 截断要求 Nginx <= 0.837 & php < 5.3.4 & magic_quotes_gpc = Off
比如我们上传了一个名为”a.jpg”的 php 图马在网站根目录下
payload
http://127.0.0.1/a.jpg%00php
使用该 payload 就可以把这个图马作为 php 解析了
Nginx 文件名逻辑漏洞(CVE-2013-4547)
CVE-2013-4547 会在 version > 0.8.41 & version < 1.4.3 or version <= 1.5.7 的情况下起效
比如我们在网站根目录下有个名为”a.jpg “(注意是”a.jpg空格”)的 php 图马,
payload
http://127.0.0.1/a.jpg \0.php
Linux 下 php-fpm 默认限制的后缀名为 php,所以该漏洞在 linux 下很难实现,除非 php-fpm.conf 中的 security.limit_extensions 为空,不然访问只会提示 “Access Denied”
不过在 Windows 下则很容易实现,Windows 的文件名是不可以有空格的,如果有也会被去掉。在 Windows 下,我们就没必要上传带空格的文件了,只要上传一个普通的图马然后使用像上面一样的 payload 就可成功解析了
PHP FastCGI 路径解析
不是 Nginx 自身的漏洞,但在 Nginx 上较为常见,下一节将介绍
0x04 PHP FastCGI 路径解析
php.ini 默认设置 cgi.fix_pathinfo = 1 的情况下使用 fastcgi server 的服务器(Nginx、IIS 7.0/7.5)上一般会出现该漏洞
举个栗子,在网站根目录下有个名为”a.jpg”的 php 图马
payload
http://127.0.0.1/a.jpg/b.php
服务器找不到”b.php”,于是就向前解析,将”a.jpg”作为 php 文件解析了。
0x05 防御方式
首先最好的方法就是设置保存上传文件的目录不可执行,只要没有权限,Webshell 也没办法。另外因服务器不同也有某些地方得注意
Apache
- 不使用 module 方式
- 修改 Apache 配置文件,禁止像是”.php.”这样的文件执行
IIS 6.0
不给用户创建文件夹的权限
IIS 7.0/7.5
把 php.ini 中的 cgi.fix_pathinfo 的值改为 0
Nginx
- 更新到最新版
- 把 php.ini 中的 cgi.fix_pathinfo 的值改为 0
0x06 总结
在服务器配置时,我们得保证了解这些产品常见危险配置,这样才保正不会因为配置不当出现威胁。
除此之外,在维护一台服务器时,还得注意勤更新、打补丁,来保正自己的网站不被刚出现漏洞所影响。
下一篇,Webshell 上传与解析 Part 3 —— File Inclusion 的利用
0x06 参考
- CVE-2013-4547 Nginx解析漏洞深入利用及分析 - 百度安全中心
- 文件解析漏洞总结-Nginx - Werneror
- 在PHP中使用FastCGI解析漏洞及修复方案 - mrr
- Apache解析漏洞详解 - milantgh