WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 3 - Goblin

코볼트를 훌륭하게 퇴치한 우리를 3번째로 반겨주는 몬스터는 고블린이다. 바로 코드를 확인하자

<출처 : 나무위키 https://namu.wiki/w/%EA%B3%A0%EB%B8%94%EB%A6%B0>


코드

코블린의 코드이다. 일단 id와 pw가 아닌 no라는 파라미터를 받아들이며 다음과 같은 문자열이 금지된다.

prob, _(언더바), .(점), \(역 슬래쉬), '(작은따옴표), "(큰따옴표), `(그레이브)

 

이런! 우린 작은따옴표와 큰따옴표를 금지당했다.

이번에도 역시 no파라미터에 코드를 닫을 수 있도록 해주어야 하는데 어떡하나 싶다(ㄷㄷ). query는 다음과 같다.

$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";

해결조건은 다음과 같다. admin이 검색되면 성공이다.

<?php 
  ...
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("goblin");
  ...
?>

이번 문제에서 우리는 두가지를 성공시켜야 한다.

① guest레코드가 검색되지 않아야 한다.
② admin레코드가 검색되어야 한다.

 


 

해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?no=5555%20or%20id=0x61646D696E%20--%20;

 

 

우선 guets레코드가 검색되지 않게 해야 된다. no에 임의의 수인 5555를 넣어보자.

오호... guest의 id는 아무래도 5555는 아닌 거 같다. 좋다. 이제 guest를 무시하는 방법은 알았다.

다음의 문제는 admin의 문자열이 쿼리에서 동작하도록 해야 되는 건데, 자연어 로보면 다음의 query가 유효할 것 같다.

? no=5555 or id='admin'-- ; 

그런데 이번 문제는 작은따옴표는 금지되어있다. 따라서 이를 hex로 처리해주면 database는 문자열로 자동으로 바꾸어 표현해준다. Answer Url에 있는 0x61646D696E는 admin이라는 문자열을 16진수 아스키 값으로 표현한 것이다.

문자열 - 헥스값 변환 : www.percederberg.net/tools/text_converter.html

 

swiss converter tool | percederberg.net

Quick encoding, decoding, escaping & unescaping of UTF-8, base64, hexadecimal, JSON, quoted-printable, HTTP POST, XML and more.

www.percederberg.net

 

 

축하한다. 우리는 hex로 전달하면 문자열로 바꾸어주는 Database의 특징을 간파해서 Goblin을 무찔렀다. 필자는 다음 관문에서 기다리겠다.(다음은 조금 난해한 몬스터가 우리를 기다린다.)