문제 페이지에 들어가보니, admin 페이지로 넘어가는게 미션인 듯하다.

 

here is proxy just for fun 부분의 proxy를 클릭하니, 문제 서버에서 프록시를 해주는 것으로 판단이 된다.

 

admin페이지로 넘어가니, 로그인을 하라고 해서 일단 내가 알고 있는 guest/guest를 입력해봤다.

 

아무 소득이 없었다. 그래서 혹시 쿠키에 뭔가 저장이 됬는지 확인을 해봤는데, 아무것도 없었다.

 

우연히 로그인 취소 버튼을 클릭하니, 저런 사이트가 나왔다.

 

include "config.php";
if($_GET['view_source']) view_source();
if($_GET['logout'] == 1){
  $_SESSION['login']="";
  exit("<script>location.href='./';</script>");
}

로그아웃 시 login 세션이 빈 세션으로 지정되고, index 페이지로 리다이렉트된다.

 

if($_SESSION['login']){
  echo "hi {$_SESSION['login']}<br>";
  if($_SESSION['login'] == "admin"){
    if(preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR'])) echo $flag;
    else echo "Only access from virtual IP address";
  }
  else echo "You are not admin";
  echo "<br><a href=./?logout=1>[logout]</a>";
  exit;
}

로그인 세션이 있을 경우에 hi 로그인 세션을 출력한다.

이후에 로그인 세션이 admin이면, 접속한 주소가 172.17.0.x주소이면 Flag를 출력한다.
그게 아니라면, admin이 아니라는 문구를 추가적으로 출력한다.

 

if(!$_SESSION['login']){
  if(preg_match("/logout=1/",$_SERVER['HTTP_REFERER'])){
    header('WWW-Authenticate: Basic realm="Protected Area"');
    header('HTTP/1.0 401 Unauthorized');
  }
  if($_SERVER['PHP_AUTH_USER']){
    $id = $_SERVER['PHP_AUTH_USER'];
    $pw = $_SERVER['PHP_AUTH_PW'];
    $pw = md5($pw);
    $db = dbconnect();
    $query = "select id from member where id='{$id}' and pw='{$pw}'";
    $result = mysqli_fetch_array(mysqli_query($db,$query));
    if($result['id']){
      $_SESSION['login'] = $result['id'];
      exit("<script>location.href='./';</script>");
    }
  }
  if(!$_SESSION['login']){
    header('WWW-Authenticate: Basic realm="Protected Area"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Login Fail";
  }
}

로그인 세션이 없다면, id와 pw 파라미터를 통해 쿼리문에 id와 pw을 삽입하여 로그인을 할 수 있다.

if(preg_match("/logout=1/",$_SERVER['HTTP_REFERER'])){
    header('WWW-Authenticate: Basic realm="Protected Area"');
  header('HTTP/1.0 401 Unauthorized');
}

나는 이러한 코드를 볼 수 있었는데, WWW-Authenticate해더를 볼 수 있었다.
이는 http 인증을 한다는 것으로 판단이 된다.

HTTP 인증 - HTTP | MDN

 

HTTP 인증 - HTTP | MDN

HTTP는 액세스 제어와 인증을 위한 프레임워크를 제공합니다. 가장 일반적인 인증 방식은 "Basic" 인증 방식입니다. 이 페이지에서는 일반적인 HTTP 인증 프레임워크를 소개하고 서버에 HTTP의 Basic

developer.mozilla.org

위와 같이 SQLi를 통해 admin으로 로그인을 할 수 있으며, WWW-Authenticate으로 인증을 하는 것을 알 수 있다.

해당 Base64는 admin으로 인코딩한 것이다.

이를 통해 문제 서버의 프록시를 이용하여, admin 페이지에 주요 헤더와 데이터들을 보냈다.

Request 해더 삽입을 할 때 줄 구분을 위해 CRLF(%0d%0a)를 사용하였다.

Flag를 획득할 수 있었다.

'워게임 > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Old - 50 Write Up  (0) 2021.06.03
[Webhacking.kr] Old - 55 Write Up  (0) 2021.06.02
[Webhacking.kr] Old - 34 Write Up  (0) 2021.05.31
[Webhacking.kr] Old - 29 Write Up  (0) 2021.05.31
[Webhacking.kr] Old - 53 Write Up  (0) 2021.05.30
복사했습니다!