Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[Web_Hacking] stage8_File Vulnerability 본문

Hack/DreamHack(로드맵)

[Web_Hacking] stage8_File Vulnerability

CIDY 2022. 7. 30. 06:59

*File Upload Vulnerability

웹 서비스 이용자의 파일 -> 서버 파일 시스템으로 업로드하는 과정에서 발생하는 취약점이다. 업로드할 파일의 이름에 대한 결정권이 이용자에게 있을 때 발생할 수 있다.

 

이것도 이전의 Injection들과 마찬가지로 이용자의 입력을 그대로 이용하는 과정에서 발생하는 취약점인 것.

 

크게 Path Traversal악성 파일 업로드가 있다.

 

 

->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.run()

위 코드는 Path Traversal 취약점이 있는 코드이다. 해당 엔드포인트에서는 ./upload/[업로드한_파일] 이렇게 저장한다. 근데 filename이 그대로라 내가 디렉토리를 조종할 수 있게 된다. (../같은걸로 상위 디렉토리에 파일 배치 가능)

 

위 코드에 파일을 정상적으로 업로드 할 경우, f.filename변수로 내가 업로드 한 파일 이름이 들어가고, upload디렉토리 하위에 내가 업로드한 파일이 배치된다.

 

그런데 만약 ../hack.py 라는 파일제목으로 업로드하게 될 경우

$ ls -lR
-rw-r--r--  1 dreamhack  staff  461  1 30 21:52 app.py
-rw-r--r--  1 dreamhack  staff  431  1 30 22:12 hack.py
drwxr-xr-x  3 dreamhack  staff   96  1 30 21:31 uploads
./uploads:
total 8
-rw-r--r--  1 dreamhack  staff   13  1 30 21:31 test.txt

 

 위와 같이 upload의 하위가 아닌 upload와 동등한 위치에 업로드 된 것을 볼 수 있다. ..로 한 디렉토리 위로 가서 그렇다.

 

여기서 만약 app.py를 덮어쓸 여건이 된다면 서버 재실행 시 원하는 .py파일을 실행시킬 수 있게 되는 것.

 

 

 

->악성 파일 업로드

 

웹 서버는 .php, .jsp, .asp과 같은 파일들을 CGI(Common Gateway Interface)로 실행하고, 해당 결과를 이용자에게 반환한다.

<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

위 코드는 이용자가 요청한 파일 확장자가 정규표현식".+\.ph(p[3457]?|t|tml)$"을 만족하면 x-httpd-php로 핸들링하게 하는 Apache설정 파일이다. 

 

x-httpd-php는 PHP엔진으로, 요청한 파일을 실행한 뒤 결과를 반환함 -> .php, .php3, .phtml이 위 정규표현식을 만족함 -> 공격자가 .php파일로 php소스 파일을 업로드하고, GET요청을 보낼 수 있으면 CGI가 해당 파일을 실행할 것임

 

웹 브라우저는 파일 확장자 및 응답의 Content-Type에 따라 요청을 처리하는 방식이 다양하다. 요청 파일의 확장자가 .html이거나, 반환된 Content-Type헤더가 text/html일 경우, 응답은 HTML엔진으로 처리된다.

(물론 .png, .jgp같은 이미지 확장자거나, Content-Type이 image/png일 경우는 이미지로 렌더링됨.)

 

공격자가 서버네 exploit.html을 업로드하고, 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html이라면,

브라우저가 이를 HTML로 인식 -> exploit.html에 공격 스크립트가 있으면 XSS공격 가능

 

 

<?php
  system("ls");
  system($_GET[x]);
?>

.php확장자로 위와 같은 php코드를 업로드 할 수도 있고,

 

<script>alert(1);</script>

.html로 위와 같은 JS를 업로드해 실행시킬 수도 있다.

 

 

 

 

 

*File Download Vulnerability

서버 파일 시스템에 있는 파일을 다운로드하는 과정에서 발생하는 취약점. -> 이용자가 다운받을 파일 이름을 설정할 수 있을 때 발생

 

웹 서비스는 이용자가 파일을 다운받을 때, 특정 디렉토리의 파일만 접근 가능하도록 해야 한다. 근데 이것도 위의 업로드 취약점과 유사하게 Path Traversal을 이용할 수 있다.

https://vulnerable-web.dreamhack.io/download/?filename=notes.txt
https://vulnerable-web.dreamhack.io/download/?filename=../../../../../../etc/passwd
https://vulnerable-web.dreamhack.io/images.php?fn=6ed0dd02806fa89e233b84f4.png

위와 같은 URL패턴에서 주로 취약점이 발생할 수 있다고 한다.