我有两个PHP应用程序,一个在localhost:8080
上(漏洞),另一个在localhost:42069
上(攻击者)。8080
有一个登录页面,在登录时会保存一个cookie。42069
不设置cookie(没有PHP代码),只有一个HTML表单,该表单使用注销POST请求将用户从8080
注销。
当我登录8080
后在42069
登录document.cookie
时,我看到了与8080
相同的cookie。
这是怎么回事?
应用程序源代码repo。使用start.sh
运行应用程序。
1条答案
按热度按时间kxe2p93d1#
这是因为这两个网站有相同的域
localhost
。您的浏览器存储每个域的Cookie,这是由协议(http
,https
)之后和第一个/
之前的部分决定的。在您的情况下,localhost:8080
和localhost:42069
被视为同一个域。在第页上设置的Cookie也可用于另一页。此行为在RFC6265中定义
1.Introduction
[...]
由于历史原因,cookie包含许多安全和隐私缺陷。例如,服务器可以指示给定cookie用于"安全"连接,但安全属性在存在活跃网络攻击者时不提供完整性。**同样,给定主机的cookie在该主机上的所有端口共享。即使web浏览器使用的通常的"同源策略"隔离了经由不同端口检索的内容。
还有
8.5.弱机密性
如果您希望这两个应用拥有独立的Cookie,您可以尝试使用子域或不同的顶级域:例如
app1.localhost:8080
和app2.localhost:42069
。这可能会导致浏览器单独存储Cookie。请注意,这并不能保证工作,请参见此处
8.6.弱完整性
Cookies do not provide integrity guarantees for sibling domains (and their subdomains). For example, consider foo.example.com and bar.example.com. The foo.example.com server can set a cookie with a Domain attribute of "example.com" (possibly overwriting an existing "example.com" cookie set by bar.example.com), and the user agent will include that cookie in HTTP requests to bar.example.com. In the worst case, bar.example.com will be unable to distinguish this cookie from a cookie it set itself. The foo.example.com server might be able to leverage this ability to mount an attack against bar.example.com.
保证解决方案
localhost
上运行一个页面,而在127.0.0.1
或127.0.0.2
等上运行另一个页面。**因为这是两个不同的域。意味着localhost
上的cookie不能与127.0.0.x
共享,反之亦然。在Linux上,可以使用
/etc/hosts
为127.0.0.1
创建比localhost
更多的cookie域。例如/etc/主机
然后,您可以修改脚本以:
现在,您必须更改表单中的链接:
在Windows 10中,主机文件位于
c:\Windows\System32\Drivers\etc\hosts
。