yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

challenge (old-41) 본문

wargame 풀이/webhacking.kr

challenge (old-41)

yehey 2021. 1. 31. 20:01

41번 풀이

41번 문제 페이지는 다음과 같다.

php 소스코드를 확인해보자

<?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~");
  }
?>
<form method=post enctype="multipart/form-data">
<input type=file name=up><input type=submit value='upload'>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>

. < > / 과 같은 문자가 나온다면 삭제해서 필터링해주고 있다.

그리고 copy함수를 이용해서 cp 변수에 업로드 디렉토리와 필터링이 끝난 파일 이름을 복사하고 있다. 

copy가 끝난 후에는 해당 파일을 열어서 그 안에 flag를 쓰고 종료한다.

한번 버프스위트를 켜고 upload 요청을 인터셉트 해보자!

 

다음과 같이 인터셉트가 되었다.

파일을 선택하지 않고 upload를 눌렀기 때문에 filename이 비어있다.

이 부분을 임의로 채워서 전달해보자!

 

Done이 출력된 것으로 보아 성공적으로 동작을 마친 것 같다.

우리가 업로드한 파일에 접근하려면 업로드 경로를 알아야 하는데 우리는 경로를 알 수 없다..

 

경로를 알아내기 위해서 copy 함수를 실행할 때 오류가 나게끔 만들어보자!

그럼 오류메시지를 통해서 뭔가 얻을 수 있지 않을까?

 

필터링 되는 애들을 넣어보았다 그럼 fn 변수가 ""로 비어있을거라고 예상했다

 

오류 메시지가 출력되긴 했지만 디렉터리 정보는 알아내지 못했다.

그럼 다른 방식으로 오류를 내야할 것 같다.

 

이번에는 filename에 엄청 긴 문자열을 인자로 전달해보았다. 시스템이 처리할 수 없을만큼 길게!

 

이번에는 조금 전의 오류메시지와 다른 오류가 출력되었다!

copy 함수에서 해당 디렉토리를 여는 것을 실패했다는 의미같다!

우리가 입력한 filename 앞에 디렉터리가 있다!!

기존 URL에 해당 경로와 처음에 성공적으로 등록했던 파일을 순서대로 입력해주면 파일이 열리고 읽을 수 있게 된다!

 

FLAG를 얻을 수 있었다!

'wargame 풀이 > webhacking.kr' 카테고리의 다른 글

challenge (old-21)  (0) 2021.02.07
challenge (old-23)  (0) 2021.02.07
challenge (old25)  (0) 2021.01.21
challenge (old-42)  (0) 2021.01.19
challenge (old-6)  (0) 2021.01.19
Comments