如何控制从我的网站发出的请求中 HTTP HOST 标头的内容?

信息安全 http xss 阿贾克斯
2021-08-14 19:58:21

有没有人熟悉我可以在我的网站上发布链接的方式,当访问该链接时,用户会向第 3 方站点发出 HTTP 请求,其中包含 HOST 标头中的自定义内容(与实际的主机/域不同)请求被发送到 IP 级别)?一个简短的例子来说明我的意图 - 发送到 www.example.com 的请求:

GET / HTTP/1.1
Host: $$CUSTOM_PAYLOAD$$ (not www.example.com)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

我已经看过一些关于使用 CUSTOM 标头发出请求的主题的讨论,但情况并非如此,因为标头是接收方接受的合法标头。此外,我还看到过各种关于攻击(主要反映 XSS)的出版物,这些攻击依赖于 HOST 标头中的恶意输入,尽管我不太确定它们是如何执行的。

3个回答

如果您希望用户发出请求,则无法使用 XMLHttpRequest 执行此操作:

如果标头与以下标头之一不区分大小写,则终止这些步骤:

接受字符集

接受编码

访问控制请求标头

访问控制请求方法

联系

内容长度

曲奇饼

饼干2

日期

DNT

预计

主持人

活着

起源

推荐人

TE

预告片

传输编码

升级

用户代理

通过

但是,由于与 IE 结合使用时版本 7 和 8中的错误,这在 Flash 中确实是可能的:

在 IE 中,还可以通过将冒号附加到标头名称来覆盖一些更敏感的标头(例如 Host 和 Content-Length)(此技术在 [3] 中的 XmlHttpRequest 上下文中进行了描述):

req.addRequestHeader("Host:","foobar.site");

使用像 cURL 这样的工具,您可以发出请求并指定您想要的任何请求。 这篇文章Host介绍了在请求中设置标头。

由于您控制网站,您是否可以让链接向您自己的服务器发起请求,该请求使用 cURL 或其他允许您指定Host标头的工具向目标站点触发自定义 HTTP 请求?

根据您在服务器端使用的编程语言,您可以直接从那里执行它,这将是一个更好的选择。

更新:这不起作用。感谢 OP 的尝试!留下“答案”以节省其他人的时间:)

免责声明:我没有尝试过,也不知道它是否会起作用:)

如果您的页面包含 JavaScript,理论上可以使用XMLHttpRequestsetRequestHeader来生成您描述的请求。