프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 60번 문제

Uggjjini 2021. 7. 19. 14:04

문제 페이지는 해당 페이지와 같다.

 

해당 페이지에는 나의 idx 가 50674 라는 문구와 Access Denied 문구가 출력되있고, view-source 링크가 존재한다.

 

해당 링크를 클릭하여 소스코드를 확인한다.

 

 

소스 코드를 해석 해본다.

 

if(!is_numeric($_COOKIE['PHPSESSID'])) exit("Access Denied<br><a href=./?view_source=1>view-source</a>");

 

PHPSESSID 쿠키 값이 정수형이 아닌 경우 Access Denied 문구를 출력한다.

 

 sleep(1);
  if($_GET['mode']=="auth"){
    echo("Auth~<br>");
    $result = file_get_contents("./readme/{$_SESSION['idx']}.txt");
    if(preg_match("/{$_SESSION['idx']}/",$result)){
      echo("Done!");
      unlink("./readme/{$_SESSION['idx']}.txt");
      solve(60);
      exit();
    }

 

그리고 1초 쉬었다가  Get 방식의 mode 파라미터 값이 auth 값인 경우 ./readme/{$_SESSION['idx']}.txt 값을 읽어오고 $_SESSION['idx']} 값과 동일하면 문제가 풀린다.

 

$p = fopen("./readme/{$_SESSION['idx']}.txt","w");
  fwrite($p,$_SESSION['idx']);
  fclose($p);
  if($_SERVER['REMOTE_ADDR']!="127.0.0.1"){
    sleep(1);
    unlink("./readme/{$_SESSION['idx']}.txt");
  }

 

Get 방식의 mode 파라미터 값이 auth 가 아닌 경우 상단의 코드들이 실행되는데, ./readme/{$_SESSION['idx']}.txt 파일을 열어 $_SESSION['idx'] 을 쓰고 닫는다.

 

이 때 접속자의 ip 주소가 127.0.0.1이 아니면 1초 쉬었다가 unlink 한다.

 

sleep() 함수를 이용하여 레이스 컨디션 공격을 시도해본다.

 

레이스 컨디션 공격을 실행하기 위해 크롬과 Microsoft Edge 2개의 브라우저를 사용한다.

 

먼저 PHPSESSID 쿠키 값을 정수로 바꾸어 준다.

 

 

정수로 바꾸고 새로고침을 하면 다시 로그인하라는 창이 뜬다.

 

다시 로그인하여 해당 페이지로 접속하면 Access Denied 문구는 사라진 것을 확인할 수 있다.

 

이 상태에서 Microsoft Edge 브라우저로 이동하여 PHPSESSID 쿠키 값을 크롬 브라우저의 쿠키값과 다른 값으로 바꾸어주고 URL의 mode 파라미터 값을 auth 로 입력만 해둔다.

 

 

 

 

그리고 크롬 브라우저로 들어가 새로고침을 누른뒤 곧바로 Edge 브라우저의 URL로 접속하면 해당 문제가 풀린다.