Notes Site.
post @ 2024-02-20

Python Prototype Pollution

Python原型链污染通常是指通过某种方式非法地修改了对象的原型链,导致对象访问到了不应该访问到的属性或方法,或者对象的属性被非法地修改

Python中,这通常意味着通过修改类的__dict__或对象的__class__属性,来实现对类或对象属性的非法修改

基类

1
2
3
4
5
6
7
8
9
string = ""
print(string.__class__) # <class 'str'>
print(string.__class__.__base__) # <class 'object'>

def function():
pass
print(function.__class__) # <class 'function'>
print(function.__class__.__base__) # <class 'object'>

原型链污染

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class father:
secret = "xxxx"
class son_a(father):
pass
class son_b(father):
pass

# 将源字典 src 中的键值对合并到目标对象 dst 中
def merge(src, dst):
for k, v in src.items():
if hasattr(dst, '__getitem__'):
if dst.get(k) and type(v) == dict:
merge(v, dst.get(k))
else:
dst[k] = v
elif hasattr(dst, k) and type(v) == dict:
merge(v, getattr(dst, k))
else:
setattr(dst, k, v)

instance = son_b()
payload = {
"__class__": {
"__base__": {
"secret": "no"
}
}
}

print(son_a.secret) # xxxx
print(instance.secret) # xxxx

merge(payload, instance)
print(son_a.secret) # no
print(instance.secret) # no


# 污染内置属性
# payload = {
# "__class__" : {
# "__base__" : {
# "__str__" : "Polluted"
# }
# }
# }
#
# print(father.__str__) #<slot wrapper '__str__' of 'object' objects>
# merge(payload, instance)
# print(father.__str__) #Polluted

无法污染的Object

1
2
merge(payload, object)
# 报错:TypeError: can't set attributes of built-in/extension type 'object'

全局变量获取

Read More
post @ 2024-02-02

JavaScript Prototype Pollution

JavaScript中的原型链污染是指攻击者通过覆盖或修改对象的原型链上的属性,从而改变对象的行为或者访问不应该访问的属性或方法

原型链污染通常发生在JavaScript对象的继承机制中,因为JavaScript是一种基于原型的语言,对象会继承其原型链上的所有属性和方法

JS原型链污染分,客户端原型污染、服务端原型污染

JavaScript 原型

JavaScript 中的原型是一个对象,它在创建新对象时被用来作为新对象的初始属性

1
2
3
4
5
6
7
username = ""
username.__proto__
username['__proto__']

username.__proto__ // String.prototype
username.__proto__.__proto__ // Object.prototype
username.__proto__.__proto__.__proto__ // null

JavaScript 原型链

原型链实现继承

当一个新对象被创建时,它会从构造函数的 prototype 属性指向的对象那里继承属性和方法

Read More
⬆︎TOP