<?php
include "../config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("dragon");
highlight_file(__FILE__);
?>
소스코드 분석
특별한 필터 구문은 없고 받는 파라미터가 pw뿐이지만 그 pw가 주석 처리 되기 떄문에 이 주석을 어떻게 무력화 시키거나 해야할 방법을 찾아야 할 것 처럼 보인다.
풀이
중요한 정보는 # 필터는 한줄짜리 주석이라는 것이다. 즉 pw 파라미터로 개행을 해주게 되면 개행 이후의 쿼리 문은 데이터 베이스가 인식하게 된다는 것이다.
#주석이 한줄 주석이 힌트이다. 즉 다음줄로 넘기면 되는 것 아닌가?
개행 아스키코드는 0a 이다.
즉 페이로드를 '%a and pw='' || id='admin' 으로 하게 되면된다.
앞에 guest부분을 거짓으로 만들고 || 뒤에 부분을 참으로 만들면 클리어!