Author: handt
site :upload/2011/3/201103240211173836.jpg” border=”0″ small=”0″ alt=”" />
0×01 exploit 使用演示
在 /phpweb 目录下建立文件vuln.php ,将 [1] 中给出的exploit代码复制进去,保存。
确保你的php.exe在环境变量中,在/phpweb目录shift+右键,打开命令行,输入:
php vuln.php
出现使用提示:
本地的fckeditor路径为 /htdocs/js/fckeditor/editor……
所以输入命令为:
php vuln.php 127.0.0.1 /js/fckeditor/
是config.php文件中没有开启上传功能,ok,修改config.php第30行:$Config['Enabled'] = false;
再次输入 php vuln.php 127.0.0.1 /js/fckeditor/
看来是遇到死循环了,没办法,自己打印一些中间信息进行查看,在connector.php文件中对传入的三个参数进行简单处理后调用了
FileUpload( $sResourceType, $sCurrentFolder, $sCommand ) ;
这里三个参数值分别为:Image,/fuck.php .gif/,FileUpload 。
FileUpload()在commands.php中定义:
function FileUpload( $resourceType, $currentFolder, $sCommand )
{
if (!isset($_FILES)) {
global $_FILES;
}
$sErrorNumber = ’0′ ;
$sFileName = ” ;
echo ‘#4#’;
if ( isset( $_FILES['NewFile'] ) && !is_null( $_FILES['NewFile']['tmp_name'] ) )
{
echo ‘#5#’;
global $Config ;
$oFile = $_FILES['NewFile'] ;
echo ‘#10#’;
// Map the virtual path to the local server path.
$sServerDir = ServerMapFolder( $resourceType, $currentFolder, $sCommand ) ;
通过打印 #x# 的提示信息,可以判断出问题出在ServerMapFolder()函数上,该函数在io.php中定义:
function ServerMapFolder( $resourceType, $folderPath, $sCommand )
{
// Get the resource type directory.
$sResourceTypePath = GetResourceTypeDirectory( $resourceType, $sCommand ) ;
再看GetResourceTypeDirectory()的代码:
function GetResourceTypeDirectory( $resourceType, $sCommand )
{
global $Config ;
if ( $sCommand == “QuickUpload”)
{
if ( strlen( $Config['QuickUploadAbsolutePath'][$resourceType] ) > 0 )
return $Config['QuickUploadAbsolutePath'][$resourceType] ;
// Map the “UserFiles” path to a local directory.
return Server_MapPath( $Config['QuickUploadPath'][$resourceType] ) ;
}
else
{
if ( strlen( $Config['FileTypesAbsolutePath'][$resourceType] ) > 0 )
return $Config['FileTypesAbsolutePath'][$resourceType] ;
// Map the “UserFiles” path to a local directory.
return Server_MapPath( $Config['FileTypesPath'][$resourceType] ) ;
}
}
最后,路径信息落到了Server_MapPath()里面,这里$Config['FileTypesPath'][$resourceType] 值在config.php中设置,此处为
$Config['FileTypesPath']['Image']的值,看看Server_MapPath()的内容:
function Server_MapPath( $path )
{
// This function is available only for Apache
if ( function_exists( ‘apache_lookup_uri’ ) )
{
echo ‘func exist!!’;
echo $path; // 注意,这里打印的信息
$info = apache_lookup_uri( $path ) ;
return $info->filename . $info->path_info ;
}
// This isn’t correct but for the moment there’s no other solution
// If this script is under a virtual directory or symlink it will detect the problem and stop
return GetRootPath() . $path ;
}
函数中$path打印的值为:/userfiles/image/ 很正常,而最后返回的值为/index.php/userfiles/image/,显然是因为function_exists( ‘apache_lookup_uri’ )为true,导致$info->filename执行,导致结果错误。
注释掉 return $info->filename . $info->path_info
再次执行:
php vuln.php 127.0.0.1 /js/fckeditor/
ok,让人欣喜的结果出来了,看看/htdocs/userfiles/image目录吧:
现在小马已经写入服务器,接下来就是用客户端连接了。这里,推荐大家使用”中国菜刀“这款工具,可以直接对php、asp、aspx的一句话木马进行连接:
看到效果了吧:
0×02 实战
这个因为比较危险,所以具体的过程和方式就不详细叙述了。
总之,通过自己的实战证明,这个exploit绝对可以拿到webshell,只是概率并不高,需要耐心和良好的google关键字。
0×03 成因分析
0×01中只是演示了利用过程,下面对背后的原理进行分析。水平有限,错误的地方还请指出。
待有时间了补充
0×04 小结
在使用中自己想深入了解的地方有:
1.“一句话木马客户端”的原理,以及如何编写木马客户端。
2.漏洞的发掘过程,目前企业界好像很流行fuzzing测试,但是这种具体的程序怎么进行测试我还是不了解,有知道的朋友还请不吝赐教: mail2gw@qq.com
本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/528236,如需转载请自行联系原作者