WEB安全之越权漏洞

背景

越权漏洞是Web应用程序中一种非常常见的安全漏洞,在中小网站甚至某些大型网站中同样存在,它的威胁在于某个账户可以控制全站用户数据,包括新增、修改和删除操作。越权漏洞的成因主要是由于开发人员在对数据进行操作时对客户端请求过来的数据过分相信而遗漏了权限判定。

越权类型

为了方便描述,在这里假设某网站有两种角色(普通用户和管理员),有三位用户,其中两位普通用户A和B,一位管理员C。

垂直越权

如果A用户登录网站可以查看或变更C的功能则属于垂直越权,由此可见垂直越权通常发生在不同角色之间的。

水平越权

而同角色之间可以互相查看或变更对方的数据则属于水平越权,即A可以查看或变更B的数据。

举例

  1. 用户发起一笔账户充值操作 /user/recharge?uid=12345&money=500,对应的数据库变更语句是:

    1
    update user set money = money + 500 where uid = 12345

    如果后台没有对uid作权限认证,那么任意登录用户都可以通过修改uid将这笔钱充值到指定用户,另外充值金额也存在被恶意修改的问题。这种问题经常隐藏在一些更加复杂的业务当中,往往容易被初级程序员所忽视。

  2. 用户找回密码操作,填写正确的手机+验证码进入修改密码页面,此页面的访问地址是 /user/modPwd?uid=12345,在这个页面上可以看到手机号码信息。

    1
    2
    3
    4
    手机号码:13789786790
    旧密码:[ ]
    新密码:[ ]
    [提交]

    这个例子的危害比较隐密,属于另一种漏洞表示形式即用户信息泄漏,通过修改uid可以查看对应用户的手机号,再加上用户编号在数据库中是递增的,所以可以用脚本把该网站所有用户手机号全部下载过来。

如何预防

可以看到上面随意举的几个例子,里面都发生了越权的问题,其本质还是在于后台过分相信了客户端传递过来的数据,要想解决这个问题可以从以下几个方面来思考。

  • 用户信息坚决不能放在链接地址中,一定存储在会话中,由服务器端保证安全。会话中的用户身份信息只能由信任方写入,永远不接受通过其它方式而获取到的数据,信任方通常由本地登录或第三方登录充当。
  • 用户身份信息一定从会话中获取。
  • 对有权限划分的功能操作不仅仅只是在前端进行判断,后台同样也要进行判断,确保前后一致。
  • 统一数据库的操作管理,例如通过DAO控制每个操作必须包含用户标识,从而避免其它业务对数据的直接操作。
  • 采用过滤器统一控制数据或功能的访问权限。