Potenciálna zraniteľnosť pri používaní frameworku Nette umožňuje SQL injection

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

Metóda where($by) v knižnici Database 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 môžu byť kľúče párov premenných {“kľúč“:“hodnota“}.

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ť vo webovej aplikácii môže nastať, pokiaľ programátor 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ú funkcionalitu, odporúčame ošetriť používateľské vstupy (resp. kľúč premennej) podľa programátorom zadaného poľa povolených  názvov stĺpcov v rámci best practice bezpečného vývoja.

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