别只盯着__proto__了,constructor才是原型污染的赏金“后门”

admin 2026-05-14 11:17:30 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文指出防御原型污染时仅过滤proto存在局限,揭示通过constructor.prototype属性可绕过限制实现原型链污染,并举例说明单次非递归过滤的缺陷,强调需采用更全面的防御策略。 综合评分: 85 文章分类: web安全,漏洞分析


cover_image

别只盯着 __proto__ 了,constructor 才是原型污染的赏金“后门”

原创

升斗安全XiuXiu 升斗安全XiuXiu

升斗安全

2026年5月13日 08:18 广东

在小说阅读器读本章

去阅读

【文章说明】

  • 目的:本文内容仅为网络安全技术研究与教育目的而创作。
  • 红线:严禁将本文知识用于任何未授权的非法活动。使用者必须遵守《网络安全法》等相关法律。
  • 责任:任何对本文技术的滥用所引发的后果自负,与本公众号及作者无关。
  • 免责:内容仅供参考,作者不对其准确性、完整性作任何担保。

阅读即代表您同意以上条款。

作为一名混迹漏洞赏金圈多年的老司机,我见过太多人把“过滤 __proto__”当成银弹,以为只要把这个键删了就万事大吉。今天咱们就来聊聊一个更风骚的绕过姿势,不用 __proto__ 这几个字母,照样能把原型链玩弄于股掌之间。

原型污染:不是只有 __proto__ 才能“开后门”

我们之前聊得最多的方法,就是利用 __proto__ 这个属性直接拿到对象原型。这套拳法实在太过经典,以至于现在很多开发者的防御手段就是一句话:合并数据前,把键名叫 __proto__ 的属性统统干掉。

这种一刀切的思路,其实藏着个大坑。因为在 JavaScript 的世界里,能搞原型污染的路径可不止这一条。就算你把 __proto__ 彻底封死,攻击者照样能找到捷径,做到全程不碰“proto”这个字符串。

要理解这条暗道,得先认识每个对象身上那个老实巴交的 constructor 属性。

constructor 的另一重身份

只要没被刻意改过原型,随便一个对象都有 constructor,它指向创建这个对象的构造函数。比如咱们日常写对象:

let myObjLiteral = {};          // 字面量大法let myObj = new Object();       // 标准构造函数创建

这两种方式搞出来的普通对象,都能通过 constructor 找到它们的“造物主”,也就是Object 构造函数:

myObjLiteral.constructor   // function Object(){...}myObj.constructor          // function Object(){...}

别忘了,函数在 JavaScript 里也是对象。每个构造函数身上都挂着个 prototype 属性,这个属性指向的,正是所有由它创建的实例共享的那个原型对象。

这就有意思了,咱们换个姿势,照样能摸到 Object.prototype:

myObj.constructor.prototype        // 等于 Object.prototypemyString.constructor.prototype     // 等于 String.prototypemyArray.constructor.prototype      // 等于 Array.prototype

看出来了吗?myObj.constructor.prototype 跟 myObj.__proto__ 指向的是同一个东西。这就好比同一间屋子,你从正门(__proto__)被堵死了,转头却发现旁边还有一扇没上锁的侧门(constructor.prototype)。

逗你玩的过滤:只洗一次怎么够

顺着这个思路,咱们再来看看开发者常犯的另一个毛病:只对字符串做一次清洗,还不递归处理。

假设你拿到的输入 URL 长这样:

vulnerable-website.com/?__pro__proto__to__.gadget=payload

服务器那边的过滤逻辑如果很简单粗暴——只是找到 __proto__ 这个子串然后把它替换成空字符串,并且只执行一次,那乐子就大了。字符串被处理后,内嵌的 __proto__ 被“抠”掉,剩下的部分刚好又拼成了一个完整的 __proto__:

vulnerable-website.com/?__proto__.gadget=payload

一个干干净净、能把恶意属性注入原型链的载荷就这么凭空出现了。这种绕过方式就像剥洋葱,你以为剥掉一层就安全了,结果人家只是往里藏了一层,防不胜防。

防御原型污染,光盯着 __proto__ 这个字符串做文章是远远不够的。constructor.prototype 这条暗道,以及那些偷懒的、不深度递归的过滤逻辑,都是赏金猎人们挖出漏洞的优质攻击面。下次碰到这类场景,直接用这些“旁门左道”,大概率能挖到高危漏洞。

觉得有帮助?点个“在看”分享给身边的猎友,一起搞钱。 你还见过哪些奇技淫巧的绕过案例?来评论区唠一唠。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:升斗安全 升斗安全XiuXiu 升斗安全XiuXiu《别只盯着 proto 了,constructor 才是原型污染的赏金“后门”》

评论:0   参与:  0