Lxblog 是 PHPWind 开发的一套基于 PHP+MySQL 数据库平台架构的多用户博客系统,强调整站与用户个体间的交互,拥有强大的个人主页系统、独立的二级域名体系、灵活的用户模板系统、丰富的朋友圈和相册功能。 代码分析片段: =======================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');...
Lxblog 是 PHPWind 开发的一套基于 PHP+MySQL 数据库平台架构的多用户博客系统,强调整站与用户个体间的交互,拥有强大的个人主页系统、独立的二级域名体系、灵活的用户模板系统、丰富的朋友圈和相册功能。 代码分析片段: =======================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[]赋值为相同变量即可 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漏洞, 2009-05-08 LxBlog ---------- 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: <a href=http://www.lxblog.net/ target=_blank rel=external nofollow>http://www.lxblog.net/</a>