__________ ___ ___ \______ \__ __ ______/ | \ | _/ | \/ ___/ _ \ | | \ | /\___ \\ / |____|_ /____//____ >\___|_ / -======\/==security=\/=team==\/ Advisory#22 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Продукт: MyBB Версия: 1.00 Release Candidate 4 Авторы: http://www.mybboard.com/ Уязвимости: SQL injection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ===================================== Уязвимость найдена в файле global.php ===================================== Код: --- $mybb['location'] = $REQUEST_URI; if(!strstr($mybb['location'], "member.php?action=avatar") && !$noonline) { $db->query("UPDATE ".TABLE_PREFIX."online SET uid='$mybb[uid]', time='$time', location='$mybb[location]', ip='$ipaddress' WHERE (ip='$ipaddress' AND uid='$mybb[uid]') OR (ip='$ipaddress')"); --- Как видно из кода переменная $mybb['location'] берется из строки запроса и никак не фильтруется перед помещением в запрос. Описание: Во всех файлах форума в начале прописано require "./global.php"; поэтому при передаче любому файлу параметра содержащего кавычку форум будет вываливаться с ошибкой mySQL error: 1064 You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '127.0.0.1' WHERE (ip='127.0.0.1' AND uid='0') OR (ip='127.0.0.1 Query: UPDATE mybb_online SET uid='0', time='1106762393', location='/myBB/member.php?'', ip='127.0.0.1' WHERE (ip='127.0.0.1' AND uid='0') OR (ip='127.0.0.1') Пример: http://host/MyBB/index.php?' http://host/MyBB/member.php?' http://host/MyBB/any_file.php?' Дополнительно: Как видно из вышеприведенного описания при попытке использования уязвимостей SQL injection в любых файлах форума мы не сможем получить никакого результата используя кавычку в запросе так как до выполнения уязвимого запроса в файле который мы будем пробовать дело просто не дойдет и форум вернет ошибку на стадии подключения global.php, поэтому использование кавычки невозможно. Поэтому при эксплуатировании ошибок в других файлах необходимо использовать %27 вместо кавычки. ============================ И еще немного про global.php ============================ Код: ---- if($pid && !$tid) { $query = $db->query("SELECT f.style, f.overridestyle FROM ".TABLE_PREFIX."forums f, ".TABLE_PREFIX."posts p WHERE f.fid=p.fid AND p.pid='$pid'"); $style = $db->fetch_array($query); } if($tid && !$fid) { $query = $db->query("SELECT f.style, f.overridestyle FROM ".TABLE_PREFIX."forums f, ".TABLE_PREFIX."threads t WHERE f.fid=t.fid AND t.tid='$tid'"); $style = $db->fetch_array($query); } if($fid) { $query = $db->query("SELECT f.style, f.overridestyle FROM ".TABLE_PREFIX."forums f WHERE f.fid='$fid'"); $style = $db->fetch_array($query); } ---- Примеры: http://host/MyBB/showthread.php?fid=%27 http://host/MyBB/showthread.php?tid=%27 ===================================== Уязвимость найдена в файле member.php ===================================== Код 1: ------ if($action == "do_register") { ... $query = $db->query("SELECT username FROM ".TABLE_PREFIX."users WHERE username='$username'"); ... } ------ Код 2: ------ elseif($action == "activate") { if($username) { $query = $db->query("SELECT * FROM ".TABLE_PREFIX."users WHERE username='$username'"); ... } ------ Код 3: ------ elseif($action == "do_resendactivation") { $query = $db->query("SELECT u.uid, u.username, u.usergroup, u.email, a.code FROM ".TABLE_PREFIX."users u LEFT JOIN ".TABLE_PREFIX."awaitingactivation a ON (a.uid=u.uid AND a.type='r') WHERE u.email='$email'"); ... } ------ Код 4: ------ elseif($action == "do_lostpw") { $query = $db->query("SELECT * FROM ".TABLE_PREFIX."users WHERE email='$email'"); .. } ------ Код 5: ------ elseif($action == "resetpassword") { if($username) { $query = $db->query("SELECT * FROM ".TABLE_PREFIX."users WHERE username='$username'"); ... ------ Код 6: ------ else if($action == "do_login") { $query = $db->query("SELECT uid, username, password FROM ".TABLE_PREFIX."users WHERE username='$username'"); ... ------ Пример 1: http://host/MyBB/member.php?action=do_register&username=%27 Пример 2: http://host/MyBB/member.php?action=activate&username=%27 Пример 3: http://host/MyBB/member.php?action=do_resendactivation&email=%27 Пример 4: http://host/MyBB/member.php?action=do_lostpw&email=%27 Пример 5: http://host/MyBB/member.php?action=resetpassword&username=%27 Пример 6: http://host/MyBB/member.php?action=do_login&username=%27 ===================================== Уязвимость найдена в файле portal.php ===================================== http://host/MyBB/portal.php?action=do_login&username=%27 ===================================== Уязвимость найдена в файле search.php ===================================== http://host/MyBB/search.php?action=finduser&uid=%27 http://host/MyBB/search.php?action=results&sid=%27 ====================================== Уязвимость найдена в файле private.php ====================================== http://host/MyBB/private.php?action=send&uid=%27 =================================== Уязвимость найдена в файле misc.php =================================== http://host/MyBB/misc.php?action=help&hid=%27 ======================= Уязвимости в usercp.php ======================= В меню настроек пользователя можно вставлять кавычки во все поля которые там есть и все это будет вызывать ошибки в синтаксисе sql ... описывать более подробно все ошибки из этого файла мне лень так как там их слишком много. ========== Заключение ========== Уязвимости проявляют себя только при выключенном magic_quotes, поэтому один из способов защиты (далеко не лучший) состоит во включении в php.ini данного параметра. Некоторые из описанных уязвимостей могут использоваться для получения информации из БД mysql любых версий при помощи использования эксплоита реализующего посимвольный перебор. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1dt.w0lf // RusH security team // www.rst.void.ru // 01.2005 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~