본문 바로가기

Security

[Webhacking] Javascript

반응형

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