Dyrandy

[Wargame.kr] 워게임 12번 challenge 12 type confusion 본문

Wargame WriteUp/WarGame.kr

[Wargame.kr] 워게임 12번 challenge 12 type confusion

Dyrandy 2017. 8. 3. 17:35

오늘은 오랜만에 Wargame.kr을 풀었다.

일단 가장 먼저 문제를 보았다.

 

 

들어가보면

 

 

늘 있는 택스트 박스가 기다리고 있다.

 

 

일단 모든 문제의 기본인 소스코드를 확인해 보았다.

 

일단 소스코드를 대충 짐작해서 보면,

 

1. 값을 우리가 집어 넣는다.

2. 넣은 값과 특정 값과 비교를 시킨다.

3. 참이면 성공 거짓이면 실패.

 

아마 php를 많이 접해 보신 분들은 바로 알겠지만, 저 같은 사람은 uniqid나 json_decode 같은 것은 처음 봤다.

 

그럼 먼저 uniqid가 과연 무엇인가?

uniqid라 하면, unique id의 축약 된 것으로,

간단하게 말하면,

 

"시간을 기반으로 랜덤한 값을 생성해주는 '함수'다."

"안에는 인자가 2개가 들어갈 수 있다."

"반환 되는 값이 문자열이다."

 

http://php.net/manual/kr/function.uniqid.php

 

이로써 랜덤한 값을 가지고와 만들고 그것을 $key라는 변수에 저장 시킨다는 것을 알 수 있다.

 

다음은 json_decode다.

json_decode는 입력 받은 문자열을 변수로 변환해주는 함수다.

 

http://php.net/manual/kr/function.json-decode.php

 

그럼 이제 소스코드를 다시 분석하면

 

1. 우리가 입력한 값을 변수에 저장시킨다.

2. 특정 변수에 랜덤한 값을 만든다.

3. 위 둘을 비교 시킨다.

 

일단 핵심은, 비교랑, 랜덤한 값을 추출할 수는 없다. 물론 brute forcing으로 짐작하고 무작정 넣을 수도 있겠지만,

핵심은 그게 아니다. php에는 늘 취약이 존재하고, 문제의 제목이 type confusion이라는 점을 잘 생각해봐야한다.

 

Type Confusion이라는 것은 과연 무엇일까?

 

Type Confusion은 말 그대로 Type을 헷갈려 한다는 뜻이다.

즉, 자료형을 헷갈린다는 뜻이다.

 

그럼 이제 우리는 저 비교문이 항상 참이 되도록 php를 우회 시켜주면 된다.

 

 

먼저 변수 key에 저장되는 값을 생각해야한다.

https://www.w3schools.com/php/showphp.asp?filename=demo_func_misc_uniqid

 

$key에는 위 사이트를 참고해서 지속적으로 uniqid를 만들어보면,

만들어지는 값은 문자열이라는 것을 얼추 확인 해볼 수 있다.

 

그럼 이제 문자열과 무슨 값이 참이 될까 보면,

("php"문자열을 보면)

TRUE, 0, "php"라는 것을 알 수 있다.

 

python으로 code를 짜서 보내거나, burp로 값을 변경 시켜 보내는 방법을 사용하여

값을 변경 시켜 보내면 문제는 풀린다.

 

일단, burp를 확인 해보면,

 

이렇게 나오는데, url_encoding된 값이다.

decode를 해보면

{"key":"asd"} 이렇게 나온다.

"asd"는 문자열이므로 true라는 값이나, 0으로 바꿔서 보내면,

 

(꼭, 이 형식이 아니라 %22가 "이므로 이걸 없에고 true나 0을 넣으면 된다.)

 

 

 

Comments