博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NC ws接口防XXE注入
阅读量:2121 次
发布时间:2019-04-30

本文共 1054 字,大约阅读时间需要 3 分钟。

有风险的地方有两个

1.接口返回xml的格式化操作,SoapFormatAction,但是一般都打了补丁做了处理
在这里插入图片描述
实际上还可以在org.apache.xalan.transformer.TransformerIdentityImpl里解析之前加上下面代码也可以防止注入
在这里插入图片描述
2.调用接口时,一般来说如果服务是由home里startup.bat/startup.sh(tomcat)来启动的话是不会有风险的,但如果服务是由was启动,就会存在此风险。估计原因时两种服务容器的类加载方式不一样,据查tomcat的类加载器,不完全遵循“双亲委派”,就是自己先找,找不到了才让父加载器加载,而was应该是先交给父加载器加载。
调用接口时,NC采用的是XMLStreamReader来解析的,而它又是由XMLInputFactory来创建的,然而XMLInputFactory再NC里有三个jar包里都有而且路径一致
在这里插入图片描述
如果XMLInputFactory实例化的时候用的是jdk的XMLInputFactoryImpl,那就会有问题,而用的是tika-app里的WstxInputFactory就不会有,
在这里插入图片描述
因为XMLInputFactoryImpl的reader在解析标签的时候会去执行实体声明的指令,
在这里插入图片描述
而WstxInputFactory的reader在解析标签的时候不会执行命令,会根据标签符号判断event类型。
在这里插入图片描述
我们可以看到XMLInputFactory是一个静态变量,所以在服务启动之初就有可能已经进行了初始化,事实也是如此,追下代码就会知道,其实在服务启动时,ierp里的xml就是使用Staxs进行解析的。
在这里插入图片描述
所以在ws解析之前的StaxInInterceptor拦截器中将线程的类加载器改为系统类加载器也就是jdk的类加载器,XMLInputFactory实例化时一定是用的XMLInputFactoryImpl,那么就一定会有问题(这是在本地进行漏洞复现的方法)
在这里插入图片描述
解决办法:
1.在StaxInInterceptor拦截器前增加一个拦截器,专门对读取InputStream里面的XML,对敏感字符进行拦截

2.在StaxInInterceptor拦截器中,指定XMLInputFactory的子类进行实例化

3.XMLInputFactory解析前,设置属性不对引用实体进行解析

ps:风险发生在ReadHeadersInterceptor拦截器里的reader.next()方法里,所以在这之前处理都是可以的

转载地址:http://hzfrf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《每日一题》20200707 112. 路径总和
查看>>
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>