【Web实战】记一次前台getshell组合拳审计的完整过程
字数 1555 2025-08-10 08:28:49

Web安全审计实战:从前台注入到后台GetShell的完整过程

1. 源码整体审计

1.1 系统架构分析

  • 采用MVC模式的CMS系统
  • 两个入口文件:
    • index.php - 前台入口
    • admin/index.php - 后台入口
  • 核心处理流程:入口文件 → 定义常量 → 调用APP::run()

1.2 权限控制机制

  • 控制器分布在两个目录:
    • controllers/ - 前台控制器
    • admin/controllers/ - 后台控制器
  • 权限校验特点:
    • 不是统一鉴权,而是通过父类实现
    • SAdmin类会检测session但不强制拦截
    • 具体权限校验通过CheckAccessCheckAction方法实现
    • 权限校验基于"权限字符是否在权限字符串中"的机制

1.3 输入过滤机制

  • 过滤函数集中在functions.globals.php
  • 关键过滤函数:
    • 实体编码+加斜杠处理
    • 通过三个核心函数获取输入:
      • _GET
      • _POST
      • _COOKIE
  • 潜在问题:
    • 未过滤其他HTTP头(X-Forwarded-For、Client-IP等)
    • 过滤不是强制性的,依赖开发者主动调用

2. 漏洞审计发现

2.1 后台文件上传漏洞

  • 漏洞类型:目录穿越+文件上传
  • 利用条件:
    • 后台管理员权限
    • 上传模版文件功能
  • 漏洞细节:
    • 未过滤相对路径(如../)
    • 仅检查文件后缀白名单
    • 可直接上传Webshell

