일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- overthewire
- Reconnaissance
- php login page
- php 로그인 페이지 만들기
- Recon
- Cookie
- privilege escalation
- FTZ
- SQLi
- tryhackme
- OS Command Injection
- War Game
- Cryptography
- THM
- php 파일 업로드하기
- access control
- php
- active reconnaissance
- BANDiT
- ssrf
- Authentication
- over the wire
- Leviathan
- active recon
- 파일 업로드 취약점
- file upload
- Server Side Request Forgery
- php file upload
- php To Do List
- sql injection
- Today
- Total
R's Hacking Daily Log
File Upload - Lab (4) 본문
Lab - Web shell upload via obfuscated file extension
이번 Lab에서는 파일 확장자와 관련된 파일 업로드 공격을 살펴볼 것이다.
이전에 살펴본 Lab은
:) 파일 업로드가 제한되는 장소(= directory)를 우회하는 directory traversal
:) file type 제한을 우회하는 Content-type header
등을 활용해 공격했다면 이번 Lab에서는 파일 확장자에 대해 다뤄볼 예정!
** 파일 확장자란,
파일명 뒤에 명시되는 값으로 파일이 어떤 종류의 파일인지를 나타내주는 역할을 한다.
흔히 텍스트 파일은 txt, 사진은 png & jpg, 그밖에 html, css, js, php, c, exe 등 ".file_extension"과 같은
형태로 작성된다.
이번 Lab의 목표를 먼저 정리해보자면
1) /home/carlos/secret file 내용을 조회하고자 한다.
2) 파일 업로드 취약점이 존재하는 서버
3) 하지만 blacklist에 해당하는 파일 확장자는 업로드할 수 없다.
공격자 입장에서 파일 확장자가 제한되는 기능을 우회해 web shell을 업로드하는 것이 주 목표이다.
wiener:peter 계정으로 로그인한 후, 이전 Lab에서 사용했던 webshell.php file을 업로드해봤더니
JPG or PNG file만 업로드할 수 있다고 한다.
php file을 업로드하기 위해 jpg or png file 확장자로 인식되도록 할 수 있는 방법을 찾아보자!
POST FORM 내용을 보면 content-disposition header에 filename 값이 들어있는 걸 볼 수 있다.
이 값을 변경하면서 response를 확인해보면
1) filename = "webshell.php.jpg"
2) filename = "webshell.php;.jpg"
3) filename = "webshell.php%00.jpg"
3가지 경우 모두 업로드에 성공한 걸 볼 수 있다.
다만 파일을 업로드한 경우, 서버에서 php file을 실행시켜 /home/carlos/secret file 내용을 응답으로 보내주는 데
어떤 경우는 shell 내용이 cleartext 상으로 응답이 오거나
애초에 /files/avatars/FILENAME에 대한 get request 기록을 찾아볼 수 없었다.
하. 지. 만.
file은 정상적으로 업로드되었다고 했기 때문에 파일 경로를 아는 입장으로서 직접 get request를 보내면 된다!
/files/avatars/webshell.php file을 달라는 요청 메세지를 서버로 보내면
성공적으로 /home/carlos/secret file 내용을 얻을 수 있다.
(+) 위에서 시도했던 filename 값들을 살펴보면 뒤에 .jpg가 그대로 남아있는 경우에
response로 cleartext 상태의 file 내용이 제공되었다.
이미지로 판단을 했기 때문에 이미지 파일의 내용을 읽어서 보내주는 형태로 동작을 한 것이다.
하지만 공격자 입장에서는 파일이 실행되어야 하기 때문에 확장자가 .php만 남도록 파일 확장자를 조작해야 하고
그에 알맞은 filename은 "webshell.php%00.jpg"이다.
%00은 null byte를 의미한다. 이 값이 filename으로 들어가면 서버에서는 맨 뒤에 있는 .jpg를 보고 이미지로
판단하여 파일 업로드에 성공하게 되고
파일이 실행이 될 때는 파일명을 앞에서부터 읽어 %00 이전의 값까지 인식한다.
.jpg 부분을 무시하도록 %00(= null byte)를 넣어 사실상 실행되는 파일의 이름은 webshell.php가 되는 것이다.
그러므로 shell 내용을 얻기 위해 request로 보내는 파일명이 webshell.php가 된다.
'Port Swigger > File Upload' 카테고리의 다른 글
File Upload - Lab (5) (0) | 2023.06.25 |
---|---|
File Upload - Lab (3) (0) | 2023.06.21 |
File Upload - Lab (2) (0) | 2023.06.21 |
File Upload (1) & Lab (1) (0) | 2023.06.20 |