XXE-lab(全踩坑)实录

2023-10-27

在bWAPP中有一关是XML External Entity Attacks (XXE)传送门,比较简单的了解了一下XXE

师傅的博客
浅谈XML实体注入漏洞

XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害
xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件

所以可以先来学习一下XML的相关知识XML 简介

简单了解如下

XML 被设计为传输和存储数据,其焦点是数据的内容HTML 被设计用来显示数据,其焦点是数据的外观
HTML 旨在显示信息,而 XML 旨在传输信息

XML 用于传输数据,而 HTML 用于格式化并显示数据
XML 把数据从 HTML 分离, XML 不是对 HTML 的替代,XML 是独立于软件和硬件的信息传输工具

基本语法

所有 XML 元素都须有关闭标签
XML 标签对大小写敏感
XML 文档必须有根元素
XML 的属性值须加引号

这里着重学习一下实体引用

在 XML 中,一些字符拥有特殊的意义,如果把这些字符放在XML元素中就会产生错误,所以必须用实体引用来代替

在这里插入图片描述
下一个重点是XML验证中的DTD
DTD 简介

DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:

<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]> 

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
详见内部的 DOCTYPE 声明与外部文档声明

DTD元素

在这里插入图片描述
DTD属性

这里重点学习一下DTD实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量
实体引用是对实体的引用
实体可在内部或外部进行声明

内部实体声明语法<!ENTITY 实体名称 "实体的值">

外部实体声明语法<!ENTITY 实体名称 SYSTEM "URI/URL">

附上实例:

内部实体声明
DTD 实例:

<!ENTITY writer "Donald Duck."> <!ENTITY copyright "Copyright runoob.com">

XML 实例:<author>&writer;&copyright;</author>

外部实体声明
DTD 实例:

<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">

XML 实例:<author>&writer;&copyright;</author>

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

XXE主要是利用了DTD引用外部实体导致的漏洞

XXE-Lab for PHP

在这里插入图片描述
在这里插入图片描述

输入任意账号密码进行抓包

在这里插入图片描述
观察请求包
发现头部:Accept: application/xml, text/xml, */*; q=0.01

在这里插入图片描述

构造XML声明和DTD部分,引用外部实体来进行实体调用

<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM  "file:///c:/windows/win.ini">
]>
<user><username>&test;</username><password>Mikasa</password></user>

并且在元素中引用外部实体参数&test

查看回显

在这里插入图片描述

一般XXE利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe可以使用外带数据通道提取数据
xxe-lab是有回显的

看大佬的源码审计

<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/

$USERNAME = 'admin'; //账号
$PASSWORD = 'admin'; //密码
$result = null;

libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');//这里面因为没有xml文档所以用的是php的伪协议来获取我们发送的xml文档

try{
    $dom = new DOMDocument();//创建XML的对象
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);//将我们发送的字符串生成xml文档。
    $creds = simplexml_import_dom($dom);//这一步感觉相当于实例化xml文档

    $username = $creds->username;//获取username标签的值
    $password = $creds->password;//获取password标签的值

    if($username == $USERNAME && $password == $PASSWORD){//将获取的值与前面的进行比较。...
        $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);//注意必须要有username这个标签,不然的话找不到username,就没有了输出了,我们也不能通过回显来获取信息了
    }else{
        $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);//与上方相同,都会输出username的值,都可以达到我们的目的
    }    
}catch(Exception $e){
    $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}

header('Content-Type: text/html; charset=utf-8');
echo $result;
?>

还可以进行其他的恶意引入外部实体方式

详见XXE漏洞攻防

XXE-Lab for Java

package me.gv7.xxe;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.*;

@WebServlet("/doLoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private static final String USERNAME = "admin";//账号
	private static final String PASSWORD = "admin";//密码
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();     
        DocumentBuilder db;
        String result="";
		try {
			db = dbf.newDocumentBuilder();
			/*修复代码*/ 
			//dbf.setExpandEntityReferences(false);
			Document doc = db.parse(request.getInputStream());
			String username = getValueByTagName(doc,"username");
			String password = getValueByTagName(doc,"password");
			if(username.equals(USERNAME) && password.equals(PASSWORD)){
				result = String.format("<result><code>%d</code><msg>%s</msg></result>",1,username);
			}else{
				result = String.format("<result><code>%d</code><msg>%s</msg></result>",0,username);
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
			result = String.format("<result><code>%d</code><msg>%s</msg></result>",3,e.getMessage());
		} catch (SAXException e) {
			e.printStackTrace();
			result = String.format("<result><code>%d</code><msg>%s</msg></result>",3,e.getMessage());
		}
		response.setContentType("text/xml;charset=UTF-8");
		response.getWriter().append(result);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

	/**
	 * 
	 * @param doc 文档
	 * @param tagName 标签名
 	 * @return 标签值
	 */
	public static String getValueByTagName(Document doc, String tagName){  
        if(doc == null || tagName.equals(null)){  
            return "";  
        }  
        NodeList pl = doc.getElementsByTagName(tagName);  
        if(pl != null && pl.getLength() > 0){  
            return pl.item(0).getTextContent();  
        } 
        return "";
    }
}

