old-60 (300)

첫 화면이다.

view-source를 클릭해 본 소스는 아래와 같다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
  login_chk();
  echo "Your idx is {$_SESSION['idx']}<hr>";
  if(!is_numeric($_COOKIE['PHPSESSID'])) exit("Access Denied<br><a href=./?view_source=1>view-source</a>");
  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();
    }
  }
  $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");
  }
?>
<html><head><title>Challenge 60</title></head><body><a href=./?view_source=1>view-source</a></body></html>

아래와 같이 PHPSESSID 쿠키 값을 123으로 설정해 위 소스의 6번째 줄을 통과한다.

새로고침 후 다시 로그인 해 문제에 접속하면 아래와 같이 Access Denied 라는 글이 사라져있다.

소스에 존재하는 sleep() 함수 덕분에 레이스 컨디션 공격이 가능하다.

크롬 시크릿 창을 열어 아래와 같이 PHPSESSID 쿠키 값을 456으로 설정한 후 문제에 접속한다.

우측 시크릿 창을 새로고침 한 순간 1초 안에 좌측 일반 창에서 https://webhacking.kr/challenge/web-37/?mode=auth에 접속하면 문제가 풀린다.

Last updated