原型链
原型链污染攻击
前言:最近好几次的比赛都碰到了原型链污染攻击的题目,这些题目都有一个普遍的特点,看起来就像是一个简单的注入或者其他常规类型的题目,如果不认真查看,真的就会根本找不到入口。因为之前没有这方面的技术,所以今天也来补一下这个技术栈。
参考链接:1.链式调用https://juejin.cn/post/6844904030221631495
一 什么是原型链污染
首先要了解什么是原型链,下面给出一些比较详细的链接:https://www.cnblogs.com/aoyo/p/5245162.html


这是两个简单的示例,这里就说一个点,
1. _proto_是所有对象(包括函数)都有的,它才叫做对象的原型,原型链就是靠它形成的。
2. prototype只有函数(准确地说是构造函数)才有的。它跟原型链没有关系。它的作用是:构造函数new对象的时候,告诉构造函数新创建的对象的原型是谁。

还有这个该死的小细节
二 XNUCA的ooooldjs 和 安讯杯的 validator
首先我们来看一下题目环境.

后面这些都是一些常规的代码套用,我们主要是看图中的middlewares到底是怎么运作的,现在我们就偷一个官方wp中的demo来跑一下。
const express = require('express')
const app = express()
const port = 9000
app.use(express.json())
app.use(express.urlencoded({
extended: true
}))
const {
body,
validationResult
} = require('express-validator')
middlewares = [
body('*').trim() // 对所以键值进行trim处理
]
app.use(middlewares)
app.post("/user", (req, res) => {
const foo = "hellowrold"
return res.status(200).send(foo)
})
app.listen(port, () => {
console.log(`server listening on ${port}`)
})

获得上帝之眼的调试能力。这是body的实现地方。

然后我们的body就被传入了以下的地方

并且安排了一个runner在那里异步执行中。注意在此处的return的表达式中,将middleware的属性全部绑到了上面,使他获得了力量,根据原文也可以知道,这里就是将所有的东西都全部拷在了他一个人的身上,然后用他来和express进行交互。
然后我们开始发起请求。


这个stack中的数据是根据我们的传入的body和middler规则生成的一个过滤器,现在在下面进行run方法调用。
我们继续跟下去,发现了loadash的一个漏洞位置了,这里就是一个漏洞点了
上面的get是他获取路径的方法,下面的set就是涉及到原型链污染中的属性赋值的问题了,我们也就不继续跟下去了,因为这里已经知道了(并且注意避开重复参数名字就可以了)。
我们重新回到那个获取body中对应键数据的位置,就是instances

匹配到点号就给他加个中括号。这些功能点复习完毕了,看看漏洞点就是下面这个。

{"\"].__proto__[\"test": "123 "}
利用他匹配.自动加[] 的机制让取出来的path 他会拿这些path来进行比对,在前面的对象中进行搜寻有没有这个键的数据,如果有就不能通过,这就是操蛋设计,他的value值就会变成你给的value值,就不会调用一个API(一会解决这个问题,然后我们就会发现,他成功地提取出了这个prototype的键,并马上就会对他进行污染。嘿嘿。
这里还有一个点需要进行绕过,那就是当系统拿着get方法的键来找的body要值的时候,发现,我去,没有这个值,然后就会自动给个空值,然后我们又要来绕过这个地方。

他拿来进行寻找值的键,tokey函数又是一个不好惹的东西,他会对【】转换成path,然后再进行嘿嘿,就会方便很多,这样
{"a": {"__proto__": {"test": "testvalue"}}, "a\"].__proto__[\"test": 222}
安洵杯的那道题就到这里结束了。其实那个body的没有什么鸟用(不管怎么配置都会触发)。
XNUCA的题目涉及知识点
1.异步编程的bug
2.jquery的远古RCE
3.上面 loadsh的原型链污染

浙公网安备 33010602011771号