AIOps 一场颠覆传统运维的盛筵
804
2022-09-21
如何从代码层防御10大安全威胁中的 Xpath Injection?(如何应对漏洞带来的安全威胁)
普遍性和可检测性:
影响严重:
注入能导致数据丢失或数据破坏、缺乏可审计性或者是拒绝服务。注入漏洞有时候甚至能导致完全主机接管。
从代码层次如何防御:
javax.xml.xpathorg.jdom.xpathorg.jdom2.xpath等
答案是可以防御大部分注入攻击,下面我们就一起来看一下如何进行有效得进行入参检查:我们将入参都转化为 Map 对象,Map
然后通过CheckMap(finnal Map
下面我们来实现这个CheckMap内部方法:
1. 通过遍历检查Map中key得合法性
for (final String key : params.keySet()) { if (this.checkString(key)) { return true; }
2.检查每一个 key 对应得 value 得合法性:
final Collection
做完这些就是细节方面得检测了,具体得就是 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
漏洞攻击示例
看完代码是如何检查得我们来一个真真正正 Xpath 注入的示例;来检验一下我们代码是都有效。
*我们找到 Xpath Injection 得 lession *,如下图:
hints提示我们攻击的入参:
Try username: Smith' or 1=1 or 'a'='a and a password: anything
面对这样得一种攻击那么我们该如何防御呢?如果对代码感兴趣得同学可以把 WebGoat 得源码 down 下来;然后将上面得入参检测得方法封装一下嵌入到 WebGoat 得源码中,然后我们再攻击一下,那么接下来会发生什么样的事情呢?
Xpath 查询失败了,并没有返回任何结果,攻击被拦截之后,前端页面没有渲染任何东西。由此可见入参检查在注入类得漏洞防御中可以起到立竿见影得作用。
参考文献:
[1] OWASP TOP10-2013 release
发表评论
暂时没有评论,来抢沙发吧~