记录javaxxe审计经历
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
前言:
最近把php相关的xxe搞了一遍,然后正好自己也在学java干脆一起搞一搞。
用的靶场是
https://github.com/JoyChou93/java-sec-code/wiki/XXE
配置:直接用springboot运行即可
一、xmlReader(测试无回显)
访问到这里提示我们xxe除外那直接burp抓包看看,
发现xxe成功直接看跟进去源码看一下
@PostMapping("/xmlReader/vuln")
public String xmlReaderVuln(HttpServletRequest request) {
try {
String body = WebUtils.getRequestBody(request);//得到请求体
logger.info(body);
XMLReader xmlReader = XMLReaderFactory.createXMLReader();//建立解析器
xmlReader.parse(new InputSource(new StringReader(body))); // 这是真正解析的地方
return "xmlReader xxe vuln code";
} catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}
二、SAXBuilder(无回显)
这个和上面的其实功能几乎完全一样,就是解析xml的class不一样
String body = WebUtils.getRequestBody(request);
logger.info(body);
SAXBuilder builder = new SAXBuilder();
// org.jdom2.Document document
builder.build(new InputSource(new StringReader(body))); // cause xxe
需要注意的是,因为我们要解析xml!这里一定要改成xml不然默认就是post的那个image.png
三、SAXReader(无回显)
String body 获取请求体
logger.info(body)把请求体写入日志
new SAXReader() 初始化解析器
reader.read进行了解析xml的功能
四、SAXParser(无回显)
发现这几个类的效果实现的都一样,就简单写一下
String body = WebUtils.getRequestBody(request);
logger.info(body);
SAXParserFactory spf = SAXParserFactory.newInstance();
//这里为什么要用newInstance,因为SAXParserFactory是一个抽象类,不能直接new
SAXParser parser = spf.newSAXParser();
parser.parse(new InputSource(new StringReader(body)), new DefaultHandler()); // parse xml
五、Digester(无回显)
String body = WebUtils.getRequestBody(request);
Digester digester = new Digester();
digester.parse(new StringReader(body));
六、DocumentBuilder(有回显!)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//这里的newInstance也是因为这个类是抽象类
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(request.getInputStream());
Document document = db.parse(is); // parse xml
//上面的代码其实就是解析,关键的是下面进行了遍历
// 遍历xml节点name和value
StringBuilder buf = new StringBuilder();
NodeList rootNodeList = document.getChildNodes();
for (int i = 0; i < rootNodeList.getLength(); i++) {
Node rootNode = rootNodeList.item(i);
NodeList child = rootNode.getChildNodes();
for (int j = 0; j < child.getLength(); j++) {
Node node = child.item(j);
//使用的append追加内容得以回显
buf.append(String.format("%s: %s\n", node.getNodeName(), node.getTextContent()));
}
}
return buf.toString();
七、XMLReader(无回显)
就是xml解析器不同大同小异,就不写了。
八、DocumentHelper(无回显 )
总结:
分析java xxe漏洞成因
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//这里是因为Document... 是一个抽象类,不能直接实例化
DocumentBuilder db = dbf.newDocumentBuilder();
//得到DOM解析器对象
StringReader sr = new StringReader(xml_con);
//获取传入的数据
InputSource is = new InputSource(sr);
//把数据变成输入流方便解析器解析
Document document = db.parse(is); // parse xml
//最后用解析器解析它
java中防御xxe手段
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); //禁用DTDs (doctypes),几乎可以防御所有xml实体攻击
//如果不能禁用DTDs,可以使用下两项,必须两项同时存在
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); //防止外部普通实体POC 攻击
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); //防止外部参数实体POC攻击
只是大概的总结留个印象,方便以后看见这些第三方库的函数知道是解析xml的,会想到xxe漏洞,日后遇见再详细总结。
https://blog.csdn.net/qq_62046696/article/details/129548189?spm=1001.2014.3001.5501贴一下php中的xxe,如果有师傅有更好的文章可以推一下感激不尽。
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