Gae Ko's Blog

los : assassin 본문

웹해킹 /[los] Lord of SQL

los : assassin

Gae Ko 2017. 8. 26. 23:51

[코드분석]


<?php 
  
include "./config.php"
  
login_chk(); 
  
dbconnect();

↑ DB 연결을 위한 코드


  if(preg_match('/\'/i'$_GET[pw])) exit("No Hack ~_~"); 

↑preg_match를 통한 필터링


  $query "select id from prob_assassin where pw like '{$_GET[pw]}'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"

↑쿼리 실행


  $result = @mysql_fetch_array(mysql_query($query)); 
  if(
$result['id']) echo "<h2>Hello {$result[id]}</h2>"
  if(
$result['id'] == 'admin'solve("assassin");

↑문제의 포인트



[내 풀이]


코드를 보니 

GET방식으로 pw와 id의 값을 입력받고 

입력받은 pw값에서 싱글쿼터(')를 필터링하고 

입력받은 pw값에 해당하는 id가 'admin'일 때 문제가 해결된다고 한다.


아하... 등호대신 like를 써도 되는걸 이 문제를 보고 알게되었다! 아하아하 ㅎㅎ

처음보는 like에 대해서 구글링하여 알아보았다.


LIKE연산자는 지정된 패턴을 검색하는데 사용한다.

SQL에서는 흔히 사용하는 연산자 =(등호)는 무조건 값이 같을 때만 검색이 된다. 하지만 LIKE연산자를 사용하면 내용 중에 해당하는 단어만 있으면 바로 검색이 가능하다.


다시 문제에 집중하자면.... 

사실 처음에 이 문제를 봤을 땐 ID가 admin이면 된다고 해서 or id='damin'을 이용하면 되지 않을까하는 방법을 생각해 보았다. 

하지만 저 구문을 집어넣으면서 구문이 완벽하려면 pw의 싱글쿼터를 닫고나서 구문을 넣어야하는데 싱글쿼터를 필터링하고 있는 상태이다.

그래서 싱글쿼터를 우회하는 법을 생각하고 찾아보았는데 싱글쿼터라 막혀서 문자열을 집어넣을 수 없는 경우에 대해서만 나오는 바람에..... 

맨붕에 빠지고 말았다 ㅠㅠ 


......고민고민......


결국 힌트를 보고 말았다. ㅎㅎ


힌트. like연산자에서 비교할 문자열은 정규식을 사용하여 비교하는 것이 가능


정규식에대해 알아보았다.

대괄호 어쩌고 중괄호 어쩌고... 

혼자 끙끙대다가 민지언니의 도움을 받게되었다!! 


여기서 포인트가 

등호대신 LIKE연산자를 사용한 것과 입력받은 pw값에 해당하는 id를 찾고있는 것임을 알게되었다!

//역시 괜히 등호를 안쓰고 괜히 ID를 PW로 찾는게 아니었다. ㅠㅠ 나의 짧은 생각에 대해 다시 한번 반성한다 !!


like '%김' → 문자의 끝이 김으로 끝나는 문자열

like '김%' → 김으로 시작하는 문자열 

like '%김%' → 김이 포함된 문자열 

(%는 정규식에서 임의의 문자가 0번이상 반복되어 있음을 의미)


pw로 'a%'를 입력하였으면 실행쿼리에 의해 pw가 a로 시작하는 id를 반환하여 'admin'인지 비교하게 된다.

만약 저 위가 맞다면 'aa%' 'ab%' 'ac%' ..... 해보아서 두번째 문자를 찾는다.

이런 방식으로 숫자, 영어 대소문자 그리고 특수기호까지 다 비교해보아서 id가 admin인 pw의 길이가 몇인지 몰라도 like연산자 뒤 입력받은 문자패턴에 일치하면 Hello admin 이라고 나올 때까지 해보면 된다.


하지만 이것은 정말 막노동이고 꼼수로 prob_assassin의 db엔 (아래 표에서 pw값은 임의의)

 no

  id pw 
 1

 guest

 1234555...

 2

 admin

 1234888...  

이런 식으로 맨위엔 guest 그 다음에 admin행이 있을 것이고 그 둘의 pw값은 첫 세네자리까지는 같을 것임을 알고있다면 

그냥 손으로 하나하나 해보는게 더 빠름을 알 것이다.


%앞의 숫자를 바꿔가며 해본 결과 



guest의 pw이 8로 시작함을 알 수 있다. 그리고 위에서 말한 꼼수에 의하면 admin의 pw도 8로 시작함을 알 수 있다.


시작이 8임을 알았으니 두번째자리도 하나하나 해본다.

그 결과 guest의 pw는 두번째 문자가 3임을 알 수 있다. 동시에 admin의 pw도 두번째 문자가 3임을 알 수 있다.


이를 통해 guest와 admin의 pw는 처음 83은 같고 그 다음문자부터 다름을 알 수 있다. 

admin의 pw가 832로 시작하기 때문에 풀린 것이다 !!



'웹해킹 > [los] Lord of SQL' 카테고리의 다른 글

los:succubus  (0) 2017.09.03
los:zombie_assassin  (0) 2017.09.03
los : giant  (0) 2017.08.17
los : bugbear  (0) 2017.08.17
los : darkknight  (0) 2017.08.17