Comparison problem
자바스크립트는 두 값을 비교할 때 ,두 값 모두 객체가 아닐경우 valueOf, toString 함수를 이용해 원시 값을 가져와 비교하게 됨.
var a = {}
console.log(a.toString()); // [object Object]
a.toString = () => 'dreamhack';
console.log(a == 'dreamhack'); // true
a.valueOf = () => 'dreamhack2';
console.log(a == 'dreamhack2'); // true
객체 a의 문자열 원시값은 object object 이다.
toString을 'dreamhack'을 반환하도록 수정하고 a와 'dreamhack'을 비교하니 true 반환
이를 통해 문자열과의 비교에서 toString을 통해 비교함을 알 수 있음
valueOf를 통해 dreamhack2를 반환하도록 수정하고 'dreamhack2'와 비교하니 true반환
toString전에 valueOf가 먼저 호출 됨.
Array's String Primitive
var req = {secret: A}
if ("secretValue" == req.secret) {
data = req.secret.charAt(0)
/* ... */
}
A에 "secretValue" 문자열 넣은 경우 s 출력
A에 ["secretValue"]의 경우 Array의 문자열 비교시 문자열 원시 값은 Array.join(array,',')와 일치.
=> Array내 내용을 모두 이어서 붙임
if문은 무사 통과지만 array의 경우 charAt() 메소드가 없으므로 에러 발생.
// Uncaught TypeError: req.secret.charAt is not a function
Prototype Pollution
var x = {a: 0}
x.__proto__.a = 1337
x.__proto__.b = 1
Object.prototype.c = 2
var y = Object.create(x); // x를 프로토타입으로 가지는 오브젝트 생성.
console.log(y.__proto__ == x); // true
var z = {}
console.log(z.__proto__ == y.__proto__); // false
console.log(z.__proto__ == x.__proto__); // true
console.log(z.__proto__ == y.__proto__.__proto__); // true
console.log(y.a); // 0
console.log(y.b); // 1
console.log(y.c); // 2
console.log(x.a); // 0
console.log(x.b); // 1
console.log(x.c); // 2
console.log(z.a); // 1337
console.log(z.b); // 1
console.log(z.c); // 2
자바 스크립트는 프로토타입을 사용하는 언어. / 프로토타입이란 객체의 원형
객체 생성 시에 프로토타입을 지정해주지 않으면 Object.prototype을 상속받음
var x ={a: 0} 이렇게 그냥 생성만 하면 x.__prototype__ 은 Object.prototype과 같음.
y의 프로토타입을 x로 지정해서 생성.
z는 그냥 생성했으므로 Object.prototype 상속
따라서 z와 x 프로토타입은 같고, z와 y는 다름
만약 객체의 멤버변수를 출력할 때 객체에게 있다면 출력하고 없으면 상위 프로토타입에서 찾음.
Bracket notation
객체 접근 방법은 . or []
전자 dot notation, 후자 bracket notation
bracket은 dot에서 불가능한 = , ' ," 를 속성키로 지정 가능
a["="] 가능 , a.= 불가능
x와 y변수는 프로토타입을 지정하지 않고 생성하였기 때문에 Object.prototype 상속
object[a][b] 는 object.a.b와 같으므로
x[__proto__][keyA]로 오브젝트의 프로토타입에 keyA를 심을 수 있음
이는 y에도 공유되므로 y에서 접근 가능.
x의 프로토타입을 오염시켜 y의 결과 유도 => prototype pollution
'Security' 카테고리의 다른 글
[Webhacking] Misconfiguration (0) | 2021.10.01 |
---|---|
[wargame] image-storage (0) | 2021.09.30 |
[wargame] php-1 (0) | 2021.09.28 |
[wargame] Tomcat Manager (0) | 2021.09.27 |
[Webhacking] PHP (0) | 2021.09.27 |