ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] Challenge 26 풀이
    Wargame/Webhacking.kr 2019. 5. 18. 00:10

    26번 문제로 들어가면, 아무것도 없이 그냥 index.phps 링크만 있다. 이 링크로 들어가보자.

     

    index.phps로 들어가면 아래와 같이 간단한 소스코드가 나온다.

    index.phps

    제일 먼저 eregi 함수가 보이는데, 이 함수는 admin이라는 문자열을 필터링하고 있다. 따라서 admin을 입력하려면 eregi 함수를 우회할 필요가 있다.

    그리고 GET 방식으로 입력받은 id를 urldecode 함수로 URL 디코딩한 후 다시 id에 저장한다. 그 다음 id가 admin인지 검사하여, id가 admin이면 문제가 해결된다. 

     

    처음에는 eregi 함수만 우회하기 위해 %00(null)을 써준 뒤에 admin을 URL 인코딩한 문자열인 %61%64%6d%69%6e을 GET 방식으로 전송해봤지만, no 메시지가 출력되고 실패했다. 게다가 URL 인코딩한 문자열도 다시 admin으로 바뀌었다.

     

    공격 전 입력한 URL
    공격 후

     

    검색해보니, 웹 서버와 브라우저 사이에서 데이터를 교환할 때, 브라우저는 폼에서 입력받은 데이터를 자동으로 인코딩한 뒤에 PHP로 보내고, PHP는 브라우저한테서 받은 인코딩된 값을 자동으로 디코딩한다고 한다.

     

    즉, 이 문제에서는 admin을 URL 인코딩한 값인 %61%64%6d%69%6e을 서버에 전달해도, PHP에서 자동으로 디코딩하여 admin으로 해석하기 때문에 eregi 함수에 의해 필터링된다.

     

    따라서 eregi 함수를 우회하기 위해서는 admin을 2번, 즉 %61%64%6d%69%6e를 한번 더 URL 인코딩해야한다. URL 인코딩을 2번 하면, PHP가 자동으로 디코딩을 해도 admin을 1번 URL 인코딩한 값인 %61%64%6d%69%6e으로 해석하기 때문에 eregi 함수를 우회할 수 있고, 그 다음 urldecode 함수에 의해 %61%64%6d%69%6e이 admin으로 디코딩되어 id 변수에 저장된다.

     

    %61%64%6d%69%6e를 한번 더 URL 인코딩한 값은 %2561%2564%256d%2569%256e이므로, 이 값을 GET 방식으로 전달해주면 문제가 해결된다.

     

    Challenge 26 문제 해결!

     

Designed by Tistory.