关于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