web_security/wargame.kr

[wargame.kr] 4번 login filtering 문제 풀이

HawordFREAKEK 2019. 1. 12. 20:16

wargame.kr 이 가장 재밌지 않나요?



필터링 스펠링 까먹어서 밑줄 친거 그대로 나왔네요..

나는 계정을 갖고 있지만 막혔어. 필터링을 우회해서 로그인을 할 수 있겠니?

음... ㅇㅋ ㄱㄷ



? 힌트로 아이디랑 패스워드를 줘버리네요... 개 쉬운 문제인가

소스코드도 한 번 봅시다.

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

row 에 id 값이 있을 시 guest 나 blueh4g 이면 blocked 되고 아니면 키를 주는거네요.
ㅇㅋ ㄱ다



보시기 쉽게 비밀번호 치는 것도 일단 보이게 해놨습니다.

원하는 바와 같이 아이디는 guest 가 아니며 비밀번호 또한 blue가 아닙니다.




?

앟...


여기서 엄청 막혔었습니다. 제가 잘못한 건 줄 알고 조합 다해서 풀어보고... 몰라서 mqsql 문에 관하여 구글링을 해보기 시작했습니다.
php 는 대소문을 구별하나 mysql 문은 대소문을 따로 구별 안 한다고 하네요.
다른 예제는 나중에 찾아 올려드리도록 하겠습니다.





그래서 아이디를 대문자 GUEST 비밀번호를 소문자 guest 로 쳐본 결과 그냥

바로 flag 값을 주네요.


저렇게 아이디 비밀번호 비교하는 php문이 단순할 때는 대소문자로도 우회하는 방법이 있다는 것을 알아 두어야 할 것 같습니다.

아이디가 GUEST로 넘어가기만 하면 비밀번호는 상관없이 키가 나오는 줄 알았는데 아니네요... 크흠..
궁금하시거나 모르시는건 댓글로 말해주세요.