nwa*_*arp 3 security validation sanitization
目前,我的软件有以下工作流程
为了实现步骤 2,用户必须以字符串形式发送用于搜索的 URL 参数(例如age=10&gender=M)。
然后服务器将http_get(url + "?" + params_str_submitted_by_user)
恶意用户是否可以通过操纵使服务器连接到非预期的服务器params_str_submitted_by_user?
如果甚至保留换行符并且用户可以任意操纵 HTTP 标头,最坏的情况是什么?
当您在分隔符之后附加params_str_submitted_by_user到基本 URL 时?,您可以免受此类将域上下文更改为用户名或密码的攻击:
假设 URL washttp://example.com和params_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。请参阅此问题以获取有效字符列表。
| 归档时间: |
|
| 查看次数: |
16603 次 |
| 最近记录: |