본문 바로가기

드림핵

[드림핵 워게임] [wargame.kr] login filtering

<문제>

 

<풀이>

문제 사이트에 접속하면 처음으로 보이는 페이지이다.

get source를 클릭해서 코드를 확인한다.

 

<?php

if (isset($_GET['view-source'])) {
    show_source(__FILE__);
    exit();
}

/*
create table user(
 idx int auto_increment primary key,
 id char(32),
 ps char(32)
);
*/

 if(isset($_POST['id']) && isset($_POST['ps'])){
  include("./lib.php"); # include for $FLAG, $DB_username, $DB_password.

  $conn = mysqli_connect("localhost", $DB_username, $DB_password, "login_filtering");
  mysqli_query($conn, "set names utf8");

  $id = mysqli_real_escape_string($conn, trim($_POST['id']));
  $ps = mysqli_real_escape_string($conn, trim($_POST['ps']));

  $row=mysqli_fetch_array(mysqli_query($conn, "select * from user where id='$id' and ps=md5('$ps')"));
  if(isset($row['id'])){
   if($id=='guest' || $id=='blueh4g'){
    echo "your account is blocked";
   }else{
    echo "login ok"."<br />";
    echo "FLAG : ".$FLAG;
   }
  }else{
   echo "wrong..";
  }
 }
?>

쿼리문을 실행하는 php 코드를 확인할 수 있다.

사용자의 입력값이 select 문에 들어가서 실행된다.

 

select 문만 보면 sql injection을 시도해보고 싶지만

사용자의 입력값이 mysqli_real_escape_string()함수를 통해 가공되기 때문에 단순한 sql injection은 먹히지 않을 것이다.

 

FLAG가 출력되는 조건을 확인해보면

select 문 결과 조회된 계정이 존재하야 하고

$id가 guest 혹은 blueh4g이 아니어야 한다.

 

<!--

you have blocked accounts.

guest / guest
blueh4g / blueh4g1234ps

-->

소스코드에 위와 같이 guest와 blueh4g 두 개의 계정 정보가 제공되고 있다.

 



guest계정으로 로그인을 해본다.

 

역시 your account is blocked 라는 문구가 뜬다.

 

sql 문에서는 대소문자 구분을 하지 않기 때문에 guest 를 Guest로 바꾸어 다시 로그인을 시도해보았다.

 

로그인에 성공하고 플래그가 출력되었다.