Potenciálna zraniteľnosť frameworku Nette umožňujúca SQL injection

Bezpečnostní analytici CSIRT.SK objavili potenciálnu zraniteľnosť vo webovom frameworku Nette, ktorá umožňuje vykonávať útoky typu SQL injection.

Zraniteľnosť sa nachádza v knižnici Database a súvisí s absenciou ošetrovania používateľských vstupov, ktoré preberá funkcia where($by). Táto metóda podporuje filtrovanie výsledkov databázovej požiadavky podľa poľa, v ktorom kľúče predstavujú názvy stĺpcov a hodnoty daných kľúčov predstavujú požadované hodnoty. Problematickými sú kľúče párov premenných {“kľúč“:“hodnota“}.

Útočník môže vykonať útok typu SQL injection podvrhnutím kľúča premennej priamo v URL v prehliadači alebo v závislosti od konkrétneho prípadu aj vo vstupoch aplikácie.

V prípade, že sa do metódy where odošle PHP array v tvare {“SQLi payload“=>“hodnota“}, kde SQLi payload je hodnota zadaná používateľom, daný payload sa vykoná v databáze, čím je možné docieliť získavanie citlivých údajov. Príklad útoku:

http://localhost:8000/?id%3d1)+UNION+SELECT+2,version()+FROM+test+WHERE+(1=1

Tým sa v Nette Framework vyskladá nasledovná databázová požiadavka:

“SELECT id, name FROM test (WHERE “. $column . ” = ?)”

Po doplnení hodnoty za premennú column dostaneme:

“SELECT id, name FROM test (WHERE “. “id=1) UNION SELECT 2,version() FROM test WHERE (1” . ” = ?)”

A teda finálna parametrizovaná požiadavka na databázu bude vyzerať:

“SELECT id, name FROM test (WHERE id=1) UNION SELECT 2,version() FROM test WHERE (1= ?)”

Zraniteľnosť sa vo webovej aplikácii nachádza, pokiaľ využíva knižnicu Nette/Database a ak je v Presenteri použitý kód:

$httpRequest = $this->getHttpRequest();
$filter = $httpRequest->getQuery();
$this->template->terms = $this->testFacade->findBy($filter);

Zároveň Facade používa metódu findBy definovanú nasledovne (preberá hodnotu z funkcie where):

public function findBy(array $by)  {
    return $this->database->table($this->tableName)->where($by);
  }

Možné škody:

  • Únik citlivých informácií

Odporúčania:

Pokiaľ pri vývoji webovej aplikácie v Nette Framework implementujete danú zraniteľnú funkciu, odporúčame dodatočne ošetriť používateľské vstupy (resp. kľúč premennej) v rámci best practice bezpečného vývoja.

Pre viac informácií môžete kontaktovať CSIRT.SK.