코볼트를 훌륭하게 퇴치한 우리를 3번째로 반겨주는 몬스터는 고블린이다. 바로 코드를 확인하자
코드
코블린의 코드이다. 일단 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
축하한다. 우리는 hex로 전달하면 문자열로 바꾸어주는 Database의 특징을 간파해서 Goblin을 무찔렀다. 필자는 다음 관문에서 기다리겠다.(다음은 조금 난해한 몬스터가 우리를 기다린다.)
'WarGame > Lord of SQL Injection' 카테고리의 다른 글
[LOSI] Lord of SQL Injection Level 5 - Wolfman (0) | 2021.04.13 |
---|---|
[LOSI] Lord of SQL Injection Level 4 - Orc (0) | 2021.04.13 |
[LOSI] Lord of SQL Injection Level 2 - Cobolt (0) | 2021.04.12 |
[LOSI] Lord of SQL Injection Level 1 - Gremlin (0) | 2021.04.12 |
[LOSI] Lord of SQL Injection 문제풀이 포스팅을 시작하며 (0) | 2021.04.12 |