水平有限不会操作。。

Java XXE漏洞正确修复方法及原理

XXE-Lab for Python

#coding=utf-8

'''
autor: c0ny1
date: 2018-2-7
'''

from flask import Flask, request, url_for, render_template, redirect
from xml.dom import minidom

app = Flask(__name__)
app.config['DEBUG'] = True

USERNAME = 'admin' # 账号
PASSWORD = 'admin' # 密码

@app.route("/")
def home():
    return render_template("index.html")

@app.route("/doLogin", methods=['POST', 'GET'])
def doLogin():
    result = None
    try:
        DOMTree = minidom.parseString(request.data)
        username = DOMTree.getElementsByTagName("username")
        username = username[0].childNodes[0].nodeValue
        password = DOMTree.getElementsByTagName("password")
        password = password[0].childNodes[0].nodeValue
    
        if username == USERNAME and password == PASSWORD:
            result = "<result><code>%d</code><msg>%s</msg></result>" % (1,username)
        else:
            result = "<result><code>%d</code><msg>%s</msg></result>" % (0,username)
    except Exception,e:
        result = "<result><code>%d</code><msg>%s</msg></result>" % (3,e.message)
	
    return result,{'Content-Type': 'text/xml;charset=UTF-8'}

def prn_obj(obj):
    print '\n'.join(['%s:%s' % item for item in obj.__dict__.items()])

if __name__ == "__main__":
    app.run()

大佬说是要下载Python Flask 框架,然后运行即可

附上安装教程

在这里插入图片描述
总是遇到奇怪的问题。。

按照提示先解决看看

在这里插入图片描述
呃。彻底裂开。。

再来尝试一下这种方法Windows下安装使用python的Flask框架

在这里插入图片描述一开始还是有点小问题,不过将pip版本升级后就解决了

具体操作按上面的来就行,这里是终于成功了

但是运行过程中还是出错

在这里插入图片描述

我***

在这里插入图片描述

Csharp

大佬说是放vs里,但我不会搞。。

在这里插入图片描述上面的工具栏有一个运行按键,等待运行之后会出来这样一个工具

在这里插入图片描述在这里插入图片描述
网上找的的解决办法是

在这里插入图片描述使用菜单栏工具下的NuGet包管理器,在程序包管理控制台中输入 Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

静静等待。

。。。

