一、XML注入:XXE Injection即XML External Entity Injection
XML最初设计的目的是弥补HTML的不足,后来逐渐用于网络数据的转换和描述。XML的设计宗旨是传输数据,而非显示数据。
XML是各种应用程序之间数据传输中最常用的工具。
[html] view plain copy
- <pre name="code" class="html"><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
- <manager>
- <admin id="1">
- <name>admin</name>
- <password>admin</password>
- </admin>
- <admin id="2">
- <name>root</name>
- <password>root</password>
- </admin>
- </manager>
攻击者如果恰好能掌控password字段,那么就会产生XML注入,如攻击者输入:
[html] view plain copy
- admin</password></admin><admin id="5"><name>hack</name><password>hacker
XML注入时的两大要素为:标签闭合和获取XML表结构。
至今,XML注入还是比较少见的,而且XML注入修复也是比较简单的事情,只需要将预定义字符进行转义即可。
预定义字符
< | < |
> | > |
& | & |
‘ | ' |
" | " |
二、XPath注入
XPath即为XML路径语言,XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。简单地说,XPath就是选取XML节点的一门语言。
XPath与SQL注入的方式类似。
[html] view plain copy
- <?xml version="1.0" encoding="UTF-8"?>
- <users>
- <user id="1">
- <name>admin</name>
- <password>admin888</password>
- </user>
- <user id="2">
- <name>root</name>
- <password>root123</password>
- </user>
- </users>
在查询时,输入XPath语句:
[plain] view plain copy
- //user[username/text()=‘admin‘ and password/text()=‘admin888‘]
结果会返回
[plain] view plain copy
- Id:1
- UserName:admin
- PassWord:admin888
假设我们可以控制XPath语句,那么使用or 1=1即可遍历全部节点,语句如下:
//user[username/text()=‘admin‘ and password/text()=‘‘ or ‘1‘=‘1‘]
结果会返回
[plain] view plain copy
- Id:1
- UserName:admin
- PassWord:admin888
- Id:2
- UserName:root
- PassWord:root123
对一些敏感信息,不要 使用XML传输,如果一定要使用XML,建议尽量使用密文传输,防御方法和XML注入一样,对关键字符转换。
三、JSON注入
JSON是一种轻量级的数据交换格式,它基于JavaScript的一个子集。简单地说,JSON可以将JavaScript中的对象转换为字符串,然后在函数、网络之间传递这个字符串。
JSON和XML存在竞争关系。在XML中需要许多开始标记和结束标记,而JSON简单明了。
[plain] view plain copy
- {"users":[
- {"UserName":"admin","PassWord":"admin888","email":"[email protected]"}
- {"UserName":"root","PassWord":"root123","email":"[email protected]"}
- ]}
如果有恶意用户向JSON中注入恶意字符,那么JSON将解析失败,例如,输入的哦PassWord值为:admin"888
那么组装成的JSON数据位如下:"PassWord":"admin"888"。在password中的引号将会破坏整个JSON结构,导致JSON解析失败。
防御方法为对关键字符进行转义,也可使用第三方库,比如Java可使用JSON-lib.jar组建JSON数据。
四、HTTP参数污染:HPP即HTTP Parameter Pollution
HTTP请求中未规定不可以传输多个相同的参数项。当请求类似http://www.example.com/news.PHP?id=1&id=2&id=3时,不同脚本环境的取的参数也不同,有的取id=1,有的取id=3,有的三个参数都取。
HPP参数污染经常用来逃过一些Web应用防火墙(WAF)
简单地说,WAF在脚本还未接收到请求之前就开始对数据进行校验,如果未发现恶意代码,则交给脚本去处理,如果发现恶意代码,就进行拦截,不再交给脚本去处理。
例如,某个WAF防火墙定义数据中不允许出现select关键字,WAF取值验证时可能会选择第一项参数值,而脚本取值与WAF不同,这样就有可能绕过WAF的数据验证。
PHP:new.php?id=1&id=select username,password from admin --
ASP.NET: news.aspx?id=s&id=e&id=l&id=e&id=c&id=t