자 wargame.kr 4번 login filtering이다. 점수는 450 point!

 

흠.. 계정은 있는데 블락당해 있단다. 필터링해서 로그인 할수 있냐고?

 

일단 한번 시작해보자!

 

 

 

로그인 창이 나오고 친절하게 소스를 보라고 한다. 보라면 봐야지. 한번 확인해 보도록 하자.​

----------------------------------------전체 소스-----------------------------------------------​

<?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'])){                     /* POST 방식으로 입력받은 id,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");

 /* mysql_real_escape_sting, trim 함수를 통해 공백문자와 특수문자를 제외하여 sql injection을 예방한다. */

  $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'])){                                            /* id 값이 존재 하는지 확인한다. */ 
   if($id=='guest' || $id=='blueh4g'){                   /* id 값이 guest or blueh4g 이면 블락된 상태 */
    echo "your account is blocked";
   }else{
    echo "login ok"."<br />";                               /* id 값이 guest or blueh4g 만 아니면 성공 */
    echo "Password : ".$key;
   }
  }else{
   echo "wrong..";                                          /* id 값이 존재하지 않으면 오류 출력 */
  }
 }
?>
<!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                                   /*  힌트 부분인 것 같다. guest와 blueh4g에 대한 id, password가 나와있다. */
blueh4g / blueh4g1234ps

-->​

 

-------------------------------------------------------------------------------------------------------​

 

간단하게 주요 소스에 대한 부분만 주석을 통해 설명하였다.

 

 

<!--

you have blocked accounts.

guest / guest                                   /*  힌트 부분인 것 같다. guest와 blueh4g에 대한 id, password가 나와있다. */
blueh4g / blueh4g1234ps

-->​

 

 

​먼저 힌트에서 주어진 대로 guest/guest를 입력해 보았다.

 

your account is blocked

블락당해있다고 출력된다. 필터링을 우회해야 할 것 같다.​

가장 핵심이 되는 부분은 이 부분인 것 같다.

 

if($id=='guest' || $id=='blueh4g'){                   /* id 값이 guest or blueh4g 이면 블락된 상태 */
    echo "your account is blocked";
 }else{
    echo "login ok"."<br />";                               /* id 값이 guest or blueh4g 만 아니면 성공 */
    echo "Password : ".$key;
 }

 

php의 경우 대소문자를 구분하지만 쿼리자체는 대소문자를 구별하지 않기 때문에 guest를 Guest로 바꾸어 입력해 보았다.​ 

 

 

 

 

 

성공! md5방식으로 인코딩된 password가 출력되었따.

 

Post 입력을 통해 받은 Guest 아이디가 디비에선 실제로 guest 아이디의 값들을 가져와 php는 필터링을 위한 아이디 비교 부분에서

잘못된 사용자 아이디로 로그인한 공격자의 우회공격을 필터링 하지 못하였다. 

 

앞선 문제들보다는 조금 더 생각을 해봐야 했던 문제였던 것 같다.


'Wargame > wargame.kr' 카테고리의 다른 글

wargame.kr DB is really GOOD  (0) 2018.01.04
wargame.kr wtf_code  (0) 2018.01.04
wargame.kr flee button  (0) 2018.01.04
wargame.kr QR CODE PUZZLE  (0) 2018.01.04
wargame.kr 1번 already got.. : 네이버블로그  (0) 2018.01.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,