关于IPB最新的那2个漏洞

来源:岁月联盟 编辑:zhuzhu 时间:2009-12-12
关于IPB最新的那2个漏洞

5up3rh3i’blog 


漏洞公告 

1.本地包含漏洞 

主要是由于ipb自己实现的friendly URLs功能提取的url参数过滤不全导致的[或者说过分依赖 IPSLib::cleanGlobals的过滤,而根本就忽视了这个参数的过滤],作者的漏洞公告里给出了ipb 3.04详细的代码分析,下面我们看看ipb 3.0.[0-3]. 根据作者的漏洞分析,漏洞主要是function _fUrlInit()里: 

upload/admin/sources/base/ipsRegistry.php 

private static function _fUrlInit() 

if ( ipsRegistry::settings[’use_friendly_urls’] )  //默认为1 


...... 

/* Grab FURL data... */ 
if ( file_exists( IPS_CACHE_PATH . ’cache/furlCache.php’ ) ) 

require( IPS_CACHE_PATH . ’cache/furlCache.php’ ); 
self::_seoTemplates = templates; 

..... 

if ( is_array( self::_seoTemplates ) AND count( self::_seoTemplates ) AND IPS_IS_TASK !== TRUE AND IPS_IS_AJAX !== TRUE ) 
{  
qs  = _SERVER[’QUERY_STRING’] ? _SERVER[’QUERY_STRING’] : @getenv(’QUERY_STRING’); 
uri = _SERVER[’REQUEST_URI’]  ? _SERVER[’REQUEST_URI’]  : @getenv(’REQUEST_URI’); 

_toTest = ( qs ) ? qs : uri; //通过_SERVER[’QUERY_STRING’]/@getenv(’QUERY_STRING’)取url的参数,估计是考虑到_SERVER/getenv提取到 
//的变量不受魔术引号的处理[详细见<高级PHP应用程序漏洞审核技术>],而改用直接通过取?后面的来提取,这个也 
//是3.04里的exp的利用点. 

foreach( self::_seoTemplates as key => data ) 


..... 

if ( strstr( _toTest, self::_seoTemplates[’__data__’][’varBlock’] ) ) 
{  
_parse = substr( _toTest, strpos( _toTest, self::_seoTemplates[’__data__’][’varBlock’] ) + strlen( self::_seoTemplates[’__data__’][’varBlock’] ) ); 

_data = explode( self::_seoTemplates[’__data__’][’varSep’], _parse ); 
//分离提取参数 
//self::_seoTemplates[’__data__’][’varBlock’],self::_seoTemplates[’__data__’][’varSep’]等变量是 
//在require( IPS_CACHE_PATH . ’cache/furlCache.php’ );里提取: 
// 
// ’__data__’ =>  
//array ( 
// ’start’ => ’-’, 
// ’end’ => ’/’, 
// ’varBlock’ => ’/page__’, 
// ’varSep’ => ’__’, 


_c    = 0; 

foreach( _data as _v ) 

if ( ! _c ) 

k = IPSText::parseCleanKey( _v ); 
v = ’’; 
_c++; 

else 

v  = IPSText::parseCleanValue( _v ); 
_c = 0; 

_GET[ k ]     = v; 
_POST[ k ]    = v; 
_REQUEST[ k ] = v; 
_urlBits[ k ] = v; 

ipsRegistry::request[ k ]    = v; 
}//最后提取的变量经过IPSText::parseCleanValue过滤后提取.而IPSText::parseCleanValue只是过滤一些xss sql注射的一些特别字 
//符而且没有过滤../ 



虽然_SERVER[’QUERY_STRING’]在php5不受魔术引号控制,但是本身是记过了urlencode处理的,所以不好提交%00截断.不过我们可以利用超长/等字符去截断. 

2 注射漏洞 

又一个典型的intval()使用不当导致安全漏洞,详细请参考[PCH-001] 



这2个漏洞都是需要对目标程序的功能及处理过程充分了解的情况下,才有可能挖出来... 


摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/Article/200912/43305.html