Python Prototype Pollution
Python原型链污染通常是指通过某种方式非法地修改了对象的原型链,导致对象访问到了不应该访问到的属性或方法,或者对象的属性被非法地修改
Python中,这通常意味着通过修改类的__dict__
或对象的__class__
属性,来实现对类或对象属性的非法修改
基类
1 2 3 4 5 6 7 8 9
| string = "" print(string.__class__) print(string.__class__.__base__)
def function(): pass print(function.__class__) print(function.__class__.__base__)
|
原型链污染
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
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) print(instance.secret)
merge(payload, instance) print(son_a.secret) print(instance.secret)
|
无法污染的Object
全局变量获取
Read More
JavaScript Prototype Pollution
JavaScript中的原型链污染是指攻击者通过覆盖或修改对象的原型链上的属性,从而改变对象的行为或者访问不应该访问的属性或方法
原型链污染通常发生在JavaScript对象的继承机制中,因为JavaScript是一种基于原型的语言,对象会继承其原型链上的所有属性和方法
JS原型链污染分,客户端原型污染、服务端原型污染
JavaScript 原型
JavaScript 中的原型是一个对象,它在创建新对象时被用来作为新对象的初始属性
1 2 3 4 5 6 7
| username = "" username.__proto__ username['__proto__']
username.__proto__ username.__proto__.__proto__ username.__proto__.__proto__.__proto__
|

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