XML:可扩展标记语言,用来传输数据和存储数据,它的标签没有被定义,需要自行定义标签
是W3C的推荐标准
XML与HTML的差异
XML用来传输和存储数据,其焦点是数据的内容
HTML用来显示数据,其焦点是数据的外观
XML基本构造
XML注入是通过改写xml的数据内容来实现的
<USER role="guest">User1</USER><USER role=“admin”>User2 </USER>
XML外部实体注入(XXE)
Document Type Definition: 用于验证xml文档是否有效
三个部分:第一部分为XML声明,第二部分为文档类型定义,第三部分为文档元素
第二部分“ELEMENT”为声明,声明第三部分,“ENTITY”为实体引用,第三部分将ab替换为第二部分实体的值。如果此时ab值为本地文件路径或远程文件的链接,就会得到文件内容。
攻击实例;
.1.<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE UserInfo[<!ENTITY name SYSTEM "file:///D:/Entity/1.txt">]><aa>&name;</aa>
2.<?php
$xml=<<<EOF
<?xml version="1.0" ?>
<!DOCTYPE ANY[
<!ENTITY xxe SYSTEM "file:///D:/Entity/1.txt">
]>
<x>&xxe;</x>
EOF;
$data = simplexml_load_string($xml);
print_r($data)
?>
总体为两部分,第一部分整体的值都给变量$xml,第二部分是将第一部分的内容发送到XML解析引擎中,输出结果。
实际操作1:http://127.0.0.1:8086/xmlentity.php,发送该请求,会获取D盘Entity文件家中1.txt文档中的信息。
实际操作2:http://127.0.0.1:8086/xmlentity1.php?xml=(攻击实例1中代码的URL编码),执行结果同1
XML之XPath
XPatn将文档中所有的内容当成节点,用于识别,选择和匹配XML文档中的各个组成部分
XPath实例
<users>
<user id="u001">
<name>张三</name>
<gender>男</gender>
<age>33</age>
</user>
<user id="u002">
<name>李四</name>
<gender>男</gender>
<age>33</age>
</user>
</users>
/users: 指向users元素
/users/user:指向users下的user元素
/users/user/..:指向users元素
/users/user/@id: 得到所有user元素的id属性
/users/user[1]:第一个user元素
/users/user[age>20]: age小于20的user元素
使用//代表后代节点
使用.表示当前节点
使用..表示上一级节点(父节点)
XPath注入
如果程序没有验证用户查询输入,就会发生XPath注入,可提交恶意的请求来修改查询语句。导致:事物逻辑和认证绕过,获取后端XML数据库内容。
认证过程是如下形式
/user[username=”sa” and password=”123456!”]
攻击者可以提交以下输入(知道正确的用户名)
username: sa"or "1" ="1
password: anything
则查询会变为:/user[username="sa"or "1"="1"and anything]
username="sa" or [true and flase]
usename="sa" or flase
返回“sa”
提交以下输入(不知道正确的用户名)
/user[username=”non_existing"or "1"="1” or "1" ="1“ and
password=”anything”]
执行会显示成如下的形式:
username="non_existing" or TRUE or [True AND False]
结果是:
username="non_existing" or TRUE or FALSE.
结果会以第一个节点的身份登录系统
XML注入、XXE、XPath注入防御
XXE:过滤用户提交的XML数据。关键词:<!DOCTYPE <!ENTITY SYSTEM PUBLIC
XML注入:用户参数进行处理,对XML操作,必须对格式字符进行转义处理。
XPath注入:与预防sql注入基本一致,尤其是/ ^ " ; & < > () 等字符的过滤