正在清理 url 和参数
Sanitizing url and parameters
目前,我的软件有以下工作流程
- 用户通过 REST API 执行搜索并选择一个项目
- 服务器再次执行相同的搜索以验证用户的选择
为了执行第 2 步,用户必须将他用于搜索的 URL 参数作为字符串发送(例如 age=10&gender=M
)。
服务器将http_get(url + "?" + params_str_submitted_by_user)
恶意用户能否通过操纵 params_str_submitted_by_user
使服务器连接到非预期的服务器?
如果甚至保留换行符并且用户可以任意操作 HTTP,最坏的情况是什么 headers?
由于您在 ?
定界符后将 params_str_submitted_by_user
附加到基础 URL 中,因此您可以免受此类攻击用户名或密码:
假设 URL 是 http://example.com
而 params_str_submitted_by_user
是 @evil.com
而您的 /
或 ?
字符中没有=83=] 字符串连接.
这将使您的 URL http://example.com@evil.com
实际上意味着域 evil.com
.
的用户名 example.com
但是,the username cannot contain the ?
(nor slash) character,所以你应该是安全的,因为你强制连接用户名。在你的情况下 URL 变为:
http://example.com?@evil.com
或
http://example.com/?@evil.com
如果你在基础中包含斜杠 URL(更好地练习)。这些是安全的,因为它所做的只是将您的网站 evil.com
作为查询字符串值传递,因为 @evil.com
将不再被解析器解释为域。
What is the worst case scenario if even newlines are left in and the user can arbitrarily manipulate the HTTP headers?
这取决于您的 http_get
函数在清理值方面的表现。如果 http_get
不在内部去除换行符,攻击者可能会控制从您的应用程序发送的 headers。
例如如果http_get
内部创建了以下请求
GET <url> HTTP/1.1
Host: <url.domain>
所以在合法使用下它会像下面这样工作:
http_get("https://example.com/foo/bar")
生成
GET /foo/bar HTTP/1.1
Host: example.com
攻击者可以将 params_str_submitted_by_user
设置为
<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n
这会导致您的代码调用
http_get("https://example.com/" + "?" + "<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n")
这将导致请求成为
GET / HTTP/1.1
Host: example.org
Cookie: foo=bar
HTTP/1.1
Host: example.com
根据 http_get
解析域的方式,这可能不会导致请求转到 example.org
而不是 example.com
- 它只是在操纵 header(除非example.org
是另一个站点 ,IP 地址 与您的站点相同)。然而,攻击者设法操纵了 headers 并添加了他们自己的 cookie 值。攻击者的优势取决于他们这样做在您的特定设置下可以获得什么 - 不一定有任何一般优势,如果他们可以欺骗您的代码以意想不到的方式运行,那将更像是一种逻辑缺陷利用导致它在攻击者的控制下发出请求。
你应该怎么做?
为了防止意外和未知情况,请使用能够正确处理 header 注入的 http_get
版本。许多现代语言现在在内部处理这种情况。
或者 - 如果 http_get
是您自己的实现,请确保它清理或拒绝包含无效字符的 URLs,例如回车 returns 或换行和其他无效参数在URL。 See this question for list of valid characters.
目前,我的软件有以下工作流程
- 用户通过 REST API 执行搜索并选择一个项目
- 服务器再次执行相同的搜索以验证用户的选择
为了执行第 2 步,用户必须将他用于搜索的 URL 参数作为字符串发送(例如 age=10&gender=M
)。
服务器将http_get(url + "?" + params_str_submitted_by_user)
恶意用户能否通过操纵 params_str_submitted_by_user
使服务器连接到非预期的服务器?
如果甚至保留换行符并且用户可以任意操作 HTTP,最坏的情况是什么 headers?
由于您在 ?
定界符后将 params_str_submitted_by_user
附加到基础 URL 中,因此您可以免受此类攻击用户名或密码:
假设 URL 是 http://example.com
而 params_str_submitted_by_user
是 @evil.com
而您的 /
或 ?
字符中没有=83=] 字符串连接.
这将使您的 URL http://example.com@evil.com
实际上意味着域 evil.com
.
example.com
但是,the username cannot contain the ?
(nor slash) character,所以你应该是安全的,因为你强制连接用户名。在你的情况下 URL 变为:
http://example.com?@evil.com
或
http://example.com/?@evil.com
如果你在基础中包含斜杠 URL(更好地练习)。这些是安全的,因为它所做的只是将您的网站 evil.com
作为查询字符串值传递,因为 @evil.com
将不再被解析器解释为域。
What is the worst case scenario if even newlines are left in and the user can arbitrarily manipulate the HTTP headers?
这取决于您的 http_get
函数在清理值方面的表现。如果 http_get
不在内部去除换行符,攻击者可能会控制从您的应用程序发送的 headers。
例如如果http_get
内部创建了以下请求
GET <url> HTTP/1.1
Host: <url.domain>
所以在合法使用下它会像下面这样工作:
http_get("https://example.com/foo/bar")
生成
GET /foo/bar HTTP/1.1
Host: example.com
攻击者可以将 params_str_submitted_by_user
设置为
<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n
这会导致您的代码调用
http_get("https://example.com/" + "?" + "<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n")
这将导致请求成为
GET / HTTP/1.1
Host: example.org
Cookie: foo=bar
HTTP/1.1
Host: example.com
根据 http_get
解析域的方式,这可能不会导致请求转到 example.org
而不是 example.com
- 它只是在操纵 header(除非example.org
是另一个站点 ,IP 地址 与您的站点相同)。然而,攻击者设法操纵了 headers 并添加了他们自己的 cookie 值。攻击者的优势取决于他们这样做在您的特定设置下可以获得什么 - 不一定有任何一般优势,如果他们可以欺骗您的代码以意想不到的方式运行,那将更像是一种逻辑缺陷利用导致它在攻击者的控制下发出请求。
你应该怎么做?
为了防止意外和未知情况,请使用能够正确处理 header 注入的 http_get
版本。许多现代语言现在在内部处理这种情况。
或者 - 如果 http_get
是您自己的实现,请确保它清理或拒绝包含无效字符的 URLs,例如回车 returns 或换行和其他无效参数在URL。 See this question for list of valid characters.