在查询时,输入XPath语句:
//user[username/text()='admin' and password/text()='admin888'
这条语句的意思是查询user节点下(任意位置)的username标签值为admin,并且password标签值也为admin。如果存在,则返回当前节点,Java代码如下:
public class XPathTest { @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { SAXReader sax = new SAXReader(); Document document = sax.read(new File("c:\\AdminUser.xml")); String xpath = "//user[username/text()='admin' and password/text()='admin888']"; List<Node> nodes = document.selectNodes(xpath); for (Node node : nodes) { if (node instanceof Element) { Element element = (Element) node; System.out.println("Id:" + element.attributeValue("id")); System.out.println("UserName:" + element.elementText("username")); System.out.println("PassWord:" + element.elementText("password")); } System.out.println(); } } } |
在执行后可以返回user节点,如图10-20所示。
图10-20 XPath查询
假设我们可以控制XPath语句,那么使用 or 1=1即可遍历全部节点,语句如下:
//user[username/text()='admin' and password/text()='admin888' or 1=1
//user[username/text()='admin' and password/text()='' or '1'='1']
执行结果如图10-21所示。
图10-21 XPath注入执行结果
笔者建议,对于一些敏感信息,不要使用XML传输,如果一定要使用XML,建议尽量使用密文传输。
XPath注入的预防是比较简单的,没有防御SQL注入那么复杂。最重要的是对预定义字符的转换,请参照"XML注入"内容中的预定义字符转换。
本文选自《Web安全深度剖析》第十章,本站经电子工业出版社和作者的授权。
版权声明:51Testing软件测试网获电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。