ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] Challenge 24 풀이
    Wargame/Webhacking.kr 2019. 5. 12. 00:33

    24번 문제로 들어가면 내 ip와 user agent 정보가 나오고, Wrong IP라는 문구가 출력된다.

    Challenge 24번 문제 첫 화면

     

    개발자도구를 실행해보면 index.phps에서 소스를 볼 수 있다고 나와있으므로, index.phps로 접속해보자.

    Challenge 24 - 개발자도구

     

    index.phps의 내용은 아래와 같다.

    http://webhacking.kr/challenge/bonus/bonus-4/index.phps

     

    • extract: 배열 속의 키값을 변수화시켜주는 함수로, 위 코드에서는 $_SERVER와 $_COOKIE를 일반 변수처럼 사용할 수 있게 해주는 용도로 사용되었다.
    • $_SERVER: 웹서버에 의해 만들어진 headers, paths, script locations와 같은 정보가 포함된 배열이다.
    • $_COOKIE: name, value, expire 등의 쿠키 정보가 포함된 배열이다.
    • $_SERVER[REMOTE_ADDR]: 현재 사이트에 접속한 클라이언트의 IP가 저장되는 변수이다. 첫 번째 if문에서 $REMOTE_ADDR 변수가 설정되어 있는지 확인한 후, 따로 설정된 것이 없으면 이 변수의 값을 $REMOTE_ADDR 변수에 저장한다.
    • $HTTP_USER_AGENT: 사용자의 웹 접속 환경을 나타내는 변수이다.

     

    index.phps의 코드를 해석해보면, 현재 접속한 사용자의 ip는 $ip 변수에 저장되고($ip 값은 REMOTE_ADDR이라는 이름의 쿠키의 값이기도 하다), 이 ip에 127., 그리고 0.과 일치하는 문자열이 포함되면 이를 공백으로 replace한다. 또한 $ip가 127.0.0.1이면 solve()가 실행되면서 문제가 해결되고, 아니면 Wrong IP 문구가 출력된다.

    따라서 이 문제는 str_replace 함수를 우회하여 사용자의 ip를 127.0.0.1로 변조하면 해결된다.

     

    str_replace 함수는 문자열 중간에 필터링될 문자열을 끼워넣어서 우회할 수 있다.

     

    예를 들어, $id를 입력받을 때 str_replace 함수로 select 문자열을 필터링한다고 가정하자.

    $id = $_GET['id']
    $id = str_replace("select", "", $id)

    이 경우 selselectect로 입력하면, 가운데에 있던 select가 str_replace에 의해 공백으로 필터링되고 select만 남게 되어 정상적으로 실행된다.

     

    이러한 방식으로 127.0.0.1도 112277..00..00..1로 입력하면 str_replace를 우회하여 127.0.0.1을 입력할 수 있다.

     

    EditThisCookie를 사용하여 이름이 REMOTE_ADDR이고 값이 112277..00..00..1인 쿠키를 생성한 뒤에 새로고침하면 문제가 해결된다.

    REMOTE_ADDR 쿠키 생성

     

    Challenge 24 문제 해결!

     

Designed by Tistory.