Web Hacking/Webhacking.kr

[Webhacking.kr] old-60 (Challenge 60)

ruming 2021. 11. 21. 15:58

 

Access Denied가 뜬다.

 

소스코드

<?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");
  }
?>

idx라는 세션이 있고 숫자로 된 값이 아니면 Access Denied가 뜬다. 

mode값이 auth면 파일을 읽어들이는데 이 값이 idx와 일치하면 문제를 해결할 수 있다.

client가 127.0.0.1이 아니면 sleep(1); 함수 실행 후 파일이 지워진다.

 

이 문제는 Race Condition을 이용한 문제이다.

레이스 컨디션은 공유 자원에 대해 여러 개의 프로세스가 동시에 접근하기 위해 경쟁하는 상태다.

프로세스들이 경쟁하는 것을 이용해 관리자 권한을 얻는다.

https://d4m0n.tistory.com/3

 

sleep함수로 1초 쉬는 것을 이용해 1초 안에 공격을 실행해야 한다.

이 공격을 위해 크롬과 웨일 두 가지 브라우저를 이용했다.

먼저 쿠키값을 숫자로 바꾸면 쿠키값이 바뀌었기 때문에 다시 로그인하라고 한다.

다시 로그인 한 뒤 접속해보면 쿠키값이 숫자기 때문에 Access Denied가 사라진 것을 볼 수 있다.

여기서 ?mode=auth를 입력하면 다음과 같이 Auth~가 뜨는 것을 볼 수 있다.

 

다른 브라우저도 쿠키값을 바꾸는데 숫자가 겹치지 않게 바꿔야 한다. 다른 프로세스로 인식시켜야 되기 때문이다.

아까 브라우저를 새로고침한뒤 이 브라우저에서 ?mode=auth로 1초 안에 접속하면 문제가 풀린다.

 

브라우저 모두 ?mode=auth를 입력해 아래와 같은 상태로 만들어서 풀었다.

그 다음 크롬 새로고침 -> 웨일 새로고침을 1초 안에 누르면 나중에 새로고침을 누른 쪽에서 문제가 풀릴 것이다.