阅读更多
本文转自OneAPM技术社区,系OneAPM架构师吕龙涛原创文章

普遍性和可检测性:
Xpath 注入是OWASP TOP10 安全威胁中 A1 Injection 中的一种,注入漏洞发生在应用程序将不可信的数据发送到解释器时。虽然注入漏洞很容易通过审查代码发现,但是却不容易在测试中发现。

影响严重:
注入能导致数据丢失或数据破坏、缺乏可审计性或者是拒绝服务。注入漏洞有时候甚至能导致完全主机接管。

从代码层次如何防御:
首先我们先来看一下在 Java 中引用 xpath 需要用的 lib 库:
  • javax.xml.xpath
  • org.jdom.xpath
  • org.jdom2.xpath等

那么xpath注入是从哪些途径进入到代码逻辑的呢?大家仔细思考一下无外乎三个途径:cookie、header、request parameters/input。如果我们能对这三个注入源头进行严格得入参检查是否就能够防御绝大部分的注入攻击了呢?

答案是可以防御大部分注入攻击,下面我们就一起来看一下如何进行有效得进行入参检查: 我们将入参都转化为 Map 对象,Map<K, Collection<V>> asMap();

然后通过CheckMap(finnal Map<String, String> params)方法,检查入参是否合法。
下面我们来实现这个CheckMap内部方法:
1. 通过遍历检查Map中key得合法性
 for (final String key : params.keySet()) {
        if (this.checkString(key)) {
            return true;
        }

2.检查每一个key对应得value得合法性:
 final Collection<String> coll = (Collection<String>)params.get((Object)key);
        for (final String input : coll) {
            if (this.checkString(input)) {
                return true;
            }
        }

做完这些就是细节方面得检测了,具体得就是 checkString 如何实现。笔者暂时能想到认为一个入参是 xpath 得检测条件大概有以下几点:
private boolean checkString(final String input) {
    return null != input && input.length() > 1 && (this.parser.IsOutBoundary(input) || (-1 != input.indexOf(39) && (this.parser.IsOutBoundary(input.replace("'", "''")) || this.parser.IsOutBoundary(input.replace("'", "\\'")))) || (-1 != input.indexOf(34) && (this.parser.IsOutBoundary(input.replace("\"", "\"\"")) || this.parser.IsOutBoundary(input.replace("\"", "\\\"")))) || this.parser.IsQuoteUnbalanced(input));
}

通过查 ASCII 码表我们知道39对应“'”,34对应“"”;所以有了检测条件
-1!=input.indexOf(39)&&(this.parser.IsOutBoundary(input.replace("'","''")
-1!=input.indexOf(34)&& this.parser.IsOutBoundary(input.replace("\"", "\"\""))

上述检测条件中用到两个关键方法IsOutBoundary和IsQuoteUnbalance
public boolean IsOutBoundary(String input) {
    int offset = 0;
    if (null == input || input.length() <= 1) {
        return false;
    }
    input = input.toLowerCase();
    while (true) {
        final int x = this.getRawValue().indexOf(input, offset);
        final int y = x + input.length();
        if (-1 == x) {
            return false;
        }
        final int ceil = this.getCeiling(this.boundaries, x + 1);
        if (-1 != ceil && ceil < y) {
            return true;
        }
        offset = y;
    }
}

public boolean IsQuoteUnbalanced(String input) {
    input = input.toLowerCase();
    return this.getRawValue().contains(input) && this.stack.size() > 0 && input.indexOf(this.stack.peek()) != -1;
}

 public String getRawValue() {
        return this.input;
    }

 private int getCeiling(final List<Integer> boundaries, final int value) {
    for (final int x : boundaries) {
        if (x >= value) {
            return x;
        }
    }
    return -1;
}

漏洞攻击示例
看完代码是如何检查得我们来一个真真正正 Xpath 注入的示例;来检验一下我们代码是都有效。

WebGoat 是 OWASP 推出得一款开源的含有大量漏洞攻击的应用,在 Github 上可以直接搜到源码。

*我们找到 Xpath Injection 得 lession *,如下图:



hints提示我们攻击的入参:
引用
Try username: Smith' or 1=1 or 'a'='a and a password: anything

点击 Submit 之后神奇得事情出现了!



面对这样得一种攻击那么我们该如何防御呢?如果对代码感兴趣得同学可以把 WebGoat 得源码 down 下来;然后将上面得入参检测得方法封装一下嵌入到 WebGoat 得源码中,然后我们再攻击一下,那么接下来会发生什么样的事情呢?

Xpath 查询失败了,并没有返回任何结果,攻击被拦截之后,前端页面没有渲染任何东西。由此可见入参检查在注入类得漏洞防御中可以起到立竿见影得作用。



Xpath 查询失败了,并没有返回任何结果,攻击被拦截之后,前端页面没有渲染任何东西。由此可见入参检查在注入类得漏洞防御中可以起到立竿见影得作用。

参考文献:
  • 大小: 19.9 KB
  • 大小: 18.7 KB
  • 大小: 9 KB
来自: OneAPM
2
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • layui输入框只允许输入中文且判断长度的例子

    今天小编就为大家分享一篇layui输入框只允许输入中文且判断长度的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  • 如何禁止在文本框中输入中文

    具体步骤: 方法一:用文本框的CSS属性ime-mode实现。       提示:设置ime-mode为disabled的意思是禁止在输入时禁止用户激活输入中文,韩文,日文等的输入法(IME)状态,因为这个只能检测到键盘的输入,对通过鼠标操作的粘贴和拖放无效。 方法二:在松开按键时用脚本检查文本框的值,只保留Unicode编码在0和255之间的字符。 function check(str){ v

  • js input 关闭输入法 chrome_Vim和中文输入法的完美结合

    这个问题真的是老掉牙了。现在还反复地被很多人讨论来讨论去。实际上我2016年就提供了一个完美的解决方案。分析见,https://blog.binchen.org/posts/how-to-input-non-english-character-in-evil-mode-efficiently.html​blog.binchen.org说白了就三句话,只可能在insert state里输入中文,所以...

  • js 设置 输入法 状态

    js实现焦点进入文本框内关闭输入法要用到的东西: imeMode:xxx有四个参数active 代表输入法为中文inactive 代表输入法为英文auto 代表打开输入法 (默认)disable 代表关闭输入法 这个应该算最常用的了。

  • 禁用文本框输入中文,禁用中文输入法的ImeMode方法

    之前遇到一个问题,在文本框切换输入法为中文后,使用扫码枪扫码时 会出现 比如条码NH123456 在文本框内会显示 你好23456 这里可以使用输入法编辑器ImeMode枚举属性 如果文本框只能输入英文数字,可以使用ImeMode.Disable,但默认不能拦截复制和粘贴按钮中文字符 如下属性ImeMode.Disable即可无法使用中文输入法只能输入字母数字,但无法禁用Ctrl+V复制粘贴键

  • js限制input输入

    1.取消按钮按下时的虚线框,在input里添加属性值 hideFocus 或者 HideFocus=true&lt;input type="submit" value="提交" hidefocus="true" /&gt; 2.只读文本框内容,在input里添加属性值 readonly&lt;input type="text" readonly /&gt; 3.防止退后清空的TEXT文档(可把...

  • 前端每日三问#200501怎样在文本框中禁用中文输入法?

    方法一:用文本框的CSS属性ime-mode实现 ime-mode属性介绍:设置或检索是否允许用户激活输入中文,韩文,日文等的输入法(IME)状态。 IME 是输入法编抄辑器 (Input Method Editor) 的英文缩写,它是一种专门的应用程序,用来输入代表东亚地区书面语言文字的不同字符。简体中文的 IME 将用户的击键转换袭为汉字。 默认值:auto 取值: auto : 不影响I...

  • [html] 怎样在文本框中禁用中文输入法?

    [html] 怎样在文本框中禁用中文输入法? 用文本框的 ime-mode css 属性 松开键时检查文本框的的值,只保留 Unicode 编码在 0 ~ 255 的字符 把所有双字节字符替换为空 把中文字符替换为空 个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题 ...

  • 输入框限制不允许输入中文

    思路:在输入过程中 将中文替换为"", string.replace(/[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/g, '');

  • layui输入框只允许输入中文且判断长度

    今天写项目遇到一个问题,在输入老师昵称的时候需要控制input输入框不能为空,且字符的长度有限制,英文字符不能超过20,中文不能超过10。输入课程简介的时候,textarea只能输入中文和中文标点,且长度不超过100。使用框架为:Thymeleaf + layui + shiro。 搜了很多资料没找到全的,现将具体实现展示如下: [不为空的要求:] 这个...

  • Input 输入中文 状态控制

    input 最常见的便是onChange方法,这个方法在input框内值(e.target.value)发生变化时,便会触发这个方法。 在输入中文的时候,拼音的过程中,onChange还是会不停的触发,这就带来了中文输入的bug,举一个栗子: 问题描述: input框中需要限制字符数量,比如限制成5个字符,再输入“成功”两个字的过程中,会出现还没有输入完成,体精警告字符太长,这样的情况。显然,...

  • EditControl 限制输入文本的l两种方法

    下边是两种限制编辑框输入内容的方法。在VS2003里建立基于对话框的应用程序CMyEdit,打开资源视图,删除对话框上自带的确定和取消按钮。然后添加一编辑框控件,将其ID修改为IDC_MY_EDIT,通过类向导给该编辑框添加控件变量m_edit_LimitInput。      比如,现在欲想在编辑框里只能输入十进制数,即“0123456789”这些字符。 方法一: BOO

  • 控制 input 输入框不能输入中文,即不能在输入框中使用输入法

    设置输入框的样式,代码如下

  • 如何禁用文本框输入中文

    一、引言最近在工作中遇到了这样的问题: 目前的密码输入框可以输入中文,需求要求提示用户不可以输入中文 那么,如何限制用户不能输入中文呢?二、厉害了,我的 ASCII 码网上搜寻了很久,有各种答案,尤其是正则表达式的方法,函数看得云里雾里的。最后在一个论坛里面看到了一位仁兄非常简洁的一个算式:ascii > 255顿时恍然大悟,厉害呀我的哥!这里,中文字符的编码定然大于 255 的编码,一般密码输

  • [转]禁用文本框中文输入法的通用方法

    &amp;lt;div&amp;gt;验证码&amp;lt;input type=&quot;text&quot; style=&quot;ime-mode:disabled&quot; /&amp;gt;&amp;lt;/div&amp;gt;

  • 浏览器文本输入框屏蔽输入法方案

    禁用输入法;屏蔽输入法;IME;Chrome;ime-mode: disabled;

  • Input输入框如何禁止输入中文

    设置输入框的样式,代码如下 &lt;span style="font-size:18px;"&gt;&lt;input type = "text" id = "jscaptcha_input" style="ime-mode:disabled;" maxlength="5"/&gt;&lt;/span&gt; 给输入框的样式添加 “ ime-mode:disabled” 即可限制输入框不能输入中文。 但该方法在谷歌浏览器中不管用,ie与火狐都支持 这种方式是最常见的,但是不支持谷歌,于是又找了一个新的方

Global site tag (gtag.js) - Google Analytics