티스토리 뷰

728x90
반응형

$_GET[id]

PHP 소스코드 상으로는 id를 GET 파라미터로 받는다고 합니다.

 

if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");

그리고 id 파라미터의 입력값으로 '(작은따옴표)를 금지(필터링)하고 있습니다.

 

$_GET[id] = strtolower($_GET[id]);

그리고 입력받은 id 를 strtolower 함수로 인해 대문자가 있다면 소문자로 변환됩니다.

 

$_GET[id] = str_replace("admin","",$_GET[id]);

그리고 마지막으로 만약 id 파라미터에 admin 이라는 문자열이 올 경우 "" 즉 공백으로 치환합니다.

 

$query = "select id from prob_vampire where id='{$_GET[id]}'"; 
echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if($result['id'] == 'admin') solve("vampire");

query 변수에 위의 필터링 과정을 마친 결과값을 포함한 sql 구문이 대입됩니다. 그리고 해당 query 구문의 결과값으로 id가 admin 일 때 문제는 해결됩니다.

 

이 문제의 경우에는 문자열이 공백으로 replace 되는 특징을 활용해서 문제를 해결할 수 있습니다. 아래를 보시죠.

admadminin

해당 문자열의 경우 str_replace("admin", "", $_GET[id]) 함수를 만나서 어떻게 변환될까요? 아래와 같이 변환될 겁니다.

admin

위와 같이 마냥 금지어를 공백으로 치환한다고 해서 해결되는 것이 아닌 것을 알 수 있습니다. admin 이라는 문자열을 필터링하기 위해서 작성한 코드가 되려 또다른 admin 을 만들어버린 것이지요.

 

결론적으로 아래와 같은 URL을 전송하여 풀 수 있습니다.

https://los.rubiya.kr/chall/vampire_1.php?id=adadminmin

728x90
반응형
댓글