안녕하세요. 오늘은 webhacking 60번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 60번을 눌러주세요.

 

들어가자마자 접근거부라고 나오는군요. 초대받지 못한 손님인 것 같습니다.

밑에 index.phps가 나와있네요. 눌러 봅시다.

첫문자를 보시면 sleep(1);가 적혀있습니다. sleep은 지연시키는 함수로 1이라고 적혀있으므로 1초를 지연시킨다는 소리입니다. 즉 1초가 지나고 다음 함수를 실행시킨다는 것이지요.

그 다음 첫 if문을 보시면 eregi가 나와있습니다. eregi는 문자를 찾는 함수이지요. COOKIE(PHPSESSID)에서 0~9까지의 숫자가 나올 경우 접근 거부를 출력한다는군요.

즉 COOKIE PHPSESSID에 숫자가 없어야 접근거부가 안뜬다는 것입니다.

그다음 if문을 보면  mode 값이 auth일 경우 Auth~ 란 문구를 출력하고 f에 readme/세션[id].txt를 저장시킨다는군요. 앞에 file()함수가 있으므로 파일을 배열로 읽어 들입니다.

그다음은 for문을 이용해 result에 .txt의 내용을 저장시키고 그 밑의 if문에서 세션[id]의 값이 result에 있으면 Done를 출력하고 unlink를 호출해 .txt파일을 삭제합니다. 그리고 문제가 해결된다는군요.

자 그러면 한번 해봅시다. PHPSESSID에 숫자가 없어야 하므로 숫자를 전부 지워봅시다.

 쿠키값에 있는 숫자를 다 지우고 새로고침을 하면 로그인을 하라고 합니다.

그래서 다시 로그인하고 60번 문제로 들어가면 아래와 같은 화면이 나옵니다.

자 이제 여기서 문제해결을 위해  mode에 auth를 넣어 봅시다.

Auth가 출력되었는데 Done가 출력되지 않았다는 것은 clear문의 if문이 참이 되지 못했다는 뜻입니다. 원래라면 당연히 참이 되야 하는 조건인데 참이 되지 못했다는 것은 .txt파일이 없어 result에 저장이 되지 않았다는 것으로 봐야 합니다.

소스문을 다시 봅시다.

클리어문의 if문을 제외하면 밑에 또 소스가 있는 것을 볼 수 있습니다.

위에 if문은 mode에 auth 값이 들어가 있을 때 실행하는 if문

밑의 문은 mode에 auth값이 없을 때 실행하는 문구인 것 같습니다.

보시면  fopen과 w를 이용해 .txt파일을 만들어서 f에 저장시키는 것이 보입니다.

그다음은 fwrite를 이용해 f에 저장된 내용을 세션[id]에 저장시킵니다.

그 다음을 보시면 if문이 있습니다.

ip주소가 다음과 다를 경우 1초의 지연시간을 주고 파일을 삭제시킨다는 군요.

그러면 이 파일이 삭제되기전에 클리어의 if문을 실행시킬 필요가 있습니다.

쿠키값을 수정시켜 들어오는 순간에 if문이 실행되므로 두 익스플로러를 띄워 하나는 파일 생성용 하나는 문제해결용으로 만들어줍시다.

서로의 쿠키값은 달라야 하므로 서로 다른 브라우저를 써 봅시다. 익스플로러와 크롬을 사용해봅시다.

크롬은 쿠기에디터를 사용해서 쿠키를 바꿀수 있고 익스플로러는 쿡시툴바를 이용해서 바꿀 수 있습니다. 일단 쿡시툴바를 다운받아 봅시다.

쿡시를 다운받으셨으면 익스플로러를 열어 오른쪽상단의 톱니바퀴를 눌러 추가 기능 관리로 들어갑니다.

그러면 아래와 같은 창이 뜹니다.

다운 받은 쿡시 툴바를 사용하기 위해 하단의 사용 함 버튼을 눌러주세요. 그리고 창을 닫아주시면 주소창 아래에 쿡시툴바가 보입니다. 자 이제 익스플로러 문제페이지를 들어가봅시다.

들어가셨으면 쿡시툴바의 맨 오른쪽의 edit 버튼을 눌러 쿠키값을 수정해 줍시다.

문자로만 들어가도록 바꿔줍시다.

다시 로그인을 하고 들어오시면 hi가 보이실 것입니다. 그리고 주소창에?mode=auth를 미리 써줍시다. 엔터는 아직 치지 마세요.

지금 접속됨으로써 text파일이 생성되고 지워졌을 겁니다.

여기까지 되셨으면 이번엔 크롬으로 들어갑시다.

쿠키값을 다르게 설정해줍시다.

설정 후 다시 로그인을 하셔서 들어오시면 hi가 뜹니다.

자 이제 익스플로러 hi와 크롬 hi가 있을 것입니다. 자 그리고 아까 익스플로러에 적어 놓은 ?mode=auth를 엔터친 후 바로 크롬 홈페이지를 새로고침 합니다. 이것을 반복합니다.

좀 하다 보시면 아래와 같이 뜹니다.

이번 문제는 레이스컨디션을 이용해서 푸는 문제였군요.

레이스 컨디션이란 쉽게 말하면 프로세스가 경쟁하는 것을 말합니다. 프로세스가 여러번 실행되는 과정에서 실행 순서가 뒤바뀌는 것을 말하지요.

즉 이번 문제를 보시면 

파일 생성 - sleep - 파일 삭제 순으로 코드가 작성되어있었지요? 이것도 하나의 프로세스작업입니다. 그런데 이러한 작업을 여러번 실행하다보면 원래라면

파일 생성 - sleep - 파일 삭제 - 파일 생성 -sleep - 파일 삭제 가 되어야 합니다.

하지만 레이스 컨디션에 의해 

파일 생성 - sleep  - 파일 생성 - sleep - 파일 삭제 가 될 수 있습니다. 물론 매번 시도할때마다 실행 순서는 다릅니다.

우리의 목표는 이러한 작업을 여러번 실행시켜서 파일 삭제를 늦추고 그 사이에 mode에 auth를 대입해 문제를 푸는 것이었습니다.

그렇다면 의문점이 하나 생기실겁니다. 쿠키값을 왜 바꾸고 했는지 말입니다.

동일한 쿠키값으로 두 행위를 하면 두 행위가 아닌 하나의 행위로 인식됩니다.

우리는 파일삭제를 늦추는 행위와 mode에 auth를 넣는 행위 즉 두 행위를 해야하는데 하나의 행위만 인식되면 문제를 풀 수가 없습니다.

브라우저를 다르게 한 것도 쿠키값을 서로 다르게 하기 위함이였습니다.

사설이 조금 길었네요. 이것으로 문제풀이를 마치겠습니다.



'Webhacking' 카테고리의 다른 글

webhacking - 26번 문제  (0) 2015.10.02
webhacking - 18번 문제  (0) 2015.10.02
webhacking - 20번 문제  (0) 2015.09.25
webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
Posted by englishmath
,