这盐有点咸 发表于 2015-4-13 13:16:30

未知攻焉知防——XXE漏洞攻防

博文作者:Mark4z5发布日期:2014-09-23阅读次数:22331博文内容:
一、XML基础知识
       
        XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。


http://security.tencent.com/uploadimg_dir/201409/1c17b93b150744145e1835842cadd3f1.png


DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
内部声明DTD
<!DOCTYPE 根元素 [元素声明]>


引用外部DTD
<!DOCTYPE 根元素 SYSTEM "文件名">


或者
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">



DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
内部声明实体
<!ENTITY 实体名称 "实体的值">


引用外部实体
<!ENTITY 实体名称 SYSTEM "URI">


或者
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

二、XML外部实体注入(XML External Entity)
        当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。 引入外部实体方式有多种,比如:
恶意引入外部实体方式1:
XML内容:


http://security.tencent.com/uploadimg_dir/201409/f49c0df70fcb33ff3aabcf05d4b3e725.png


恶意引入外部实体方式2:XML内容:


http://security.tencent.com/uploadimg_dir/201409/3b0ca339c255caaf6a8152591603b7df.png


DTD文件(evil.dtd)内容:

http://security.tencent.com/uploadimg_dir/201409/f30b752ce50cfd251eeb2fa6c5557684.png
恶意引入外部实体方式3:XML内容:


http://security.tencent.com/uploadimg_dir/201409/98467af31084ac12843e0d178af00a29.png


DTD文件(evil.dtd)内容:


http://security.tencent.com/uploadimg_dir/201409/477b8a0d6ff3f0810a751c479614e70c.png

另外,不同程序支持的协议不一样,


http://security.tencent.com/uploadimg_dir/201409/dbe8a63aa452a72a9e55c14b4766dc9b.png


上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有

http://security.tencent.com/uploadimg_dir/201409/fe9ccf2c88e0672ed79355f75c7c3d3b.png

以下举例说明XXE危害,当然XXE不止这些危害。

XXE危害1:读取任意文件

http://security.tencent.com/uploadimg_dir/201409/6ff0c5ae9e2a8e67eccff8c9b2125b5f.png

http://security.tencent.com/uploadimg_dir/201409/9c84151de448ca1e758a44d41062c8d7.png

        该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

        另外,数据不回显就没有问题了吗?如下图,

http://security.tencent.com/uploadimg_dir/201409/2ada36441805a14823c6d8b9cf9bce8e.png


不,可以把数据发送到远程服务器,

http://security.tencent.com/uploadimg_dir/201409/a546fb6a2b484320dff3e15445df11e0.png


远程evil.dtd文件内容如下:

http://security.tencent.com/uploadimg_dir/201409/6cef4a19e42ad8f5a4734285d5671449.png


触发XXE攻击后,服务器会把文件内容发送到攻击者网站

http://security.tencent.com/uploadimg_dir/201409/5d71c81b8dc3146c0a2a45091aa7a06e.png

http://security.tencent.com/uploadimg_dir/201409/589246a78d9183502b47581fb21f36f6.png

XXE危害2:执行系统命令

http://security.tencent.com/uploadimg_dir/201409/d0e8f102d0db96cb42f3a9f9d67c3a30.png

http://security.tencent.com/uploadimg_dir/201409/da0ef59068c3707c6486353b2ff40572.png


        该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。 XXE危害3:探测内网端口

http://security.tencent.com/uploadimg_dir/201409/7e1fbfe9eacd1474a997403c6bc553f5.png

http://security.tencent.com/uploadimg_dir/201409/2413f46b67d3a116ee41290e5e614364.png


        该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。 XXE危害4:攻击内网网站

http://security.tencent.com/uploadimg_dir/201409/9a54f9521c41890b088b4a13356c5dde.png

http://security.tencent.com/uploadimg_dir/201409/bf94eea90bc2b9604cd44d86d94e8a24.png

        该CASE是攻击内网struts2网站,远程执行系统命令。 三、客户端XXE案例
        日前,某office文档转换软件被爆存在XXE漏洞(PS:感谢TSRC平台白帽子Titans`报告漏洞),某一应用场景为:Web程序调用该office软件来获取office文档内容后提供在线预览。由于该软件在处理office文档时,读取xml文件且允许引用外部实体,当用户上传恶意文档并预览时触发XXE攻击。详情如下:
        新建一个正常文档,内容为Hi TSRC,

http://security.tencent.com/uploadimg_dir/201409/34f7f2ecbd1564ee98c22cf0fb1a4a25.png

        使用该软件转换后可以得到文本格式的文档内容,

http://security.tencent.com/uploadimg_dir/201409/45284cfd4997e2eee013248e239aa0f9.png

http://security.tencent.com/uploadimg_dir/201409/a2d2d2bf23e1808dee35d7b16dc64c74.png

        当往该docx的xml文件注入恶意代码(引用外部实体)时,可进行XXE攻击。

http://security.tencent.com/uploadimg_dir/201409/debaf34c62402c10db38f29d459adbbd.png

http://security.tencent.com/uploadimg_dir/201409/912e81c84ef679e08305d807fa2906e3.png

四、防御XXE攻击
方案一、使用开发语言提供的禁用外部实体的方法
PHP:libxml_disable_entity_loader(true);


JAVA:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);


Python:from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案二、过滤用户提交的XML数据      
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
【最后】

        无论是WEB程序,还是PC程序,只要处理用户可控的XML都可能存在危害极大的XXE漏洞,开发人员在处理XML时需谨慎,在用户可控的XML数据里禁止引用外部实体。
        文中涉及到的代码和技术细节,只限用于技术交流,切勿用于非法用途。欢迎探讨交流,行文仓促,不足之处,敬请不吝批评指正。
【参考】

http://www.vsecurity.com/download/papers/XMLDTDEntityAttacks.pdfhttp://2013.appsecusa.org/2013/wp-content/uploads/2013/12/WhatYouDidntKnowAboutXXEAttacks.pdfhttps://www.owasp.org/images/5/5d/XML_Exteral_Entity_Attack.pdfhttps://www.youtube.com/watch?v=j2cfebNEfic

perble 发表于 2015-6-29 01:46:56

学习学习技术,加油!

Jack-5 发表于 2015-6-29 03:12:31

菜鸟小羽 发表于 2015-6-30 05:40:14

还是不错的哦,顶了

wilist 发表于 2015-7-1 16:16:26

学习学习技术,加油!

admin1964 发表于 2015-7-1 22:36:00

支持中国红客联盟(ihonker.org)

wanmznh 发表于 2015-7-2 02:36:16

感谢楼主的分享~

云游者 发表于 2015-7-2 12:47:52

支持中国红客联盟(ihonker.org)

Sty,涛 发表于 2015-7-2 19:05:59

支持中国红客联盟(ihonker.org)

perble 发表于 2015-7-2 20:36:32

支持,看起来不错呢!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 未知攻焉知防——XXE漏洞攻防