XML注入、XXE、XPath注入原理与防御

XML:可扩展标记语言,用来传输数据和存储数据,它的标签没有被定义,需要自行定义标签

是W3C的推荐标准

 

XML与HTML的差异

XML用来传输和存储数据,其焦点是数据的内容

HTML用来显示数据,其焦点是数据的外观

 

XML基本构造

 

XML注入是通过改写xml的数据内容来实现的

 

User1User2

 

XML外部实体注入(XXE)

Document Type Definition: 用于验证xml文档是否有效

 

 

三个部分:第一部分为XML声明,第二部分为文档类型定义,第三部分为文档元素

第二部分“ELEMENT”为声明,声明第三部分,“ENTITY”为实体引用,第三部分将ab替换为第二部分实体的值。如果此时ab值为本地文件路径或远程文件的链接,就会得到文件内容。

 

攻击实例;

.1.]>&name;

 

2.

$xml=<<

]>

&xxe;

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实例

张三

33

李四

33

 

/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

XML注入:用户参数进行处理,对XML操作,必须对格式字符进行转义处理。

XPath注入:与预防sql注入基本一致,尤其是/ ^ " ; & < > () 等字符的过滤

你可能感兴趣的:(web安全)