2.2 后台SQL注入漏洞

  • 漏洞位置:数据库管理功能
  • 漏洞原因:
    • 使用反引号包裹输入参数
    • 过滤函数不过滤反引号
  • 利用POC示例:
    /admin/index.php/database/operate?dbaction=emptytable&tablename=hong_acat`+where+cat_id=2+and+sleep(2);--%20)#
    
  • 影响范围:所有使用$database变量的地方

2.3 后台目录穿越漏洞

  • 简单目录遍历漏洞
  • 利用价值较低

3. 前台SQL注入漏洞深入分析

3.1 漏洞发现

  • 未过滤参数:用户注册时的IP地址(GetIP()函数)
  • 调用链:注册流程 → 使用GetIP() → 插入数据库

3.2 GetIP()函数分析

function GetIP() {
    // 从HTTP头获取IP
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['HTTP_CLIENT_IP'] ?? getenv('REMOTE_ADDR');
    
    // 如果IP格式无效,则使用gethostbyname($_SERVER['HTTP_HOST'])
    if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $ip)) {
        return gethostbyname($_SERVER['HTTP_HOST']);
    }
    
    return $ip;
}
  • 漏洞点:
    1. 当X-FORWARDED-FOR或CLIENT-IP不是有效IP格式时
    2. 使用HTTP_HOST头值通过gethostbyname()转换
    3. gethostbyname()不对输入做SQL过滤

3.3 漏洞利用条件

  1. 设置X-FORWARDED-FOR或CLIENT-IP为非IP格式值
  2. 修改Host头为SQL注入Payload

3.4 注入原理解析

原始SQL语句:

INSERT INTO {TABLE_PREFIX}_user 
(groupid, activated, username, password, verifycode, joindate, joinip, lang, nickname, email) 
VALUES 
($groupid, $activated, '$username', '" .md5($password). "', '$verifycode', '" .time(). "', '" .GetIP(). "', $lang, '$nickname', '$email')

3.5 创建管理员账号的Payload

', 1, '123', '222@222.22'),(1, 1, '111111111', '593c9b4a9390551d53e5cacf28ebd638', '96fbTjrp', '1697167889', ' ', 1, '111111111', '222@222.22')#
  • 效果:
    • 创建用户名为111111111
    • 密码为111111111111(MD5: 593c9b4a9390551d53e5cacf28ebd638)
    • 用户组ID为1(管理员)

4. 完整攻击链利用

4.1 攻击步骤

  1. 利用前台SQL注入漏洞创建管理员账号
    • 构造特殊HTTP请求:
      • 设置X-Forwarded-For为非IP值
      • 设置Host头为注入Payload
  2. 使用创建的管理员账号登录后台
  3. 利用后台文件上传漏洞获取Webshell
    • 通过模版文件上传功能
    • 使用目录穿越+恶意文件上传

4.2 防御建议

  1. 输入过滤:
    • 统一过滤所有HTTP输入
    • 对IP地址严格验证
    • 使用参数化查询
  2. 权限控制:
    • 统一权限校验入口
    • 强制session验证
  3. 文件上传:
    • 限制上传目录
    • 检查文件内容而不仅是扩展名
  4. 错误处理:
    • 禁止显示数据库错误信息

5. 学习要点总结

  1. 关注输入源:不仅检查GET/POST,还要检查所有HTTP头
  2. 信任边界:从不可信源到可信源的所有数据流都要验证
  3. 最小权限原则:数据库操作使用最低必要权限
  4. 防御深度:多层防御机制比单一防护更可靠
  5. 代码审计技巧
    • 先理清系统架构
    • 跟踪敏感函数调用链
    • 特别注意数据从不可信源到敏感操作的路径
Web安全审计实战:从前台注入到后台GetShell的完整过程 1. 源码整体审计 1.1 系统架构分析 采用MVC模式的CMS系统 两个入口文件: index.php - 前台入口 admin/index.php - 后台入口 核心处理流程:入口文件 → 定义常量 → 调用 APP::run() 1.2 权限控制机制 控制器分布在两个目录: controllers/ - 前台控制器 admin/controllers/ - 后台控制器 权限校验特点: 不是统一鉴权,而是通过父类实现 SAdmin 类会检测session但不强制拦截 具体权限校验通过 CheckAccess 和 CheckAction 方法实现 权限校验基于"权限字符是否在权限字符串中"的机制 1.3 输入过滤机制 过滤函数集中在 functions.globals.php 关键过滤函数: 实体编码+加斜杠处理 通过三个核心函数获取输入: _GET _POST _COOKIE 潜在问题: 未过滤其他HTTP头(X-Forwarded-For、Client-IP等) 过滤不是强制性的,依赖开发者主动调用 2. 漏洞审计发现 2.1 后台文件上传漏洞 漏洞类型:目录穿越+文件上传 利用条件: 后台管理员权限 上传模版文件功能 漏洞细节: 未过滤相对路径(如 ../ ) 仅检查文件后缀白名单 可直接上传Webshell 2.2 后台SQL注入漏洞 漏洞位置:数据库管理功能 漏洞原因: 使用反引号包裹输入参数 过滤函数不过滤反引号 利用POC示例: 影响范围:所有使用 $database 变量的地方 2.3 后台目录穿越漏洞 简单目录遍历漏洞 利用价值较低 3. 前台SQL注入漏洞深入分析 3.1 漏洞发现 未过滤参数:用户注册时的IP地址( GetIP() 函数) 调用链:注册流程 → 使用 GetIP() → 插入数据库 3.2 GetIP()函数分析 漏洞点: 当X-FORWARDED-FOR或CLIENT-IP不是有效IP格式时 使用HTTP_ HOST头值通过gethostbyname()转换 gethostbyname()不对输入做SQL过滤 3.3 漏洞利用条件 设置X-FORWARDED-FOR或CLIENT-IP为非IP格式值 修改Host头为SQL注入Payload 3.4 注入原理解析 原始SQL语句: 3.5 创建管理员账号的Payload 效果: 创建用户名为 111111111 密码为 111111111111 (MD5: 593c9b4a9390551d53e5cacf28ebd638) 用户组ID为1(管理员) 4. 完整攻击链利用 4.1 攻击步骤 利用前台SQL注入漏洞创建管理员账号 构造特殊HTTP请求: 设置X-Forwarded-For为非IP值 设置Host头为注入Payload 使用创建的管理员账号登录后台 利用后台文件上传漏洞获取Webshell 通过模版文件上传功能 使用目录穿越+恶意文件上传 4.2 防御建议 输入过滤: 统一过滤所有HTTP输入 对IP地址严格验证 使用参数化查询 权限控制: 统一权限校验入口 强制session验证 文件上传: 限制上传目录 检查文件内容而不仅是扩展名 错误处理: 禁止显示数据库错误信息 5. 学习要点总结 关注输入源 :不仅检查GET/POST,还要检查所有HTTP头 信任边界 :从不可信源到可信源的所有数据流都要验证 最小权限原则 :数据库操作使用最低必要权限 防御深度 :多层防御机制比单一防护更可靠 代码审计技巧 : 先理清系统架构 跟踪敏感函数调用链 特别注意数据从不可信源到敏感操作的路径