php 在不同的本地主机源设置相同的cookie

hwamh0ep  于 2023-01-04  发布在  PHP
关注(0)|答案(1)|浏览(152)

我有两个PHP应用程序,一个在localhost:8080上(漏洞),另一个在localhost:42069上(攻击者)。
8080有一个登录页面,在登录时会保存一个cookie。
42069不设置cookie(没有PHP代码),只有一个HTML表单,该表单使用注销POST请求将用户从8080注销。
当我登录8080后在42069登录document.cookie时,我看到了与8080相同的cookie。
这是怎么回事?
应用程序源代码repo。使用start.sh运行应用程序。

kxe2p93d

kxe2p93d1#

这是因为这两个网站有相同的域localhost。您的浏览器存储每个域的Cookie,这是由协议(httphttps)之后和第一个/之前的部分决定的。在您的情况下,localhost:8080localhost:42069被视为同一个域。在第页上设置的Cookie也可用于另一页。
此行为在RFC6265中定义
1.Introduction
[...]
由于历史原因,cookie包含许多安全和隐私缺陷。例如,服务器可以指示给定cookie用于"安全"连接,但安全属性在存在活跃网络攻击者时不提供完整性。**同样,给定主机的cookie在该主机上的所有端口共享。即使web浏览器使用的通常的"同源策略"隔离了经由不同端口检索的内容。
还有
8.5.弱机密性

    • Cookie不提供端口隔离。**如果运行在一个端口上的服务可以读取Cookie,则运行在同一服务器的另一个端口上的服务也可以读取Cookie。

如果您希望这两个应用拥有独立的Cookie,您可以尝试使用子域或不同的顶级域:例如app1.localhost:8080app2.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.1127.0.0.2等上运行另一个页面。**因为这是两个不同的域。意味着localhost上的cookie不能与127.0.0.x共享,反之亦然。
#!/bin/bash
if ! ( which php > /dev/null ); then
    echo 'error: php not installed'
    exit 1
fi

php -S localhost:8080 --docroot=website-vuln/public/ 2>> vuln.log >> vuln.log &
php -S 127.0.0.1:42069 --docroot=website-evil/public/ 2>> evil.log >> evil.log &

echo vuln server @ http://localhost:8080
echo evil server @ http://127.0.0.1:42069

在Linux上,可以使用/etc/hosts127.0.0.1创建比localhost更多的cookie域。
例如/etc/主机

127.0.0.1    app1
127.0.0.1    app2

然后,您可以修改脚本以:

#!/bin/bash
if ! ( which php > /dev/null ); then
    echo 'error: php not installed'
    exit 1
fi

php -S app1:8080 --docroot=website-vuln/public/ 2>> vuln.log >> vuln.log &
php -S app2:42069 --docroot=website-evil/public/ 2>> evil.log >> evil.log &

echo vuln server @ http://app1:8080
echo evil server @ http://app2:42069

现在,您必须更改表单中的链接:

<form method="POST" action="http://app1:8080/">

在Windows 10中,主机文件位于c:\Windows\System32\Drivers\etc\hosts

相关问题