还是没有解决,放弃了

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XXE-lab(全踩坑)实录 的相关文章

  • R语言:利用leafletCN创建交互式地图

    R语言 利用leafletCN创建交互式地图 介绍 地图是一种强大的可视化工具 它可以帮助我们展示空间数据并揭示地理模式 R语言中的leafletCN包提供了创建交互式地图的功能 而且还支持中文地图的显示 本文将向您展示如何使用leafle
  • 百度地图点聚合-Javascript-复制可用

    百度地图点聚合 Javascript 复制可用 功能介绍 整体思路 遇到问题 具体实现 一 cdn引用 二 使用 三 自定义标记点图标 功能介绍 本文记录了百度地图BMap实现点聚合效果 如下图实例 地图缩小时聚合效果 地图放大后显示效果
  • 机器学习笔记——Neural Network

    神经网路算法Neural Network 神经网络包含输入层input layer 隐藏层hidden layer 输出层output layer三部分 多层神经网络中常用的优化参数算法 backpropagation 反向传播算法 多层神
  • 【开发工具】PyChram安装Python第三方库

    目录 一 进入控制台 二 安装第三方库 一 进入控制台 打开PyChram 设置 项目 Python解释器 查看解释器所在路径 根据路径打开解释器所在文件夹 在上方路径中输入cmd 回车 进入cmd控制台 二 安装第三方库 输入命令 这里使
  • 独家

    清华大数据 赛事经验分享 系列讲座是清华 青岛数据科学研究院继 应用 创新 和 技术 前沿 系列后推出的又一学术品牌 旨在分享国内外大数据领域重要赛事获胜团队及个人的参赛历程及其获胜经验 本期我们邀请到CIKM AnalytiCup2017
  • 【Qt串口调试助手】1.7 - QLabel标签插入链接,修改Qt应用图标

    QLabel标签添加超链接 点击 即可通过默认浏览器打开网页 GitHub源码 Qt串口调试助手下载 QLabel标签添加链接 Qt支持 HTML语音 所以可以对链接颜色 字体 有无下划线等进行设置 以下是使用 默认蓝色 无下划线的示例 状
  • leetcode第84场双周赛

    leetcode第84场双周赛 一 6141 合并相似的物品 1 题目描述 2 思路分析 3 代码实现 二 6142 统计坏数对的数目 1 题目描述 2 思路分析 3 代码实现 三 6174 任务调度器 II 1 题目描述 2 思路分析 3
  • docker-compose部署springboot应用

    docker compose部署springboot应用 最开始使用tomcat部署java应用 如果要部署多个系统 我通常部署多个tomcat 每个tomcat一个系统 可以添加到系统服务自动启动 后来随着springboot流行 改为将
  • SQLNET.RECV_TIMEOUT & SQLNET.SEND_TIMEOUT

    SQLNET RECV TIMEOUT 客户端设置的作用是 其发起的请求 必须在设置值内有返回 否则报错中断该参数不是限制执行时间 而是限制返回包的时间如果执行一个SQL抽取数据 由于每秒都有数据返回 所以不会报错如果执行一个存过 由于请求
  • 为什么ChatGPT这么强?—— 一文读懂ChatGPT原理!

    前言 最近一周多的时间 只要不是生活在火星 喜欢技术的同学一定都被OpenAI的ChatGPT给刷屏了 ChatGPT与以往的公开提供服务的对话机器人相比 性能有了显著的提高 它可以相对可靠地提供一些日常对话 知识获取的功能 也可以它根据人
  • python-数据分析(9-Pandas)

    Pandas 9 Pandas 9 1 介绍与安装 Pandas介绍与安装 为什么会有Pandas Pandas支持大部分Numpy语言风格 尤其是数组函数与广播机制的各种数据处理 但是Numpy更适合处理同质型的数据 而Pandas的设计
  • SSRF web351-360(除357)

    SSRF web351 web360 写在前面 ssrf常见的一些函数 curl init 初始curl会话 curl setopt 会话设置 curl close 会话关闭 file get contents 将整个文件或一个url所指向
  • (JS设计模式)二.部分面试题

    1 打车时 可以打专车或者快车 任何车都有车牌号和名称 不同车价格不同 快车每公里1元 专车每公里2元 行程开始时 显示车辆信息 行程结束时 显示打车金额 假定行程就5公里 题目 画出UML类图 用ES6语法写出该示例 答 UML类图 2
  • Linux命令·touch

    linux的touch命令不常用 一般在使用make的时候可能会用到 用来修改文件时间戳 或者新建一个不存在的文件 1 命令格式 touch 选项 文件 2 命令参数 a 或 time atime或 time access或 time us
  • Office2021版64位+mathtype6.9

    终于安装成功了 如果你也遇到以下问题 试试看我的方法行不行 终于成功了很激动 在这里插入代码片 按照网上的教程 分别在以下两个文件夹 注意不一样的根目录 放了这三个文件 然后 打开office是这样的 接着 按照网上说的 不成功就把这三个文
  • uniApp 开发支付宝小程序引入订阅消息组件

    1 manifest json 配置 2 page json 配置 3 页面引入组件
  • EXTJS--分页PagingToolbar插件的重新刷新、重新加载方法

    var pagebar new Ext PagingToolbar store store pageSize Ext page pageSize displayInfo true displayMsg 共有 2 条记录 当前显示 0 1 条
  • 详解区块链分层构架

    区块链 是一个结合了数学 密码学 计算机学等大量学科和技术而形成的去中心化网络系统 如何实现这些技术的融合 则来自于区块链在构建时所形成的六大主要的分层结构 他们分别是网络层 数据层 共识层 激励层 合约层 以及应用层 此外 还有支持数据流
  • 快速入门 YOLOv5(ultralytics)

    YOLOv5 是一系列在 COCO 数据集上预训练的对象检测架构和模型 代表Ultralytics 对未来视觉 AI 方法的开源研究 结合了在数千小时的研究和开发中获得的经验教训和最佳实践 文档 有关训练 测试和部署的完整文档 请参阅YOL
  • windows应急响应工具

    Webshell查杀 d盾 http www d99net net WEBDIR WebShell 扫描服务 OpenRASP 团队 https scanner baidu com pages intro 河马 https www shel

