3. 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 {$resutl[id]}</h2>";
if($result['id']) == 'admin') solve("goblin");
highlight_file(__FILE__);
?>
[분석]
이전 문제들과는 다르게 필터링 되는 부분이 달라졌는데
' " ` 세 종류의 쿼트들 사용이 안된다.
또한 기본값으로 'guest'라는 id가 주어진 상태에서
no= 부분이 비어있는데 이 부분은 숫자를 넣어야 하는 듯 보인다.
그러니 파라미터 입력의 시작은 no= 부분 부터가 되겠고
문제 해결 조건은 id가 admin이어야 한다니
no 부분에 알맞은 값을 입력 후에
어떤 조건을 걸어 id 값을 admin으로 넣어 줘야
문제가 해결 되겠다.
[풀이]
우선 어떤 숫자를 넣어야 guest가 출력되는지 알아야하겠다.
시험삼아 0부터 숫자를 하나씩 증가시켜 본다.
?no=1 을 입력하니
Hello guest가 정상 출력되는 것을 확인할 수 있었다.
그럼 현재 조건은
id가 guest이면서 no 가 1이면 참이라는 조건이다.
문제를 해결하기 위해서는
id를 admin으로 만들어 줘야하기 때문에
별도의 조건이 더 필요한듯 보이는데 가령
A 경우이거나 '혹은' B 경우일 경우,
A and B 'or' C
형식을 사용하면 문제를 해결할 수 있게 된다.
그러기 위해서는 우선 처음 조건을 거짓으로
만들어야 한다. 즉, id=guest and no=1 조건을
거짓으로 만들면 되는데
간단하게 no 부분은 1을 제외한
다른 숫자를 넣어주면 될 것이고
추가로 더해질 '혹은' 조건은
'or'를 사용해
결과적으로
id=guest and no=2 or id=admin
형식으로 파라미터를 만들어주면 문제가 해결될 것!
주의사항으로
id를 admin으로 입력하려면 해당 문자열이
str 형태이기 때문에 싱글쿼트로 묶어줘야 하는데
현재 시스템에서 쿼트들을 필터링 하고 있다.
때문에 해당 단어를 문자열이 아닌 다른 형식으로
변환시켜 넣어줘야 한다.
해당 단어 admin을 Hex,
16진수로 변환시킬 것인데
변환된 값 앞에 0x를 붙혀 주어야
16진수임을 인식할 수 있으니 참조하자.
http://www.swingnote.com/tools/texttohex.php
위 사이트에서 변환을 시도, admin의 Hex 값은
61646d696e, 파라미터에 입력시 0x61646d696e
가 되겠다.
[정답]
?no=2 or id=0x61646d696e
'WEB 진단 > WarGame' 카테고리의 다른 글
Lord of Sql Injection 2 : cobolt (0) | 2021.02.13 |
---|---|
Lord of Sql Injection 1 : gremlin (0) | 2021.02.12 |
해커스쿨 BOF 원정대 : Level2 풀기 (0) | 2020.12.21 |
해커스쿨 BOF 원정대 : 개요 및 Level1 풀기 (0) | 2020.12.21 |
해커스쿨 Hackme FTZ 문제: Level8~Level20 (Lv16까지 진행) (0) | 2020.12.16 |