kangsecu's B1og

[Wargame.kr] login filtering 문제풀이 본문

Web Hacking/wargame.kr

[Wargame.kr] login filtering 문제풀이

Kangsecu 2017. 5. 1. 21:53

이번 시간에는 [Wargame.kr]의 문제인 login filtering 이라는 문제를 풀어보겠습니다. 이 문제의 점수는 450p 입니다.


우선 문제에 들어가면 이렇게 id와 password를 입력할 수 있는 로그인 폼이 있습니다.



밑에 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 auth_code function.

  
mysql_connect("localhost","login_filtering","login_filtering_pz");
  
mysql_select_db ("login_filtering");
  
mysql_query("set names utf8");

  
$key auth_code("login filtering");

  
$id mysql_real_escape_string(trim($_POST['id']));
  
$ps mysql_real_escape_string(trim($_POST['ps']));

  
$row=mysql_fetch_array(mysql_query("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 
"Password : ".$key;
   }
  }else{
   echo 
"wrong..";
  }
 }
?>
<!DOCTYPE html>
<style>
 * {margin:0; padding:0;}
 body {background-color:#ddd;}
 #mdiv {width:200px; text-align:center; margin:50px auto;}
 input[type=text],input[type=[password] {width:100px;}
 td {text-align:center;}
</style>
<body>
<form method="post" action="./">
<div id="mdiv">
<table>
<tr><td>ID</td><td><input type="text" name="id" /></td></tr>
<tr><td>PW</td><td><input type="password" name="ps" /></td></tr>
<tr><td colspan="2"><input type="submit" value="login" /></td></tr>
</table>
 <div><a href='?view-source'>get source</a></div>
</form>
</div>
</body>
<!--

you have blocked accounts.

guest / guest
blueh4g / blueh4g1234ps

-->

자 이제 코드를 분석 해보도록 하겠습니다.

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

이 부분은 우선 코드를 보여주는 부분입니다.

 if(isset($_POST['id']) && isset($_POST['ps'])){
  include(
"../lib.php"); # include for auth_code function.

id와ps부분에 파라미터가 있으면 lib.php를 함수에 포함시킵니다.

 mysql_connect("localhost","login_filtering","login_filtering_pz");
  
mysql_select_db ("login_filtering");
  
mysql_query("set names utf8");

이 부분은 쿼리를 연결 시키는 코드 입니다. mysql을 사용할때 사용하죠.

$key auth_code("login filtering");

  
$id mysql_real_escape_string(trim($_POST['id']));
  
$ps mysql_real_escape_string(trim($_POST['ps']));

  
$row=mysql_fetch_array(mysql_query("select * from user where id='$id' and ps=md5('$ps')"));

이 부분은 post로 전송한 id 와 ps를 escape한 후 각각 $id , $ps에 넣고, $row에 명령문을 실행한 결과를 넣는 부분 입니다.

if(isset($row['id'])){
   if(
$id=='guest' || $id=='blueh4g'){
    echo 
"your account is blocked";
   }else{
    echo 
"login ok"."<br />";
    echo 
"Password : ".$key;
   }
  }else{
   echo 
"wrong..";
  }
 }

마지막으로 이 부분은 $row에 id변수값이 존재할경우 에는 guest 나 blueh4g 일 경우메세지출력 하고 아닐 경우에 key값을 보여줍니다.

&row에 id변수값이 존재하지않을경우엔 메시지를 출력합니다.
주석 부분은 그냥

<!--


you have blocked accounts.

guest / guest
blueh4g / blueh4g1234ps

-->


당신은 guest / guest 와 blueh4g / blueh4g1234ps 라는 두개의 막힌 계정을 가지고 있다는 뜻 입니다.

===============================================================================================================

자 그럼 이제 본격적으로 풀어 보도록 하겠습니다.

우선 쿼리에서는 대문자와 소문자의 구분이 없습니다. 그리고 이걸 이용하여 문제를 해결하면 됩니다 .

ex)

id에 guest를 입력하게 되면 php코드에 의해서 your account is blocked 이라는 문자가 출력 되지만,

id에 guest를 앞에 g만 대문자인 id=Guest를 넣어주면 php코드에서 필터링이 되지않으며 쿼리에서는 guest와 같은 값 인줄 알고 key를 내어준다는 문제입니다.

그렇다면 간단하게

id=Guest pw=guest를 입력해주면 클리어 하게 됩니다.


이상으로 풀이를 마치겠습니다.