0

我们在应用程序中使用 ESAPI 安全层。我们还设计为从浏览器端传递的通配符搜索使用“%”字符。这是一个糟糕的选择,并且已作为遗留设计继承下来,以便轻松构建 sql 以在后端运行。

现在,输入中的“%”字符被 ESAPI 验证器拒绝,以防止双重编码攻击。我们正在积极寻求将 '%' 替换为 '*' 之类的想法。但在此期间,为了能够使用 '%' 进行通配符搜索,我们正在权衡这些选项中的选项:

1) 关闭 ESAPI 规范化器。(坏主意,为双重编码留下漏洞。)

2) 在安全层中,在过滤器通过之前,将所有 '%' 替换为某个不太可能的字符。然后换回来。(对此人们有不同的看法,有人认为这就像没有防御双重编码攻击一样好,其他人认为它有一些价值。)

3)在前端应用程序中,让用户输入'%',但在提交到服务器之前将它们替换为'*'。将需要在 DAO 层中再次将 '*' 操作为 '%'。将需要在所有可以采用通配符输入的 UI 代码中进行最多的代码更改。

想请教如何最好地解决这个问题。感谢任何帮助。

4

1 回答 1

1

这是一个糟糕的选择,并且已作为遗留设计继承下来,以便轻松构建 sql 以在后端运行。

这向我表明您的根本问题不是 aMixedEncodingException并且它的 SQL 注入。(SQLi)

在后端重写查询以使用PreparedStatements. 防止注入攻击的唯一有保证的解决方案是正确编码正确的上下文。由于您使用用户输入来帮助构建 SQL 查询,因此正确的上下文是 SQL。

至于MixedEncodingException您最好的选择是选项 3。您可以只对您的百分比进行 HTML 编码。理论上%%您的有效负载将仅包含 HTML 编码的数据。

但请记住,您在客户端上所做的任何转换对攻击者都是可见的,我会在这个线程上拖拽。先修复 SQLi,稍后再考虑 MixedEncoding。

于 2018-01-09T20:03:17.313 回答