Web安全之XPath注入

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值