[webhacking.kr] 25번 문제 풀이[PHP]

1 분 소요

💡 Webhacking.kr challenge(old) 25번 문제에 대한 풀이입니다.

문제

문제 화면

image

image

문제 풀이

본 문제는 file = [파일이름]을 주면, 해당 파일이 실행이 되고 있는 구조로 보입니다. 그리고 flag.php파일을 보니, 지금은 해당 파일이 실행되어 FLAG is in the code가 출력되었으며, 힌트를 보고 추측을 해보면 해당 파일이 실행되지 않고 그대로 코드가 나오면 플래그를 획득할 수 있습니다.

이를 알기 위해서는 Wrapper의 개념이 필요합니다.

Wrapper

php wrapper의 개념의 경우 php.net의 공식문서에 자세히 나와있습니다. php에는 파일의 이름이 주어 졌을때 기본적으로 로컬에 있는 파일이라고 가정하여 해당 파일의 경로를 해석합니다. 현재 문제에서는 index.php 라는 파일명이 주어진다면, 해당 파일이 실행되는 로컬의 ./index.php 파일을 기본적으로 찾게 되는 원리입니다. 하지만 다양한 Wrapper들을 이용하여 외부의 있는 파일을 읽어 들일수도 있습니다. 예를 들어 http://example.com/index.php 와 같은 방식으로 외부의 파일을 열 수도 있다는 것이죠.

다음 그림이 php에서 사용가능한 wrapper들의 종류입니다.

image

저는 이번 문제를 풀때 php:// wrapper를 이용하겠습니다.

php filter wrapper

php filter는 다음과 같이 사용 가능합니다.

  php://filter/read=[필터 종류]/resource=[파일 위치]

위의 방식대로 사용하면, resoucre로 준 파일을 주어진 필터로 변환하여 파일을 읽게 됩니다.

다음은 php 공식 문서에 나와있는 예제입니다.

  <?php
  /* This will output the contents of
    www.example.com entirely in uppercase */
  readfile("php://filter/read=string.toupper/resource=http://www.example.com");

  /* This will do the same as above
    but will also ROT13 encode it */
  readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
  ?>

위의 예제는 http://www.example.com파일을 string.toupper 필터와 string.rot13필터를 사용하여 필터링 하는 방식입니다.

php filter 에서 사용가능한 필터들은 다음과 같습니다

  • String filters: string.rot13, string.toupper, string.tolower
  • conversion filters: convert.base64-encode and convert.base64-decode, convert.quoted-printable-encode and convert.quoted-printable-decode, convert.iconv.*
  • Compression filters: zlib.deflate and zlib.inflate, bzip2.compress and bzip2.decompress
  • Encryption filters: mcrypt.* and mdecrypt.*

문제 풀이

본 문제에서는 위의 php filter wrapper를 이용하여 다음과 같이 해결할 수 있습니다.

  php://filter/read=string.rot13/resource=flag

image

화면에는 php 코드가 rot13으로 인코딩되어 출력되어 해당 코드가 php로 인식되지 않아서 실행되지 않았습니다. 해당 코드를 다시 rot13으로 디코딩 하면 코드가 보입니다.

image

플래그는 다음과 같습니다.

  FLAG{this_is_your_first_flag}

추가 문제 분석

해당 문제는 풀었지만 같은 방식으로 index.php를 보면 다음과 같이 되어 있습니다.

  <html>
  <head>
  <meta http-equiv=Content-Type content="text/html; charset=euc-kr">
  <title>Challenge 25</title>
  <style type="text/css">
  body { background:black; color:white; font-size:10pt; }
  textarea { background:silver; color:black; fnot-size:9pt; }
  </style>
  </head>
  <body>
  <?php
    echo("<pre>");
    system("ls -al");
    echo("</pre>");
    if(!$_GET['file']) echo("<meta http-equiv=refresh content=0;url=?file=hello>");
    echo "<hr><textarea rows=10 cols=100>";
    $file = $_GET['file'].".php";
    if($file == "index.php") exit(); // anti infinite loop
    include $file;
    echo "</textarea>";
  ?>
  </body>
  </html>

보시면 include $file 부분에서 주어지는 파일 자체를 include 시키기 떄문에 php코드로 실행되는 구조로 문제를 출제한 것이었습니다.

댓글남기기