web学习笔记之XXE攻击喵~
[TOC]
XXE?什么好东西,快让Gloria咬一口~
XXE(XML External Entity Injection),全称为XML外部实体注入
那么首先了解一下…XML是什么?
XML是Extensible Markup Language(可扩展标记语言)的缩写。简单来说,XML是一种用于储存和传输数据的纯文本格式,他和HTML(超文本标记语言)很像,但目的不同。
●核心区别
| 特性 | HTML | XML |
|---|---|---|
| 目的 | 显示数据(让页面好看) | 存储/传输数据(关注数据本身) |
| 标签(Tags) | 预定义的,如<p>,<div>,<img> |
自定义的,如<name>、<password> |
| 语法要求 | 相对宽松(浏览器会尝试容错) | 非常严格(标签必须闭合,区分大小写) |
●XML?你不说你啥样我咋认识你 ¯_(ツ)_/¯
XML使用标签来包裹数据(标签是自定义的),所以它具有自我描述性(Self-descriptive)
如
1 | <note> |
<note>, <to>, <body> 这些标签不是计算机预设的,而是开发者为了描述这条数据自己发明的
所以XXE哥们你到底谁啊?跟我们家XML有什么关系!!( ﹁ ﹁ ) ~→
简单来说,XXE就是攻击者通过在 XML 文件中定义“恶意变量”(实体),利用服务器端未正确配置的 XML 解析器,强制服务器去读取本地文件、访问内网或发起拒绝服务攻击
在了解XML之前,我们需要先搞懂XML的一个特性:DTD和实体
核心原理:什么是”外部实体“?
XML允许在头部定义DTD(Document Type Definition)用来规定XML的格式,在DTD中,你可以定义实体(Entity),实体就类似编程语言中的变量或者宏。
XML中的Entity实体:
<、>、&、’、”z\在XML中为特殊符号,不能直接使用,需要用实体来表示
| 符号 | XML中表示 |
|---|---|
< |
< |
> |
&qt; |
& |
& |
' |
' |
" |
" |
正常用法(内部实体):
1 |
|
危险用法(外部实体):
XML的强大之处在于,这个变量的值不仅仅可以是字符串,还可以引用外部资源(External Entity)。如下所见,我们就可以读取/etc/passwd之类的敏感文件
关键就在于SYSTEM
1 |
|
OK,了解了DTD和实体之后,我们来看看XXE到底能帮我们干些什么叭~
1)有回显XXE(Nornal/Output XXE)
服务器会将解析后的XML实体内容直接显示在页面上(HTTP Response Body)
目标:获取flag文件(查找/flag、/etc/passwd、源代码)
使用的实体:通用实体(General Entity)
关键技巧:php伪协议代码
1 |
|
这里贴两道道小题~就正常内置浏览器抓包,修改XXE即可,就不放题目了
第一道,盲猜flag在根目录下面(题目来源于learnctf,侵权删)
第二道,提示让我们查看login.php,所以我们选择php://filter伪协议来查看login.php的源码
然后使用base64在线解密工具即可
2)无回显XXE(Blind XXE)
服务器解析了 XML,但不返回任何内容(或者只返回”Success”/“Error”)。
●通过XML漏洞进行内网端口扫描
这是CTF中结合XXE考点的常见玩法。当你发现了一个XXE漏洞,但flag不在文件里面,或者你想攻击内网的其他服务(如Admin或者Redis面板)时,可以考虑。
一般情况下,80端口对外开放,8080等端口只对内开放,所以我们想要获取内网中的东西时,我们可以攻击80端口来达到间接攻击内网中其他端口的目的
原理:利用SYSTEM关键字支持http://协议的特性,强制让受害服务器尝试连接某个IP和端口。
payload样例:
1 |
|
如果成功进入内网,然后就开始爆破,按照响应时间或者响应长度找异常值啊(啊,有钱的佬可以直接使用bp intruder爆破啊,没有的话我们使用Extension将其转化为python代码去爆破啊<(_ _)>)
这里贴一道题目喵~
步骤:
先在内置浏览器抓包啊,我们尝试80端口
对其进行base64解码,发现和网页上的内容一样喵,说明我们现在访问的这个网站的首页,就是在80端口运行的,所以我们就可以通过80端口,来攻击其他的端口
然后我们根据提示,使用Extension进行爆破(这里用的python,有条件的可以用bp的intruder)
得到了端口号为7430,所以我们再次使用php://fliter伪协议读取这个端口号的源码
再进行base64解码,得到flag
●通过XXE进行HTTP内网主机探测
这个与内网端口扫描有相似之处,都是通过攻击一个外网可以访问的,并将其作为跳板,来获取内网中一些敏感的东西。
贴一道栗子~
步骤:
1)推断内网网段
使用file://协议读取文件:/etc/hosts、/proc/net/arp 、proc/net/fib_trie
会发现172.16.84.X这个常出现,可能就是内网网段,接下来就要扫描这个网段下的主机
2)使用php://filter伪协议获取内网网段中的随便一个ip,然后进行爆破(1-255)
说明这个ip是不可到达的,访问不到这个ip
我们进行爆破(会有些慢,耐心等待一下喵~),得到,再进行解码即可
Leave a comment