浅析BlogEz安全性
来源:网络
BlogEz是一款免费的PHP博客系统,页面非常漂亮,功能也很齐全。目前有比较多的网站采用了这套系统作为自己的网上家园。在看完所有的代码后,我发现其安全性还是不错的,该系统的程序员对脚本方面的一些基本安全问题都考虑到了,不过由于他的疏忽,还是有几个地方存在一些问题,可能导致非法入侵。下面我们就一起来看一下。
comment.php文件的作用是对文章进行评论,它只对ID进行了过滤,其他地方过滤的很简单,可以轻易地绕过。其代码如下:
if (isset($_POST['verify']) && ($_POST['verify']==$_SESSION['session_verify'])){
if(isset($_POST['blogid'])){
$blogid=intval($_POST['blogid']); '把ID转换成整数
$url=($setting['buildhtml']=='yes')?"$setting[siteurl]/archives/$blogid.html#comment":"index.php?action=blog&bid=$blogid#comment";
$author=trim($_POST['author']); '没有进行任何过滤
$parseurl=isset($_POST['url'])?trim($_POST['url']):'no';
$useubb=isset($_POST['ubbcode'])?trim($_POST['ubbcode']):'no';
$usesmile=isset($_POST['smile'])?trim($_POST['smile']):'no';
$content=trim($_POST['content']);
$time=time();
$ip=realip();
$ischecked=($setting['checkcomment']=='yes')?'no':'yes';
$sql="Insert INTO `".$table_prefix."comment`(blogid,ischecked,author,content,addtime,ip,parseurl,useubb,usesmile)VALUES('".intval($blogid)."','$ischecked','".addslashes($author)."','".addslashes($content)."','$time','".addslashes($ip)."','$parseurl','$useubb','$usesmile')";
从上面的代码可以看出,程序就是用addslashes()和intval()进行简单的转换,并没有进行字符的过滤,虽然说在一定程度上可以防止漏洞的出现,但总感觉没有本质的提高。在转换之后就直接把数据插入到数据库当中,这样就出现了跨站漏洞,可以用来挂马。
gbook.php是该系统的留言版文件,在处理用户留言时,同样没有对输入的字符进行认真过滤。其代码如下:
$user=trim($_POST['author']);
$email=trim($_POST['email']);
$img=trim($_POST['face']);
$hidden=isset($_POST['hiddengbook'])?'yes':'no';
$parseurl=isset($_POST['url'])?trim($_POST['url']):'no';
$useubb=isset($_POST['ubbcode'])?trim($_POST['ubbcode']):'no';
$usesmile=isset($_POST['smile'])?trim($_POST['smile']):'no';
$content=trim($_POST['content']);
$ip=realip(); '获取真实IP地址
$addtime=time();
$sql="Insert INTO `".$table_prefix."gbook`
(user,img,email,hidden,parseurl,useubb,usesmile,content,ip,addtime)VALUES('".addslashes
($user)."','".addslashes($img)."','".addslashes($email)."','".addslashes
($hidden)."','$parseurl','$useubb','$usesmile','".addslashes($content)."','$ip','$addtime')";
//echo $sql;
从以上代码可见,它存在着很严重的跨站漏洞,如图3所示,并且可以用来挂马。不过这里输入挂马代码之后,会导致其他的留言也看不到了,并且挂马的网站打开之后是一片空白。比如我们输入frameborder=0 width=300 height=300 scrolling=no src=http://www.baidu.com></iframe>之后,显示的空白如图4所示。
search.php是实现搜索功能的文件,但是这个文件在处理用户输入的数据时,没有进行任何过滤就操作了数据库。其漏洞代码如下:
$key=trim($_REQUEST['key']); '直接取得数据,没有经过正则表达式的过滤
$type=trim($_REQUEST['type']);
$page=intval($_GET['page'])?intval($_GET['page']):1;
$psize = $setting['searchnums']; '每页显示记录数
$start=($page-1)*$psize;
//echo $type,$key;
if($type=="title"){
$sql="Select id,sid,posticon,title,top,author,visits,addtime,weather FROM
".$table_prefix."blog Where title LIKE '%$key%' orDER BY id DESC LIMIT $start,$psize";
$total_sql="Select id FROM ".$table_prefix."blog Where title LIKE '%$key%'";
} '$key没有经过任何的过滤就进行数据库查询,下面也是如此
elseif($type=="content") {
$sql="Select id,sid,posticon,title,top,author,visits,addtime,weather FROM
".$table_prefix."blog Where content LIKE '%$key%' orDER BY id DESC LIMIT $start,$psize";
$total_sql="Select id FROM ".$table_prefix."blog Where content LIKE '%$key%'";}
elseif($type=="comment") {
$sql="Select blogid,content FROM comment Where content LIKE '%$key%' orDER BY
id DESC LIMIT $start,$psize";}
elseif($type=="gbook") {
$sql="Select id,title FROM guestbook Where content LIKE '%$key%' orDER BY id DESC LIMIT $start,$psize";}
同时,search.php也没有对输入的长度进行限制,其代码如下:
<form action="http://65.109.213.64/blog/search.php" name="search" method="post">
<input type="hidden"name="action"value="do">
<table width="100%" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td valign="top" align="center"><select name=type>
<option value="title">标题</option>
<option value="content">内容</option>
</select>
<input type="text" size="12"name="key"value=""><input type="submit" value="搜
索"class="bginput">
</td>
</tr>
</table>
</form>
所以,以上代码处我们就可以用来查询网站管理员的密码,可以用类似这样的代码来查询:关键字%' and (select top 1 asc(mid 字段,1,1)) from 用户名=ASICC值 and '%。比如我们随便输入BLOG%' and (select top 1 asc(mid username,1,1)) from admin=97 and '%,那么执行后语句就变成了:Select id,sid,posticon,title,top,author,visits,addtime,weather From ".$table_prefix."blog Where title Like 'BLOG%' and (Select top 1 asc(mid username,1,1)) From admin=97 and '%' orDER BY id DESC LIMIT $start,$psize。如果这里存在username字段及admin用户,那么就可以得到admin的密码;但是这里没有usernamer字段,所以数据库出现错误,泄露了很多敏感信息,如图5所示。这里存在的注入漏洞和我们平时在URL地址栏使用的差不多,利用它同样可以得到管理员的密码,只是现在它出现在搜索栏内而已,都是换汤不换药,所以这里我就不详细讲解了。
更重要的是,这个系统的后台的安全性同样存在很大问题,很多地方都是直接进行数据库操作的,比如admin.php文件中的一段代码:
$id=$_REQUEST['id'];
$sql="Select
id,username,password,userid,name,img,sex,job,love,age,email,qq,homepage,user1,user2,hidden
FROM ".$table_prefix."user,".$table_prefix."aboutus Where id=$id AND userid=id";
$rs=mysql_query($sql);
$num=mysql_num_rows($rs);
看出来了吗?这段代码就是经典的PHP注入代码,不过我们都进入后台了,注入漏洞对我们也没多少的用处。像这样的代码在后台存在很多,由于这套系统支持文件和图片两种上传方式,并且支持数据库的备份,所以我们可以先把PHP木马的格式改掉,然后利用数据库备份来得到Webshell。
不过总的来说,虽然存在上面的诸多问题,但这个系统安全性还是不错的。可就是由于作者对脚本方面的漏洞还没有一个非常清楚和全面的了解,所以导致出现了一些安全问题,而且挺严重的,利用这些漏洞不仅可以用查询数据库中管理员的密码,还可以挂马,最后还可以得到Webshell,所以对网站是一个极大的威胁,希望使用这个系统的站长注意了,如果对PHP语言很熟悉的话,最好自己打上补丁。
我还是没看明白“
这个站还不错。