본문 바로가기

WarGame/webhacking.kr

[webhacking.kr] Challenge 60 :: Race Condition


▼ Challenge 60은 다음과 같습니다.



 php 코드는 다음과 같습니다.



Cookie의 PHPSESSID 중에 숫자가 포함되어 있으면 코드가 종료됩니다.


if 문은 나중에 보고, "$_SESSION[id].txt" 파일에 "$_SESSION[id]" 값을 Write 합니다.


그 다음, 만약 "$_SERVER[REMOTE_ADDR]" 값이 "127.0.0.1"이 아니면 파일을 다시 삭제합니다.


다시 위로 올라가서, GET으로 "auth"를 보내면, "$_SESSION[id].txt" 파일의 내용을 "$result"에 넣고, 

"$result"에 "$_SESSION[id]" 내용이 포함되어 있으면 문제가 풀리게 됩니다.


즉, 쉽게 이야기하면, 원래 "mode=auth" Query를 보내면 자동으로 풀리게 됩니다.

하지만 파일이 계속 삭제됨으로 풀리지 않습니다.


여기서, 어떻게 하면 "$_SERVER[REMOTE_ADDR] 값을 127.0.0.1로 바꿀까?" 라고 고민하시면 안됩니다.

"$_SERVER[REMOTE_ADDR]" 값을 공격자가 조작할 수는 없습니다.


그럼으로, 처음에 눈 여겨 보지 않고 지나쳤던, sleep() 함수를 이용하여야 합니다.

괜히 있는 것이 아니였습니다.


먼저, Cookie를 숫자가 제외된 문자로만 구성하여 다시 로그인하면 "hi~"라는 문구가 뜰것 입니다. 그리고 "mode=auth"를 전송해보지만 이미 파일이 삭제가 되어 Read 할 수가 없습니다.


그렇다면, Browser를 2개 띄우고, 삭제가 되기 전에 파일을 읽어 보면 어떨까요?


여기서, 2개의 Browser의 Cookie 값이 달라야 합니다. 

Cookie 값이 동일하다면, 같은 User로 인식하므로 

먼저 보냈던 Request를 나중에 보낸 Request가 잡아먹기 때문입니다.


그렇기 때문에, 2개의 Browser를 띄우고 Cookie 값을 다르게 하여 로그인 한 뒤, 

Race Conditon 공격 기법을 이용하여 파일이 삭제되기 전에 읽어버리면 성공하게 됩니다.