aspcms 网站地图,萍乡企业做网站,正规营销型网站培训中心,杭州行业网站建设公司近期在做个基础的 web 常见漏洞的 ppt#xff0c;主要参考 OWASP TOP 10 2017RC2#xff0c;此版本中增加了 XXE 攻击#xff0c;所以自己简单的研究下 XXE 攻击。XXE#xff08;XML External Entity#xff09;XML 外部实体#xff0c;当前端和后端通信数据采用 xml主要参考 OWASP TOP 10 2017RC2此版本中增加了 XXE 攻击所以自己简单的研究下 XXE 攻击。XXEXML External EntityXML 外部实体当前端和后端通信数据采用 xml可传入 xml 外部实体利用后端 xml 解析器漏洞使 xml 解析器去访问攻击者指定的资源。首先需要了解一些 xml 的基础知识。
1.xml 基础知识 XML 用于标记电子文件使其具有结构性的标记语言可以用来标记数据、定义数据类型是一种允许用户对自己的标记语言进行定义的源语言。XML 文档结构包括 XML 声明、DTD 文档类型定义可选、文档元素。 XML 具有一些特性 (1).XML 是一种标记语言很类似 HTML (2).XML 被设计用来传输和存储数据而 HTML 被设计用来显示数据 (3).XML 标签没有被预定义需要用户自行定义标签 (4).XML 具有自我描述性 XML 的语法规则 (1).XML 必须有一个根元素 (2).XML 必须有关闭标签 (3).XML 标签对大小写敏感 (4).XML 元素必须正确的嵌套 (5).XML 属性值必须加引号 XML DTD文档类型定义的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。DTD 可以在 XML 文档内声明也可以外部引用。 1内部声明!DOCTYPE 根元素 [元素声明]例如 !DOCTYPE note aaa 2外部声明!DOCTYPE 根元素 SYSTEM 文件名例如 !DOCTYPE root SYSTEM test.dtd DTD 实体声明 1内部实体声明 !ENTITY 实体名称 “实体的值” 示例 !DOCTYPE foo [ !ELEMENT foo ANY !-- 声明元素 -- !ENTITY test abcdefg !-- 声明内部实体 -- !ENTITY xxe Thinking !-- 声明内部实体 -- ] fooxxe;test;/foo 2外部实体声明 !ENTITY 实体名称 SYSTEM “URI/URL” 外部实体声明支持的部分协议如下 !DOCTYPE foo [ !ELEMENT foo ANY !ENTITY xxe SYSTEM file:///c:/windows/win.ini !-- 声明外部实体 --
]
fooxxe;/foo
3参数实体声明 参数实体的引用只能在 DTD 中使用 ENTITY % 实体名 “实体内容” ENTITY % 实体名 SYSTEM “URI” 详情见http://www.w3school.com.cn/dtd/index.asp
2.XXE 攻击 xxe 主要利用 xml 解析器对外部实体的解析去触发攻击从上面支持的协议列表可以看出可利用 xxe 去进行命令执行、读取文件、内网探测端口、作为跳板机攻击内网机器等攻击故危害巨大。
xxe 主要分为两种场景有回显和无回显。有回显的场景中可以直接查看到攻击执行的结果。无回显的场景下只能通过其他手段查看攻击效果。这次主要实验了有回显的情况。 自己编写个简单的登录场景登录的参数使用 xml 传输后端对接收的 xml 参数进行解析并且返回登录情况。制作个登录当点击 “登录” 按钮时使用 ajax 传输 xml 格式的登录信息
传输的数据格式为loginusername 用户名 /usernamepassword 密码 /password/login 后端使用 dom4j 去解析传入的 xml 参数为了实现有回显的效果我们将传入的 username 回传给前端并在前端显示出来。
Controller
RequestMapping(valueapi)
public class XXEController {/*loginusernameaaa/usernamepasswordadfasds/password/login*/ResponseBodyRequestMapping(valueloginXml.json/*,method RequestMethod.POST*/)public AjaxResponse testXXE(String xml){AjaxResponse ajaxResponse new AjaxResponse();try {Document document DocumentHelper.parseText(xml);Element rootEle document.getRootElement();String username rootEle.elementTextTrim(username);//String password rootEle.elementTextTrim(password);ajaxResponse.setCode(210);ajaxResponse.setMsg(登录失败);ajaxResponse.setContent(username);}catch (Exception e){e.printStackTrace();ajaxResponse.setCode(211);ajaxResponse.setMsg(数据处理失败);}return ajaxResponse;}}
正常登陆时传输的参数和回显效果如下 xml%3Clogin%3E%3Cusername%3Eadmin%3C%2Fusername%3E%3Cpassword%3Etest123%3C%2Fpassword%3E%3C%2Flogin%3E 使用 xxe 攻击时攻击示例代码如下此代码读取 c:/windows/win.ini 文件
!DOCTYPE foo
[!ELEMENT foo ANY
!ENTITY abc SYSTEM file:///c:/windows/win.ini]
loginusernameabc;/usernamepasswordfdsf/password/login
修改参数和回显效果如下 3. 防御措施 关于防御措施第一种可以关闭 xml 解析器外部解析功能第二种进行过滤例如过滤掉、DOCTYPE、SYSTEM、ENTITY 等关键字 尝试下第二种方案过滤关键字。后端代码如下将部分关键字过滤掉。
Controller
RequestMapping(valueapi)
public class XXEController {/*loginusernameaaa/usernamepasswordadfasds/password/login*/ResponseBodyRequestMapping(valueloginXml.json/*,method RequestMethod.POST*/)public AjaxResponse testXXE(String xml){AjaxResponse ajaxResponse new AjaxResponse();try {//过滤部分关键字防止XXEString newXml xml.replace(!,).replace(DOCTYPE,).replace(ELEMENT,).replace(ENTITY,);Document document DocumentHelper.parseText(newXml);Element rootEle document.getRootElement();String username rootEle.elementTextTrim(username);//String password rootEle.elementTextTrim(password);ajaxResponse.setCode(210);ajaxResponse.setMsg(登录失败);ajaxResponse.setContent(username);}catch (Exception e){e.printStackTrace();ajaxResponse.setCode(211);ajaxResponse.setMsg(数据处理失败);}return ajaxResponse;}} 可以看到将关键字过滤替换成 “”会导致传入的数据不符合 xml 的格式后端在 xml 解析器在解析数据时直接出错并跳转到异常处理代码段证明这样过滤是有效的。以上为一次简单的研究 xxe后续有待深入研究。