将 & 号注入 url

信息安全 Web应用程序 注射
2021-09-06 10:42:59

假设有一个程序通过 GET 向服务器发送一些数据:

http://server.com/gateway?value1=abc&value3=def

然后服务器进一步发送这些值,添加 value2:(python 代码)

SECURED_VALUE = "safe"
"http://externalAPI.com/?value1={0}&value2={1}&value3={2}".format ( get['value1'], SECURED_VALUE, get['value2'] )

我的观点是,我可以通过以下方式为后一个请求注入另一个属性:

http://server.com/gateway?value1=abc&&value2=hacked&value3=def&&value2=hacked

那么服务器 --> API 请求如下所示:

http://externalAPI.com/?value1=abc&value2=hacked&value2=safe&value3=def&value2=hacked

外部 API 很可能只读取最后一次或第一次出现的重复键。

所以我有两个问题,主要是,如果这样的黑客是可能的,一个应该保护他的应用程序免受它。其次,如何实际做到这一点,不仅可以通过 GET 方法,还可以通过 POST,或者通过修改 JSON 编码的字符串。用 & 号或分号解码 JSON 会给我一个错误,将 & 号放在 POST 方法中的行为与 GET 方法中的行为相同。

我问这个是因为我发现了一些安全问题,并且我目前正在编写一个成功的黑客尝试示例,以防服务器开发人员没有去除与号和其他危险字符。我不想变成一个愚蠢的家伙,不知道这种注射不能进行,只是在浪费管理员的时间,所以我想我会先问你。

第三,小问题,您知道如何在Google App Engine,python,webapp2框架中保护自己免受注入(使用哪些功能)的任何好的智慧来源吗?

1个回答

概述。是的。你说的对。很高兴注意到这一点。

细节。这基本上是HTTP 参数污染漏洞的一个实例。这基本上是一个注入漏洞(类似于 XSS,只是它是注入 HTTP 参数而不是注入 HTML)。

防御。为了防止这种情况,我建议你做两件事:

  1. 清理参数值。建立一个预期会出现在您的查询中并且在此上下文中也已知是安全的字符的白名单(确保它不包括&, ?, =, #, %),并去除参数值中不在白名单中的所有内容.

  2. URL 对参数值进行编码,然后再将它们插入到新查询中。

相关研究。 另见以下研究论文: