文章目录
前言
JavaScript原型链污染是一种黑客攻击方式,利用JavaScript中的原型继承链来污染一个对象的原型继承链,从而影响整个应用程序的执行逻辑。攻击者会利用一些漏洞或者不恰当的代码实现,将恶意代码注入到原型对象中,然后通过继承链的方式将恶意代码传递给整个应用程序。
攻击者通常将恶意代码注入到全局对象或者重要对象的原型中,例如Object.prototype
、Array.prototype
等,从而污染整个应用程序。JavaScript原型链污染攻击常见的案例有:
- jQuery Prototype Pollution漏洞:攻击者通过修改jQuery的
jQuery.fn.extend
方法来污染Object.prototype
,使得在后续的代码中,可以在任何位置调用Object.prototype
中的方法,从而导致安全漏洞。 - npm原型链污染漏洞:攻击者通过在package.json中设置恶意依赖包的
__proto__
属性,或者通过在依赖包的代码中利用Object.assign()
函数来污染原型链,从而实现攻击。例如,攻击者可以通过在依赖包中注入get
和set
方法来盗取用户的敏感信息。 - AngularJS c o n t r o l l e r P r o v i d e r 漏洞:攻击者可以利用 controllerProvider漏洞:攻击者可以利用 controllerProvider漏洞:攻击者可以利用controllerProvider来动态加载控制器,从而污染原型链,并实现XSS攻击、跨站请求伪造(CSRF)和其他安全漏洞。攻击者可以通过注入恶意代码来改变原型链,从而实现攻击。
JavaScript原型链污染攻击是一种非常危险的黑客攻击方式,开发者应该注意代码的安全性,并尽可能避免使用全局对象或者原型链的方式来定义函数或者变量。
JavaScript原型链污染案例
baseUser = {
a:1
}
user = {
a:2,
b:1,
__proto__:{
c:3
}
}
// 这个函数的作用:浅复制一个对象,第一个参数位是对象的内容,后面的参数位是多个对象内容叠加进去,进行复制出一个全新的对象
let newUser = Object.assign({
}, baseUser, user)
// 无污染,结果正常
console.log(newUser) // {
a: 2, b: 1}
// 无污染,结果正常
console.log(newUser.__proto__) // {
constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
后端服务器是JavaScript,我们通过post发送过去的 json是字符串,JavaScript需要通过JSON.parse()函数才能把 json字符串转成对象
baseUser = {
a:1
}
// 这次使用函数把json字符串转成对象,就出问题了,
user = JSON.parse(' {"a" : 2 , "b" : 3 , "__proto__" : { "c" : 4 }} ')
// 这个函数的作用:浅复制一个对象,第一个参数位是对象的内容,后面的参数位是多个对象内容叠加进去,进行复制出一个全新的对象
let newUser = Object.assign({
}, baseUser, user)
console.log(newUser) // {
a: 2, b: 1} ,__proto__是隐藏属性,是不会直接显示的
console.log(newUser.__proto__) // {
c: 4} ,但是一打印就出来了
console.log(newUser.c) // 4 ,已经被污染了,这个属性是一直存在的
一、wife_wife
1.题目
2.答题
打开题目看到以下页面
进行原型链污染测试
注册了管理员账号后,进去之后
得到flag:CatCTF{test_flag_h0w_c@n_I_l1ve_w1th0ut_nilou}