盲XPath注入

摘要: 盲XPath注入 https://www.fortoscer.com/forum.php?mod=viewthread&tid=10&fromuid=1 (出处: 信息安全社区)

这是一种攻击
描述

XPath是一种查询语言,描述如何找到特定元素(包括属性,处理指令等)的XML文档英寸 因为它是一个查询语言,XPath是有点类似于结构化查询语言(SQL),然而,XPath是不同的,因为它可以用来表示一个XML文档的几乎任何部分,而不受访问控制限制。在SQL中,“用户”(这是在XPath / XML环境不确定的术语)可以被限制在特定的数据库,表,列或查询。使用XPath注入攻击中,攻击者可以修改XPath查询来执行他选择的动作。

盲XPath注入攻击可以用于从在不安全的方式嵌入用户提供的数据的应用程序提取数据。当输入不正确过滤,攻击者可以提供被执行的有效的XPath代码。这种类型的攻击是在攻击者有没有关于XML文档,或者是错误消息的结构被抑制的知识的情况下使用,并且只能通过询问真/假的问题,一次拉一次资料片(booleanized查询),就像盲SQL注入

风险因素

TBD

例子

攻击者可能利用两种方法攻击成功:Boolenization和XML爬行。通过向XPath语法,攻击者使用附加表达式(在确定位置替换输入注入攻击)。


Boolenization

使用“Boolenization”的方法,攻击者可以假设给定的XPath表达式是“True”还是“False”。假设攻击者的目标是登录到帐户中的Web应用程序。成功登录将返回“True”和失败的登录尝试将返回“False”。攻击者首先只是分析一小部分字符或数字或许还得不到结论。但是当攻击者在字符串中通过专注的分析每一个字符,那么他们有可能就知道应该在那一部分注入内容。

 

使用函数stringlength(s),s表示字符串。通过这个函数攻击者可以计算出字符串的长度,然后通过substring(S,N,1)函数进行适当的迭代,这里S是前面所提到的字符串,N是一个起始字符,“1”是一个下一个字符选自N字符计数,这样攻击者能够轻易的枚举整个字符串。

Code:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <data>
  3.    <user>
  4.    <login>admin</login>
  5.    <password>test</password>
  6.    <realname>SuperUser</realname>
  7.    </user>
  8.    <user>
  9.    <login>rezos</login>
  10.    <password>rezos123</password>
  11.    <realname>Simple User</realname>
  12.    </user>
  13. </data>
复制代码

注:以下如果写中文可能就变味了,所以还是直接写英文吧

Function:

  • string.stringlength(//user[position()=1]/child::node()[position()=2]) returns the length of the second string of the first user (8),
  • substring((//user[position()=1]/child::node()[position()=2),1,1) returns the first character of this user ('r').

XML Crawling要了解XML文档结构中的攻击者可以利用:
  • count(expression)
 
  1. count(//user/child::node()
复制代码

执行这个函数将会返回两个节点数。

  • stringlength(string)
  1. string-length(//user[position()=1]/child::node()[position()=2])=6
复制代码

假设上面这个表达式成立,攻击者查询的结果就是第一个用户节点的第二个子节点是由6个字符组成的密码。

  • substring(string, number, number)
  1. substring((//user[position()=1]/child::node()[position()=2]),1,1)="a"
复制代码

以上的这个查询假设它是成立的,那么攻击者就可以确定第一个用户节点的第二个子节点(即:密码)内容的第一个字符是“a”这个字符。

如果在日志中,那么就像以下的这种形式:

C#:

  1. String FindUser;
  2. FindUser = "//user[login/text()='" + Request("Username") + "' And
  3.       password/text()='" + Request("Password") + "']";
复制代码

那么攻击者应该注入下面的代码:

  1. Username: ' or substring((//user[position()=1]/child::node()[position()=2]),1,1)="a" or ''='
复制代码

XPath语法可能会提醒你的常见SQL注入攻击,但攻击者必须考虑到这种语言不允许注释掉表达式的其余部分。要绕过此限制攻击者应该完全使用表达式或作废所有表达式,这才有可能成功的搞破坏而达到进攻的目的。

由于Boolenization查询一个小的XML或者是成千上万个数量文档,都是非常高效的。这就是为什么这种攻击是不手动进行。了解一些基本的XPath功能,攻击者能够在很短的时间,将写出重建文档的结构并会自行填充数据的应用程序。

参考
http://dl.packetstormsecurity.net/papers/bypass/Blind_XPath_Injection_20040518.pdf
http://www.ibm.com/developerwork ... njection/index.html
http://dl.packetstormsecurity.ne ... ection_20040518.pdf
 

应用程序数据库表达式资料片如何

9fi859zt800f.gif (7.29 KB, 下载次数: 0)

 

盲XPath注入

盲XPath注入

盲XPath注入
https://www.fortoscer.com/forum.php?mod=viewthread&tid=10&fromuid=1
(出处: 信息安全社区)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值