中间件漏洞
1 Apache解析
1.1 漏洞原理
Apache默认一个文件可以有多个以点分割的后缀,当右边的后缀无法时别(不在mime.types
规定的后缀名中)时,继续向左识别。
其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,xxx.php\x0A
将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
在php.ini
中有如下语句:
AddType application/x-httpd-php .php
1.2 漏洞利用
1.2.1 源码分析
在httpd-php.conf
中
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
问题出现在通配符$
上,它用来匹配字符串结尾位置
1.2.2 漏洞复现
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
} else {
?>
前端页面如下:
-
当用户选择文件并设置好文件名进行上传时,服务器后端就会对文件名进行检验,如果后缀名匹配到黑名单则禁止上传。由源码可知,检验的文件名
$name
并不是上传的文件名,而是用户设置的文件名。 -
**注意:**这里可以需要使用POST方式上传,因为该方式不会过滤
\n
。
现在上传一个🐎,抓包看一下:
切换到16进制数据,找到文件名,将后缀修改添加0A
使用蚁剑测试链接成功:
1.3 漏洞修复
-
传入文件名时不要使用POST方式,用
$_FILES[‘file']['name']
函数直接读取。 -
在
http.conf
或httpd-vhosts.conf
中加入以下语句,从而禁止文件名格式为.php.
的访问权限:<FileMatch ".(hp.|php3.|php4.|php5.)"> Order Deny.Allow Deny from all </FilesMatch>
-
如果需要保留文件名,可以修改程序源代码,替换上传文件名中的".“为”_”:
$filename = str_replace('.','_',$filename);
2 Nginx + PHP CGI解析
2.1 漏洞介绍
当访问域名或IP/xxx.jpg/zzz.php
时,如果zzz.php
不存在,PHP就会向前解析,如果xxx.jpg
存在,就会把其当作PHP文件解析。
2.2 漏洞利用
2.2.1 源码分析
-
nginx.conf
中:location ~ \.php($|/) { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; set $script $uri; set $path_info ""; if ($uri ~ "^(.+\.php)(/.*)") { set $script $1; set $path_info $2; } include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$script; fastcgi_param SCRIPT_NAME $script; fastcgi_param PATH_INFO $path_info; }
通过正则匹配以后, SCRIPT_NAME会被设置为"evil.jpg/gouzao.php", 继而构造成SCRIPT_FILENAME传递给PHP CGI。
-
PHP的cgi SAPI中的参数,
fix_pathinfo
,默认值为1,即;该文件截自php.ini ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix it's paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. cgi.fix_pathinfo=1
开启后就会触发在PHP中的如下逻辑:
/* * if the file doesn't exist, try to extract PATH_INFO out * of it by stat'ing back through the '/' * this fixes url's like /info.php/test */ if (script_path_translated && (script_path_translated_len = strlen(script_path_translated)) > 0 && (script_path_translated[script_path_translated_len-1] == '/' || ....//以下省略.
到这里, PHP会认为SCRIPT_FILENAME是
evil.jpg
, 而gouzao.php
是PATH_INFO, 然后PHP就把evil.jpg
当作一个PHP文件来解释执行。
2.2.2 漏洞复现
在vulhub中启动nginx
路径下的nginx_parsing_vulnerability
漏洞,
在用记事本打开图片aaa.png
,在结尾加上一句php代码:
<?=phpinfo();?>
上传成功
为将图片中的php代码解析,构造urlhttp://192.168.225.138/uploadfiles/eb9fcafce2f193e736c0f60f295b8380.png/.php
,解析成功:
2.3 漏洞修复
-
在PHP5以下,设置
cgi.fix_pathinfo=0;
-
在PHP5以上,fpm配置里新增了一个额外参数(php-fpm.d/www.conf),
security.limit_extensions = .php .php3 .php4 .php5 .php7专门用来限制PHP脚本引擎只支持解析哪些扩展名的文件
; Limits the extensions of the main script FPM will allow to parse. This can ; prevent configuration mistakes on the web server side. You should only limit ; FPM to .php extensions to prevent malicious users to use other extensions to ; execute php code. ; Note: set an empty value to allow all extensions. ; Default Value: .php ;security.limit_extensions = .php .php3 .php4 .php5 .php7
所以在使用nginx+php-fpm时,可以不用修改系统默认的cgi. fix_pathinfo=1设置了。
3 IIS
与Nginx漏洞相同,也是由于cgi.fix_pathinfo=1;
导致IIS服务器在解析php文件时会发生漏洞。
4 Tomcat
4.1 弱口令
4.1.1 漏洞介绍
4.1.2 漏洞利用
1. 源码分析
启动vulhub的tomcat8靶场后,查看其配置文件
由此可见,其后台的账号密码未修改,这时可以登录到tomcat的后台ManagerApp
2. 漏洞复现
- 先使用暴力破解方式获取登录口令
-
启动Kali的
Msfconsole
模块msfconsole
-
查找与
tomcat
相关的模块search tomcat
-
使用
auxiliary/scanner/http/tomcat_mgr_login
模块,查看需要填写哪些参数use auxiliary/scanner/http/tomcat_mgr_login show options ```
-
将
rhosts
设置为目标机(这里不区分大小写)set rhosts 192.168.225.138
-
开始爆破
run
其中带有绿色+的即为爆破成功的口令。
-
这时发现可以上传
.war
文件 -
使用冰蝎构造🐎连接即可。
4.1.3 漏洞修复
-
更改口令,提高强度🙄
-
对密码暴力猜解行为进行图灵验证,一旦发现用户口令破解行为及时对账户进行限时封停处理。
-
下载最新无漏洞版本
4.2 PUT上传
4.2.1 漏洞介绍
4.2.2 漏洞利用
1. 源码分析
-
与上节同一目录下的配置文档中对
readonly
描述如下:<!-- readonly Is this context "read only", so HTTP --> <!-- commands like PUT and DELETE are --> <!-- rejected? [true] -->
-
所以在其中添加参数,使得PUT方法可以使用:
<init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param>
2. 漏洞复现
- 在
web.xml
中添加readonly参数并赋值为false。 - 重启tomcat服务,利用burp抓包,修改请求方式为
PUT /上传的文件名.jsp/
,在结尾添加一句话。 - 上传成功即可。
4.2.3 漏洞修复
配置readonly和VirtualDirContext值为True或注释参数,禁止使用PUT方法并重启tomcat。
5 weblogic弱口令
5.1 漏洞介绍
与tomcat弱口令类似,Weblogic版本:10.3.6(11g)
5.2 漏洞利用
-
启动vulhub中的weblogic→weak_password靶场,在浏览器中输入
ip:7001/console
查看页面 -
使用弱口令登录
用户名 口令 system password admin security joe password mary password system security wlcsystem wlcsystem wlpisystem wlpisystem weblogic Oracle@123 -
上传文件
点击上载文件:
首先生成
.war
包jar -cvf ceshi.war jsp_custom_script_for_oracle.jsp
点击下一步直至完成。
浏览器中访问该文件,出现以下页面即可使用工具连接。
5.3 漏洞修复
-
更改口令,提高强度🙄
-
对密码暴力猜解行为进行图灵验证,一旦发现用户口令破解行为及时对账户进行限时封停处理。
-
下载最新无漏洞版本