-
[Webhacking.kr] Challenge 39 풀이Wargame/Webhacking.kr 2019. 5. 18. 23:09
39번 문제로 들어가보면, id를 입력하는 칸과 제출 버튼만 달랑 있다.
일단 아무거나 입력하고 제출해봤더니 아래와 같은 에러 문구가 출력되었다. 17번째 줄에서 mysql_fetch_array()를 통해 요청한 쿼리가 틀렸기 때문인 것으로 보인다.
개발자도구를 통해 소스를 확인해보았다.
소스코드에서 index.phps로 이동해보라 해서 들어가보니, Challenge 39의 소스코드가 나와있었다.
소스 코드를 간단히 해석해보면 다음과 같다.
if($_POST[id]) { $_POST[id]=str_replace("\\","",$_POST[id]); //백슬래시(\) 필터링 $_POST[id]=str_replace("'","''",$_POST[id]); //싱글 쿼터(') 1개를 싱글쿼터 2개('')로 필터링 $_POST[id]=substr($_POST[id],0,15); //id는 15글자까지만 사용 가능 $q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]")); // 입력받은 id를 통해 'good'를 불러옴 if($q[0]=="good") @solve(); }
이 소스코드에서 $q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]")); 부분을 보면, $_POST[id] 뒷부분에 싱글쿼터(')가 하나 누락된 것을 확인할 수 있다. 싱글쿼터가 누락되었기 때문에 쿼리문이 제대로 수행되지 않아 앞에서와 같은 에러가 출력된 것이다.
따라서 쿼리가 제대로 수행되려면 id를 입력한 후 싱글쿼터(')를 제대로 닫아주어야 한다. 그러나 싱글쿼터(')를 1개만 입력하면 str_replace 함수에 의해 싱글쿼터가 쌍으로(' ') 입력되기 때문에, str_replace 함수를 우회하여 싱글쿼터(')를 1개만 입력해야 한다.
일반적으로 str_replace를 우회하여 싱글쿼터(')를 입력하는 방법은 백슬래시를 사용하여 싱글쿼터(')를 문자열로 인식시키는 것이다. 하지만 이 문제에서는 백슬래시(\) 역시 str_replace 함수에 의해 필터링되므로 이 방법은 사용할 수 없다.
이 문제에서는 substr 함수에 주목해야 한다. id의 길이가 15를 넘어가면 substr 함수가 15글자까지만 잘라내므로, id의 15번째 인덱스 부분에 싱글쿼터(')를 넣어주면, str_replace 함수에 의해 싱글쿼터(')가 2개 입력되고, 마지막 싱글쿼터가 16번째 인덱스가 되어 substr 함수에 의해 잘려나간다.
따라서 id에 admin을 입력하고 나머지 9개 문자를 공백으로 채워준 후 싱글쿼터(')를 하나 입력하여 제출하면 문제가 해결된다.
(※ 꼭 id가 admin이 아닌 다른 문자여도 문제는 해결된다.)
'Wargame > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge 59 풀이 (0) 2019.05.19 [Webhacking.kr] Challenge 54 풀이 (0) 2019.05.19 [Webhacking.kr] Challenge 26 풀이 (0) 2019.05.18 [Webhacking.kr] Challenge 32 풀이 (0) 2019.05.12 [Webhacking.kr] Challenge 27 풀이 (1) 2019.05.12