如何从代码层防御10大安全威胁中的 Xpath Injection?(如何应对漏洞带来的安全威胁)

网友投稿 804 2022-09-21

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

如何从代码层防御10大安全威胁中的 Xpath Injection?(如何应对漏洞带来的安全威胁)

普遍性和可检测性:

影响严重:

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

从代码层次如何防御:

javax.xml.xpathorg.jdom.xpathorg.jdom2.xpath等

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

然后通过CheckMap(finnal Map params)方法,检查入参是否合法。

下面我们来实现这个CheckMap内部方法:

1. 通过遍历检查Map中key得合法性

for (final String key : params.keySet()) { if (this.checkString(key)) { return true; }

2.检查每一个 key 对应得 value 得合法性:

final Collection coll = (Collection)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 boundaries, final int value) { for (final int x : boundaries) { if (x >= value) { return x; } } return -1;}

漏洞攻击示例

看完代码是如何检查得我们来一个真真正正 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

上一篇:如何在 ASP.NET 4.6 与 IIS10 中运用 HTTP/2 ?(如何在pdf上编辑文字)
下一篇:网站性能优化— WebP 全方位介绍(网站性能优化前端)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~