ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] Challenge 39 풀이
    Wargame/Webhacking.kr 2019. 5. 18. 23:09

    39번 문제로 들어가보면, id를 입력하는 칸과 제출 버튼만 달랑 있다.

     

    Challenge 39 문제

     

    일단 아무거나 입력하고 제출해봤더니 아래와 같은 에러 문구가 출력되었다. 17번째 줄에서 mysql_fetch_array()를 통해 요청한 쿼리가 틀렸기 때문인 것으로 보인다.

     

     

    개발자도구를 통해 소스를 확인해보았다.

    Challenge 39 - 개발자도구

     

    소스코드에서 index.phps로 이동해보라 해서 들어가보니, Challenge 39의 소스코드가 나와있었다.

     

    Challenge 39 - index.phps

     

    소스 코드를 간단히 해석해보면 다음과 같다.

    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이 아닌 다른 문자여도 문제는 해결된다.)

Designed by Tistory.