본문 바로가기
wargame/los.rubiya.kr

3번 goblin

by NTART 2019. 11. 5.

3번 goblin을 시작하였다

 

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 
  $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("goblin");
  highlight_file(__FILE__); 
?>

코드를보면, 이전 문제와 차이점이 몇가지 있다.

정규표현식 함수 preg_match를 보면 ' " 등의 필터를 추가하였다.

그리고 id를 guest로 고정 시켰고, pw를 no로 바꿔놓았다.

 

no=' or 1=1--' 같은 sql injection을 시도하면, preg_match함수에 의하여 no quotes 가 출력된다.

 

그리고 id를 admin으로 바꾸려 시도해도 guest로 고정되어 있다.

 

  if($result['id'] == 'admin') solve("goblin");

하지만 코드를 보면, id를 admin으로 우회하여야 해결되는 문제이다.

 

id=admin에서 admin을 문자열로 인식 시켜야 하는데, 작은 따옴표를 쓸 수 없는 상황이다.

 

작은따옴표를 아스키 인코딩하여 %27로 바꿔보았다. 하지만 이것도 '로 인식하여 no quotes가 출력되었다.

 

ascii to encoding이 되지 않았기 때문에, ascii to hex 방법을 시도하였다.

admin을 16진수로 표현하면, 알파벳 차례로 61 64 6d 69 6e 이다.

hex값을 인식시키기 위해 0x를 붙혀 시도해보니

 

 

문제를 해결하였다!

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

6번 darkelf  (0) 2019.11.16
5번 wolfman  (0) 2019.11.16
4번 orc  (0) 2019.11.15
2번 cobolt  (0) 2019.11.04
1번 gremlin  (0) 2019.11.01