作者:心灵

    纯属分析,并不是漏洞,也可以叫漏洞。

    程序文件不多,大致能和用户交换的就是:留言本和网址提交。2个都详细看了几次,按本小菜看来是没有使用可能性,但看完下列分析或许可能用到,现在只剩下后台可以找了。

    “admin/index.php”必须经过这里才能使用里面的文件,所以从这里下手。经典对白,看代码。

index.php:

<?
require '../init.php';
if(empty($_GET['c']) || ($_GET['c']=='login' and (empty($_GET['a']) || $_GET['a']=='login')) || $_GET['c']=='securimage')
//看来只能运行login和securimage 2个 一个是登录 一个是验证码
{}
else
{
    mod_auth::instance(); //看权限检测
    session_write_close();
}
load_controller();
?>

看文件,mod_auth:

$auth = mod_login::instance();
if(!$auth->is_login())
{
header("location: ./index.php?c=login");
}
//经测试这里不能用关闭脚本方法去绕过,因为还有别的地方验证。
!$auth 就是 instance 转过来,那段不用看了,没什么作用。

主要是 is_login,看下:

public function is_login()
    {
        $cookie = array_var($_COOKIE, AUTH_KEY . '_admin_auth');
        //获取COOKIE头   注AUTH_KEY为114la
        if (isset($cookie) and !empty($cookie))
         //判定是否为空.....
        {
            $cookie_data = explode(':', base64_decode($cookie));
            //重点  解密这段东西并变成数组  用;分开
            if (count($cookie_data) == 3)
            //如果有3组数据
            {
                $current_cookie_auth = $cookie_data [1];
                if ($current_cookie_auth == $this->())
               //get_user_agent  就是
                //return md5(AUTH_KEY . '_' . $_SERVER ['HTTP_USER_AGENT']);
                 //AUTH_KEY 是114la  然后加个_ 再加浏览器版本 然后MD5加密  这里可以自己结构了
                {
                    $current_cookie_username = $cookie_data [0];
                    $current_cookie_password = $cookie_data [2];
                    //看到没? 账号密码是保存在COOKIES里的
                    if (self::verify_login_in($cookie_data [0], $cookie_data [2]))
                   //下面就是 存在后给予管理员权限的代码  忽略不看了
//下面是 verify_login_in 检测代码
$password_md5 = md5($password);
        $select = "select * from ylmf_admin_user where
                        `name`='$username' and `password`='$password_md5'  ";
        if (app_db::query($select))
//以上是自动登录代码

然后就是看 114la_admin_auth,是如何加密的:

看登录验证代码:
if (self::verify_login_in($username, $password))
//$username, $password是POST提交的  全宇宙的登录方式都基本这样
        {
            $auth_key = self::get_user_agent();
         //上面解析了  //get_user_agent  就是
                //return md5(AUTH_KEY . '_' . $_SERVER ['HTTP_USER_AGENT']);
               //AUTH_KEY 是114la  不是随机生成的
            $auth_password = $password;
            $auth_username = $username;
            //上面2个不用解析了
            self::update_login($username);
            //记录登录记录
            $cookie_value = base64_encode($auth_username . ':' . $auth_key . ':' . $auth_password);
//重点...账号 + 114la  +密码.....
            $cookie_expire = time () + 3600; //20分钟
            //这里没用的 不用理
            $cook_pre = AUTH_KEY . '_admin_auth';
             //cookies前缀
            $_COOKIE[$cook_pre] = $cookie_value;
              //这里也不需要理会
            setcookie(AUTH_KEY . '_admin_auth', $cookie_value, $cookie_expire, PATH_COOKIE);
//写入COOKIE
            return true;
        }

    看来解密方式非常简单,就是“explode(':', base64_decode($cookie));”,这样既获得管理员明文账号密码。

    怎么获得管理员的 COOKIES?就是提交网址功能!

    在提交的主页里加一段获取 COOKIES,然后记录在文件的代码就行了,这里不多说,很简单(注意:不能跨域获取!)。

    因为管理员必须要登录后台才能查看提交网址,所以必然只有管理员才看到你的网址并打开,并具有那个 ll4la_admin_auth 的 COOKIES。

    99% 的人审核网站肯定会打开看一下,还有一个就是看都不看就通过……,就是白痴他祖先。

    注:并不是利用 XSS 盗 COOKIES,因为这套程序暂时没发现 XSS 漏洞,因为能给你使用的只有留言本和提交网址。而是引导管理员打开你的 PHP 网站来获得需要的 COOKIES。

    获取管理员 COOKIES 0DAY 就是社会工程学,因为提交网址收录的,必然管理员已经登录(具有条件了)才能看到,看到后必然打开你的网址才看下能否值得收录。

    利用方式很明显了,这需要针对性!

    PS:你的网站如何获得目标网站 COOKIES?这方法很多,跨域就难了,挂马总可以把?钓鱼可以把?