no = 1
은 guest
임<?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__);
?>
이 문제의 풀이는 2가지가 있다.
가장 대중적인 풀이에서 이용하는 특징은 '
, "
가 검색되면 바로 오류를 뱉는다는 것이다. 따라서 이번에는 일반적인 방법으로는 문자열을 입력할 수 없다.
힌트에서 말했던 hex를 이용해야 한다.
또 다른 풀이로는 이 문제가 특이해서 가능한 건데 no
부분에 따옴표가 없는 것을 보아 숫자를 입력하는 것을 알 수 있다.
그리고 계속 문제를 풀다 보면 db에는 guest
를 제외하고 최상단에 admin
이 있다는 것을 알 수 있다. 이 점을 이용하면 hex
없이도 문제가 풀린다.
hex로 admin
을 인코딩하면 61646d696e
가 나온다.
나온 값은 hex 값, 즉 16진수이기 때문에 앞에 0x
를 붙여주어 0x61646d696e
라는 값이 나온다.
따라서 기존 쿼리를 거짓으로 만들고 참인id=0x61646d696e
를 or
로 연결해주면 해결이 된다.
https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=0||id=0x61646d696e
no
값에 여러 가지 숫자를 입력해보면 힌트에서 말한 것처럼 no=1이 guest
인 것을 알 수 있다.
따라서 no
값이 1이 아니면 뭔가 다른 계정이 나올 거로 생각해서 no=0||no!=1
을 해보니까 admin
이 나와서 해결되었다.
https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=0||no!=1