清理 url 和参数

nwa*_*arp 3 security validation sanitization

目前,我的软件有以下工作流程

  1. 用户通过 REST API 执行搜索并选择一个项目
  2. 服务器再次执行相同的搜索以验证用户的选择

为了实现步骤 2,用户必须以字符串形式发送用于搜索的 URL 参数(例如age=10&gender=M)。

然后服务器将http_get(url + "?" + params_str_submitted_by_user)

恶意用户是否可以通过操纵使服务器连接到非预期的服务器params_str_submitted_by_user

如果甚至保留换行符并且用户可以任意操纵 HTTP 标头,最坏的情况是什么?

Sil*_*Fox 7

当您在分隔符之后附加params_str_submitted_by_user到基本 URL 时?,您可以免受此类将域上下文更改为用户名或密码的攻击:

假设 URL washttp://example.comparams_str_submitted_by_userwas,并且URL 字符串连接中@evil.com没有/或字符。?

这将使您的 URLhttp://example.com@evil.com实际上意味着example.com域中的用户名evil.com

但是,用户名不能包含?(也不能包含斜杠)字符,因此在强制连接用户名时应该是安全的。在你的情况下,URL 变为:

http://example.com?@evil.com
Run Code Online (Sandbox Code Playgroud)

或者

http://example.com/?@evil.com
Run Code Online (Sandbox Code Playgroud)

如果您在基本 URL 中包含斜杠(更好的做法)。这些是安全的,因为它所做的只是将您的网站evil.com作为查询字符串值传递,因为@evil.com解析器将不再将其解释为域。

如果甚至保留换行符并且用户可以任意操纵 HTTP 标头,最坏的情况是什么?

这取决于您的http_get函数在清理值方面的能力。如果http_get不在内部删除换行符,攻击者可能会控制从您的应用程序发送的标头。

例如,如果http_get内部创建以下请求

GET <url> HTTP/1.1
Host: <url.domain>
Run Code Online (Sandbox Code Playgroud)

所以在合法使用的情况下它会像下面这样工作:

http_get("https://example.com/foo/bar")
Run Code Online (Sandbox Code Playgroud)

产生

GET /foo/bar HTTP/1.1
Host: example.com
Run Code Online (Sandbox Code Playgroud)

攻击者可以设置params_str_submitted_by_user

<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n
Run Code Online (Sandbox Code Playgroud)

这会导致你的代码调用

http_get("https://example.com/" + "?" + "<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n")
Run Code Online (Sandbox Code Playgroud)

这会导致请求

GET / HTTP/1.1
Host: example.org
Cookie: foo=bar

 HTTP/1.1
Host: example.com
Run Code Online (Sandbox Code Playgroud)

根据http_get解析域的方式,这可能不会导致请求转到example.org-example.com它只是操纵标头(除非example.org另一个站点与您的站点具有相同的 IP 地址)。然而,攻击者已经设法操纵标头并添加他们自己的 cookie 值。攻击者的优势取决于他们在您的特定设置下这样做可以获得什么 - 不一定有任何一般优势,如果他们可以欺骗您的代码以意想不到的方式运行,那么这将更像是一种逻辑缺陷利用使其在攻击者的控制下发出请求。

你该怎么办?

为了防止出现意外和未知情况,请使用http_get能够正确处理标头注入的版本。现在许多现代语言都在内部处理这种情况。

或者 - 如果http_get是您自己的实现,请确保它清理或拒绝包含无效字符(例如回车符或换行符)以及 URL 中无效的其他参数的 URL。请参阅此问题以获取有效字符列表