一、漏洞简介¶
1.1 漏洞背景¶
Oracle GlassFish Enterprise Server(原 Sun GlassFish Enterprise Server)是一个商业版的应用服务器,提供了完整的企业级 Java EE 支持。该产品广泛用于金融、电信、政府等关键行业。
在 2011 年 4 月的 Oracle Critical Patch Update 中,Oracle 披露了 CVE-2011-0807 漏洞。这是一个严重的管理接口漏洞,允许未经认证的攻击者通过网络完全控制服务器,包括执行任意代码、读取敏感数据、修改配置等。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2011-0807 |
| 危害等级 | HIGH / 10.0 |
| 漏洞类型 | GlassFish Enterprise Server 管理接口远程代码执行漏洞 |
| 披露时间 | 2011-04-20 |
| 影响组件 | GlassFish |
| 属性 | 详情 |
|---|---|
| CVE编号 | CVE-2011-0807 |
| 危害等级 | 严重(Critical) |
| CVSS评分 | 10.0 (CVSS:2.0/AV:N/AC:L/Au:N/C:C/I:C/A:C) |
| 漏洞类型 | 远程代码执行(Remote Code Execution)/ 认证绕过 |
| CWE分类 | CWE-94: Improper Control of Generation of Code ('Code Injection') |
补充核验信息:公开时间:2011-04-20;NVD 评分:10.0(HIGH)。
二、影响范围¶
2.1 受影响的版本¶
根据 Oracle 官方公告:
| 产品 | 受影响版本 |
|---|---|
| Sun GlassFish Enterprise Server | 2.1, 2.1.1 |
| Sun Java System Application Server | 9.1, 3.0.1 |
2.2 不受影响的版本¶
- Oracle GlassFish Server 3.1.1 及以上(已修复)
- 已应用 2011 年 4 月 CPU 补丁的版本
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- 管理控制台端口(默认 4848)对外开放
- 攻击者能够访问该端口
- 无需有效凭据即可利用
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
根据 Oracle 官方公告,CVE-2011-0807 影响管理(Administration)组件。漏洞可能涉及以下几个方面:
- 管理接口认证缺陷:管理控制台的认证机制存在绕过可能
- 远程管理协议漏洞:允许未授权的远程管理命令执行
- 部署接口滥用:通过应用部署功能上传恶意代码
攻击向量:
攻击者 → 管理端口(4848) → 绕过认证 → 执行管理命令 → 完全控制服务器
3.2 源码层面的根因分析(结合源码与补丁对比)¶
基于 Oracle 公告和 CVSS 评分(10.0 满分),推测漏洞涉及:
可能的漏洞代码(伪代码示例):
// 管理接口处理(漏洞假设)
public class AdminConsoleHandler {
public void handleAdminRequest(HttpServletRequest request) {
// 获取管理操作
String operation = request.getParameter("operation");
// 认证检查可能存在缺陷
if (!isAuthenticated(request)) {
// 某些操作可能绕过此检查
// 或者认证逻辑存在漏洞
}
// 执行管理操作
executeAdminCommand(operation, request);
}
private void executeAdminCommand(String operation, HttpServletRequest req) {
// 直接执行敏感操作,缺乏足够的权限检查
switch(operation) {
case "deploy":
deployApplication(req);
break;
case "configure":
updateConfiguration(req);
break;
// 可能存在未授权可访问的危险操作
}
}
}
可能的利用方式:
- 利用默认或空密码的管理员账户
- 利用会话管理缺陷
- 利用 JMX/RMI 远程接口
四、漏洞复现(可选)¶
4.1 环境搭建¶
使用 Docker 搭建测试环境:
# docker-compose.yml
version: '3'
services:
glassfish-vulnerable:
image: glassfish:vulnerable-version # 需要自行构建或找到镜像
ports:
- "4848:4848"
- "8080:8080"
- "8686:8686" # JMX 端口
environment:
- ADMIN_PASSWORD= # 空密码或默认密码
注意事项: - 此漏洞较为敏感,公开的 PoC 较少 - 建议在隔离环境中测试 - 仅用于安全研究和授权测试
4.2 PoC 演示与测试过程¶
基础探测脚本:
#!/usr/bin/env python3
"""
GlassFish CVE-2011-0807 漏洞探测脚本
仅用于安全研究和授权渗透测试
"""
import requests
import urllib3
urllib3.disable_warnings()
def check_glassfish_version(target):
"""检测 GlassFish 版本"""
url = f"http://{target}:4848/"
try:
response = requests.get(url, verify=False, timeout=10)
server = response.headers.get('Server', '')
print(f"[*] 服务器头: {server}")
# 检查版本信息
if 'GlassFish' in server or 'Sun Java System' in server:
print("[+] 检测到 GlassFish 服务器")
return True
return False
except Exception as e:
print(f"[-] 连接失败: {e}")
return False
def check_admin_console(target):
"""检查管理控制台访问"""
url = f"https://{target}:4848/"
try:
response = requests.get(url, verify=False, timeout=10)
if response.status_code == 200:
print("[+] 管理控制台可访问")
# 检查是否需要认证
if 'login' in response.text.lower():
print("[*] 需要认证")
else:
print("[!] 可能无需认证即可访问")
return response.status_code
except Exception as e:
print(f"[-] 检查失败: {e}")
return None
def test_default_credentials(target):
"""测试默认凭据"""
url = f"https://{target}:4848/j_security_check"
credentials = [
('admin', ''),
('admin', 'admin'),
('admin', 'password'),
('admin', 'adminadmin'),
]
for username, password in credentials:
try:
response = requests.post(
url,
data={
'j_username': username,
'j_password': password,
},
verify=False,
timeout=10,
allow_redirects=False
)
if response.status_code in [302, 200]:
print(f"[!] 可能存在弱口令: {username}:{password}")
except Exception as e:
pass
def main():
print("=" * 60)
print("GlassFish CVE-2011-0807 漏洞探测工具")
print("警告: 仅用于授权安全测试")
print("=" * 60)
target = input("输入目标 IP: ")
print("\n[1] 检测服务器版本...")
check_glassfish_version(target)
print("\n[2] 检查管理控制台...")
check_admin_console(target)
print("\n[3] 测试默认凭据...")
test_default_credentials(target)
print("\n" + "=" * 60)
print("探测完成")
if __name__ == "__main__":
main()
命令行利用示例:
# 使用 asadmin 命令行工具(如果有凭据)
asadmin --host target --port 4848 list-applications
# 尝试部署恶意应用
asadmin --host target --port 4848 deploy malicious.war
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
立即行动:
# 检查当前版本
asadmin version
# 升级到安全版本
# 下载并安装 GlassFish 3.1.1 或更高版本
应用官方补丁:
- 访问 Oracle Support 网站
- 下载 2011 年 4 月 CPU 补丁
- 按照补丁说明应用更新
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
方案一:网络隔离(强烈推荐)
# 限制管理端口仅允许内网访问
iptables -A INPUT -p tcp --dport 4848 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 4848 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 4848 -j DROP
# 同时限制 JMX 端口
iptables -A INPUT -p tcp --dport 8686 -j DROP
方案二:强化认证
# 修改管理员密码
asadmin change-admin-password
# 启用安全 admin
asadmin enable-secure-admin
# 重启服务
asadmin restart-domain
方案三:禁用远程管理
<!-- domain.xml 配置 -->
<config name="server-config">
<admin-service system-jmx-connector-name="system" type="das-and-server">
<!-- 禁用远程 JMX 连接器 -->
<jmx-connector enabled="false" name="system" />
</admin-service>
</config>
方案四:Web 服务器代理
# Nginx 反向代理配置
upstream glassfish_admin {
server 127.0.0.1:4848;
}
server {
listen 443 ssl;
server_name admin.example.com;
# 强制客户端证书认证
ssl_client_certificate /path/to/ca.crt;
ssl_verify_client on;
location / {
proxy_pass http://glassfish_admin;
}
}
六、参考信息 / 参考链接¶
6.1 官方安全通告¶
- Oracle Critical Patch Update - April 2011: https://www.oracle.com/security-alerts/cpuapr2011.html
- Oracle Security Alert CVE-2011-0807: https://www.oracle.com/technetwork/topics/security/cpuapr2011-301950.html
- My Oracle Support Note 1291877.1 (需要 Oracle 账户)
6.2 其他技术参考资料¶
- CVSS 10.0 漏洞分析: https://www.first.org/cvss/calculator/3.0
- Oracle GlassFish Security Guide: https://docs.oracle.com/cd/E18930_01/html/821-2418/
- CWE-94 Code Injection: https://cwe.mitre.org/data/definitions/94.html
- OWASP Remote Code Execution: https://owasp.org/www-community/vulnerabilities/Remote_Code_Execution
总结¶
漏洞对比表¶
| CVE编号 | 漏洞类型 | CVSS评分 | 影响版本 | 修复版本 |
|---|---|---|---|---|
| CVE-2017-1000028 | 路径遍历/文件读取 | 7.5 | ≤ 4.1.0 | ≥ 5.0 |
| CVE-2010-1622 | 目录遍历(Spring) | 5.0 | Spring ≤ 3.0.1 | Spring ≥ 3.0.2 |
| CVE-2011-0807 | 远程代码执行 | 10.0 | ≤ 3.0.1 | ≥ 3.1.1 |
关键安全建议¶
- 立即升级:所有 GlassFish 服务器应升级到 5.0+ 版本
- 网络隔离:管理端口(4848)不应直接暴露在公网
- 强化认证:使用强密码并启用安全认证
- 定期审计:定期检查服务器配置和安全补丁状态
通用防护措施¶
# 1. 检查当前版本
asadmin version
# 2. 修改管理员密码
asadmin change-admin-password
# 3. 启用安全管理
asadmin enable-secure-admin
# 4. 配置防火墙
iptables -A INPUT -p tcp --dport 4848 -j DROP
iptables -A INPUT -p tcp --dport 4848 -s 127.0.0.1 -j ACCEPT
# 5. 定期更新
# 订阅 Oracle 安全公告
# https://www.oracle.com/security-alerts/
附录:常用安全检测命令¶
# 检查开放的端口
netstat -tlnp | grep glassfish
# 检查运行的服务
ps aux | grep glassfish
# 检查日志文件
tail -f $GLASSFISH_HOME/domains/domain1/logs/server.log
# 检查配置文件
cat $GLASSFISH_HOME/domains/domain1/config/domain.xml | grep -i security
# 检查已部署的应用
asadmin list-applications
# 检查管理员用户
asadmin list-file-users --authrealmname admin-realm
免责声明:本文档仅用于安全研究和授权测试目的。未经授权对他人系统进行渗透测试是违法行为。使用本文档中的任何技术前,请确保已获得明确授权。
文档版本:v1.0 最后更新:2026-03-21 作者:安全研究团队