随机推荐

  • Telegram 查看下载保存的文件

    文章目录 Android 缓存文件 本地文件 Windows 缓存文件 本地文件 清理缓存 Android Windows Android 缓存文件 单纯的点下载或者图片 GIF 等的预览只会缓存到 Internal Storage sdc
  • [问题已处理]-mac安装cobra失败

    导语 今天在mac环境中没法成功安装cobra 记录一下避免以后踩坑 执行go get报错 更换安装方式 安装cobra cli go get u github com spf13 cobra latest go install githu
  • 最全最实用的 安装ESXi6及Linux虚拟机的创建教程

    ESXi的作为虚拟化环境的虚拟机管理程序层 负责将服务器虚拟成资源池 提供接口供管理组件调用 将下面的ISO刻录成光盘或可启动 盘 安装在服务器裸机上 安装过程 开机做好阵列 选择从安装介质启动 按F11继续 输入密码 rootroot 密
  • [QT编程系列-8]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义对话框

    目录 3 QT窗体设计 3 6 自定义对话框 3 6 1 种类 3 6 2 输入对话框 编辑 3 6 3 字体对话框 3 6 4 文件对话框 编辑 3 6 5 颜色对话框 3 6 6 输出对话框 编辑 3 6 7 进度条对话框 编辑 3 6
  • linux下编译内核时出现 scripts/basic/fixdep.c:206 等错误解决办法

    现象如下 下面是网上抄的 我本人是英文的 不方便看 就当下面是翻译的吧 大致信息如下 scripts basic fixdep c 300 警告 未使用的变量 s scripts basic fixdep c 在函数 print deps
  • AlarmManager实现定时功能

    实现定时间隔功能 1 发送 AlarmManager alarmService AlarmManager context getSystemService ALARM SERVICE Intent alarmIntent new Inten
  • js中[]、{}、()区别

    一 大括号 表示定义一个对象 大部分情况下要有成对的属性和值 或是函数体 表示对象 表示对象的属性 方法 如果用在方法名后面 代表调用 如 var LangShen Name Langshen AGE 28 上面声明了一个名为 LangSh
  • 状态机总结(简洁)

    一 概念 状态机简写为 FSM Finite State Machine 也称为同步有限状态机 我们一般简称为状态机 之所以说 同步 是因为状态机中所有的状态跳转都是在时钟的作用下进行的 而 有限 则是说状态的个数是有限的 状态机的每一个状
  • PCL1.12+VTK9.1+QT6编译部署

    本文讲解使用的环境是vs2019 pcl1 12 0 vtk9 1 qt6 0 最后再展示一个示例程序 1 编译VTK vtk下载地址如下 https vtk org download 然后用cmake构建 修改一下几个地方 然后打开生成的
  • 【解决】CentOS_7 usb安装盘制作,修改安装目录后依然dracut-initqueue timeout

    1 正常流程进centos install 报错dracut initqueue timeout 2 进入dracut时 cd dev ls grep sdb 没有文件 3 拔插U盘后 ls grep sdb 显示 sdb4 sdb 4 重
  • 教妹学Java(十三):if-else 语句详解

    大家好 我是沉默王二 一个和黄家驹一样身高 和刘德华一样颜值的程序员 本篇文章通过我和三妹对话的形式来谈一谈 if else 语句 教妹学 Java 没见过这么有趣的标题吧 语不惊人死不休 没错 本篇文章的标题就是这么酷炫 接受不了的同学就
  • ETL工具

    这些年 几乎都与ETL打交道 接触过多种ETL工具 现将这些工具做个整理 与大家分享 一 ETL工具 国外 1 datastage 点评 最专业的ETL工具 价格不菲 使用难度一般 下载地址 ftp ftp seu edu cn Pub D
  • 一步一步写STL:空间配置器 (1)

    侯捷说 追踪一流程序 并从中吸取养分 模仿着他写的程序 比那些自以为靠自己努力写出来的下三流程序价值高得多 至少我这么认为 世界上99 999 的程序 在STL面前都是下三流水平 侯捷老师这句话对STL的评价太高了 以前只是熟练使用STL
  • Tensorflow运行机制

    TensorFlow是一种基于数据流图的编程框架 它使用数据流图来描述计算过程 其中节点表示操作 边表示数据流 从而实现了高效的分布式计算和自动求导 在TensorFlow中 计算过程分为两个阶段 构建阶段和执行阶段 在构建阶段 我们使用T
  • 达梦数据库-分区表维护

    分区表的维护主要有增加分区 删除分区 交换分区 合并分区 拆分分区 1 增加分区 添加一个新的分区 2 删除分区 删除一个就分区 3 交换分区 将分区数据跟普通表交换 2张表结构必须一样 4 合并分区 将临近的两个分区合并为一个分区 目前仅
  • 绘图中的渐变

    绘图渐变 指的就是在指定区域内 指定开始位置到指定结束为止 一种颜色颜色逐渐变成另一种颜色的图 qt中的渐变分为三个类别 1线性类别 QLinearGradient 2 角度渐变 QConicalGradient 3 辐射渐变 QRadia
  • Android Studio 给方法添加注释自动生成参数的快捷设置

    没有废话 直接上图 Android Studio gt File gt Setting gt Keymap gt 发现框输入comment gt 选择Other的Fix doc comment 2 选择 Add keyboard short
  • Videos from Embedded Linux Conference 2014

    本文转载至 http free electrons com blog elc2014 videos As the summer is coming to an end we finally managed to publish the vi
  • Kubernetes详解(二十)——ReplicaSet控制器

    今天继续给大家介绍Linux运维相关知识 本文主要内容是ReplicaSet控制器 一 ReplicaSet控制器概述 ReplicaSet控制器是Pod类控制器的一种实现 该控制器用于确保其管控的Pod对象副本数量在任意时刻都能够满足用户
  • XXE-lab(全踩坑)实录

    在bWAPP中有一关是XML External Entity Attacks XXE 传送门 比较简单的了解了一下XXE 师傅的博客 浅谈XML实体注入漏洞 XXE漏洞全称XML External Entity Injection即xml外