[webhacking.kr] old-41

asdf·2026년 4월 2일

web

목록 보기
22/32


old-41번입니다. 문제에 접속하니 파일 업로드 폼이 보이는 걸 봐서 파일 업로드에 관한 취약점이 있을 것 같습니다.

<?php
  include "../../config.php";
  include "./inc.php";
  if($_GET['view_source']) view_source();
  error_reporting(E_ALL);
  ini_set("display_errors", 1);
?><html>
<head>
<title>Challenge 41</title>
</head>
<body>
<?php
  if(isset($_FILES['up']) && $_FILES['up']){
    $fn = $_FILES['up']['name'];
    $fn = str_replace(".","",$fn);
    $fn = str_replace("<","",$fn);
    $fn = str_replace(">","",$fn);
    $fn = str_replace("/","",$fn);

    $cp = $_FILES['up']['tmp_name'];
    copy($cp,"./{$upload_dir}/{$fn}");
    $f = @fopen("./{$upload_dir}/{$fn}","w");
    @fwrite($f,$flag);
    @fclose($f);
    echo("Done~");
  }
?>

문제 코드입니다. 가장 중요하게 봐야 할 부분은 error_reporting(E_ALL); ini_set("display_errors", 1); 입니다. 이 설정으로 인해 발생하는 모든 PHP 에러가 화면에 출력되게 됩니다.

이제 파일 업로드 부분을 보겠습니다. 파일 명으로 스크립트가 실행되는 것을 막기 위해 ., <, >, /을 공백으로 replace합니다. 그 후 ./{upload_dir} 이라는 디렉터리에 올린 파일 이름과 동일한 파일을 생성한 뒤 그 파일에 플래그를 작성합니다.

하지만 upload_dir 이름이 뭔지 모르니 플래그가 만들어진 파일에 접속할 방법이 없습니다. 이때 PHP 에러 로그를 사용할 수 있습니다. 파일을 업로드할 때 어떻게든 에러를 발생시키면 파일의 경로가 에러 로그에 출력이 되고 로그를 통해 upload_dir을 확인할 수 있습니다.

에러를 일으키기 위해서는 어떻게 해야 할까요? 여러 방법이 있겠지만 여기선 파일명의 최대 길이를 사용해 보겠습니다. 대부분의 운영체제에서 최대 길이는 255자이므로 이를 넘어가는 파일명을 가지는 파일을 업로드하면 에러를 일으킬 수 있습니다.

파일명 제한이 걸리는 건 윈도우도 마찬가지이므로 burpsuite를 사용해 패킷을 수정하겠습니다.

패킷의 filename이 지금은 aa.txt로 되어있는데 이 값을 256자 이상으로 설정하면 에러가 발생합니다.

적당히 값을 길게 하고 Forward를 하면 에러와 함께 upload_dir이 나타납니다. /4b0e87fef7b5e8ba83894970c9806042e5d6ec9a 디렉터리는 공용이기 때문에 새로운 파일을 올린 뒤 그 경로로 접속해도 되지만 다른 사람들이 올렸을만한 test 같은 경로로 접속해도 플래그를 얻을 수 있습니다.

접속하면 다음과 같이 플래그를 획득할 수 있습니다.

profile
Rainy Waltz(a_hisa)

0개의 댓글