Piwigo_12.2.0_两枚SQL注入_CVE
字数 1541 2025-08-06 18:07:56
Piwigo 12.2.0 SQL注入漏洞分析与复现技术文档
0x00 概述
本文档详细分析Piwigo 12.2.0版本中存在的两处SQL注入漏洞(CVE-2022-26266和CVE-2022-32297),包括漏洞原理、利用条件和复现方法。第一处漏洞存在于用户管理功能中,第二处是一个需要管理员交互的二次注入漏洞,危害性更大。
0x01 环境准备
测试环境搭建
- 下载Piwigo 12.2.0版本:
- GitHub: https://github.com/Piwigo/Piwigo
- 官网: https://piwigo.org/
- 安装要求:PHP环境、MySQL数据库
0x02 CVE-2022-26266漏洞分析
漏洞描述
- 影响版本:Piwigo 12.2.0
- 漏洞文件:
include/ws_functions/pwg.users.php - 漏洞类型:SQL注入
- 利用条件:需要后台管理员权限
漏洞原理
- 漏洞位于
ws_users_getList函数中,通过ws.php的addMethod方法暴露为Web服务 - 攻击入口:访问
ws.php?method=pwg.users.getList - 关键漏洞点:
order参数未正确过滤直接拼接到SQL查询中
漏洞利用步骤
- 登录后台管理系统
- 导航至:用户 -> 管理 -> 用户列表
- 拦截请求,添加
order参数 - 构造SQL注入payload
漏洞验证
请求示例:
GET /ws.php?method=pwg.users.getList&order=SQL_INJECTION_PAYLOAD HTTP/1.1
0x03 CVE-2022-32297漏洞分析
漏洞描述
- 影响版本:Piwigo 12.2.0
- 漏洞类型:二次SQL注入
- 利用条件:需要管理员点击恶意链接
- 危害:可从前台获取数据库敏感信息
漏洞原理分析
数据插入部分
- 搜索功能处理文件:
qsearch.php - 搜索参数:
q - 数据处理流程:
- 将搜索内容序列化为数组
- 使用
addslashes处理 - 插入
SEARCH_TABLE表
管理员操作部分
- 触发文件:
admin/history.php - 关键漏洞点:
- 从数据库取出未转义的序列化数据
- 反序列化后直接拼接到SQL语句
- 二次注入点:
user_id参数处理时
前台数据获取
- 获取文件:
include/functions_search.inc.php - 调用位置:
search_rules.php - 数据泄露点:通过
search_id获取敏感信息
漏洞利用步骤
1. 构造并插入Payload
- 构造特殊搜索内容,使序列化数据包含SQL注入代码
- 通过搜索功能将恶意数据存入数据库
2. 管理员触发漏洞
- 诱使管理员访问恶意链接
- 链接中包含精心构造的
search_id和user_id参数
3. 前台获取敏感数据
- 攻击者通过
search_rules.php获取泄露的数据
完整利用链
- 构造Payload:
test'),((select concat('a:1:{s:1:"q";s:34:"',(SELECT password FROM piwigo_users where id=1),'";}')))#
- 使用数组形式绕过转义:
q[0]=test'),((select concat('a:1:{s:1:"q";s:34:"',(SELECT password FROM piwigo_users where id=1),'";}')))#
- 管理员触发后,通过
search_id获取数据
0x04 漏洞修复建议
- 升级到最新版本
- 临时修复措施:
- 对
order参数进行严格过滤 - 在反序列化数据后增加转义处理
- 限制数据库查询权限
- 对
0x05 技术总结
-
CVE-2022-26266:
- 直接SQL注入
- 需要管理员权限
- 利用相对简单
-
CVE-2022-32297:
- 二次注入漏洞
- 需要管理员交互
- 利用链复杂但危害更大
- 可从前台获取敏感数据
-
共同点:
- 都涉及不安全的SQL拼接
- 都位于12.2.0版本
0x06 参考链接
- 官方漏洞公告
- Piwigo GitHub仓库
- CVE详细描述页面
附录:关键代码片段
ws_users_getList函数中的漏洞代码:
$query = '
SELECT *
FROM '.USERS_TABLE.'
ORDER BY '.$params['order'].'
LIMIT '.$params['per_page'].'
OFFSET '.($params['per_page']*$params['page']).'
';
- 二次注入关键代码:
// admin/history.php
$page['search'] = unserialize($search['rules']);
// ...
$insert = array(
'user_id' => $_GET['user_id'],
'rules' => serialize($page['search']),
);
注意:本文仅用于安全研究和防御技术学习,请勿用于非法用途。