ABOUT ME

-

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

    47번 문제는 메일 헤더 인젝션과 관련된 문제이다.

     

    Challenge 47 첫 화면

     

    47번 문제의 소스를 보니 index.phps로 가보라고 나와있다. index.phps로 접속해보자.

     

    코드를 보니 mail 함수가 사용된 것을 확인할 수 있다.

    mail(수신자, subject, message, header) 함수는 PHP에서 이메일을 보낼 때 사용하는 함수이다.

    <?php
    $to = 'nobody@example.com'; //수신자 메일 주소
    $subject = 'the subject'; //메일 제목
    $message = 'hello'; //메일 내용
    $headers = 'From: webmaster@example.com' .\r\n.
    	'Reply-To: webmaster@example.com'.\r\n.
            'X-Mailer: PHP/'.phpversion(); //메일 헤더
            
    mail($to, $subject, $message, $headers);
    ?>

    mail 함수의 인자 중 하나인 header는, 메일 헤더의 마지막에 추가하고 싶은 헤더 내용을 입력할 수 있는 인자이다. 일반적으로 header의 인자로 들어가는 추가 헤더에는 3가지가 있다.

    • from: 메일 송신자의 주소
    • cc(carbon copy): 메일의 참조인. 수신자 외 다른 사람에게도 메일을 수신한다.
    • bcc(blind carbon copy): 숨은 참조인. 수신자 외 다른 사람에게도 메일을 수신하나, 수신자는 bcc를 알 수 없다.

    이러한 추가 헤더들은 CRLF(\r\n)로 구분해줘야 한다.

     

     

    다시 47번 문제의 소스코드로 돌아와서, 입력칸에 nobody@example.com을 입력할 경우, 입력한 메일 주소가 from 헤더로 추가되기 때문에 nobody@example.com는 송신자의 주소가 된다.

    $header="From: $_POST[email]\r\n";
    mail("admin@webhacking.kr", "readme", "password is $pass", $header);
    
    수신자 admin@webhacking.kr
    메일 제목 readme
    메일 내용 password is $pass
    헤더 From: $_POST[email]\r\n

     

    따라서 nobody@example.com로 메일이 오게 하려면, nobody@example.com를 cc 헤더로 추가하여 메일을 참조할 수 있게 만들면 된다.

     

    먼저 아무 주소나 입력한 뒤에, \r\n으로 from 헤더를 구분해준 뒤, cc 헤더에 자신의 메일 주소를 추가한 뒤 제출하자.

    abc@example.com\r\ncc: 자신의 이메일 주소

     

    그런데 저대로 입력하면 패스워드가 출력되지 않는다.

     

    Burp Suite로 intercept를 해보니 \r\n이 URL 인코딩이 되어 있었다. 

     

     

    \r\n(%5Cr%5Cn)을 아스키코드로 변환(%0d%0a)해준 뒤 전송하면 패스워드가 출력된다.

     

     

    [참고문헌 및 출처]

    https://m.blog.naver.com/PostView.nhn?blogId=diceworld&logNo=220253940901&proxyReferer=https%3A%2F%2Fwww.google.com%2F

Designed by Tistory.