# 一、漏洞环境信息
dom4j: http://127.0.0.1:8080/xxe/dom4j
jdom: http://127.0.0.1:8080/xxe/jdom
sax: 略
# **payload

# 二、修复说明

# 以dom4j分析,其他库同理
# 分析Controller层 public String dom4jAction(@RequestBody String data) 添加修复代码前后分析
XXE代码
@Controller
@RequestMapping("/xxe")
public class dom4jController {
@Autowired
private dom4jServiceImpl dom4jserviceImpl;
@ResponseBody
@RequestMapping(value = "/dom4j",produces = {"application/json;charset=utf-8"})
public String dom4jAction(@RequestBody String data){
System.out.println(data);
//解析xml文件
SAXReader reader = new SAXReader();
//禁止外部DTD
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
retMessage ret = new retMessage();
try {
Document document = reader.read(new InputSource(new StringReader(data)));
Element root=document.getRootElement();
String id = document.getStringValue();
article OneArticle = dom4jserviceImpl.getArticleById(id);
ret.setStatusCode(200);
ret.setData(OneArticle);
ret.setReqData(id);
} catch (DocumentException e) {
e.printStackTrace();
ret.setStatusCode(500);
ret.setData(e.getMessage());
ret.setReqData(data);
}
return JSON.toJSONString(ret);
}
}
XML注入原理
- XML跟JSON格式一样,是前后端数据交互的格式
- XML解析原理上是反序列化操作(XML格式字符串 => Object对象)
- XML反序列化过程:
- xml字符串载入XML解析器中
- 解析器构造Object对象
- id -> &xxe; //加载id时需要引用外部实体xxe
- &xxe -> file:///etc/passwd //外部实体xxe来源于文件/etc/passwd
- id = /etc/passwd //读取/etc/passwd文件赋值给id
# 三、小结
- 成因:XML内容解析未设置禁止外部实体加载
- 位置:xml解析的位置
- 修复:设置属性禁止外部实体加载
- 本质上XXE的问题是一个配置不当的问题
- XXE修复指引