【Web安全漏洞】 用户越权问题

一、越权的定义

越权: 我们知道正常情况下,一个用户通常只能对自己的一些信息进行增删改查;但是如果项目的程序员写DDL时没有先判断需要操作的数据是否属于对应的用户的信息,或者该用户是否有权限对这个数据进行操作,就会导致这个用户的权限设置形同虚设,从而出现越权问题。

横向越权: 指攻击者尝试访问与他拥有相同权限的用户的资源。当用户A与用户B是同层级(相同权限)的用户,若用户A在发起请求时通过变更自己的uesrid为B用户的userid,就可以对B用户的数据进行操作,这是横向越权。即Web应用程序接收到用户请求修改某条数据时,没有判断数据的所属人,或者在判断数据所属人时从用户提交的表单参数中获取了userid。导致攻击者可以自行修改userid修改不属于自己的数据。

纵向越权 指低级别攻击者尝试访问高级别用户的资源。当用户B比用户A的权限更高,若用户A通过变更自己的uesrid就可以对B用户的数据进行操作,这是纵向越权。即由于Web应用没有做权限控制,或仅仅在菜单上做了权限控制,导致恶意用户只要猜测其他管理页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。

二、越权的解决方法

1.纵向越权的解决方案

对于纵向越权,建议最好使用基于角色的访问控制机制来防止攻击。即预先定义不同的权限角色,为每个角色分配不同的权限,每个用户都属于特定的角色,即拥有固定的权限,当用户执行某个动作或产生某种行为时,通过用户所在的角色判定该动作或者行为是否允许。

2.横向越权的解决方案

场景1: 可通过建立用户和可操作资源的绑定关系,用户对任何资源进行操作时,通过该绑定关系确保该资源是属于该用户所有的。

案例: 用户先登陆自己的账户,然后请求某个删除接口(删除自己的联系方式的接口),此时拿到接口的请求数据,通过更改接口中用户的信息为B的,从而达到删除B的联系方式的目的。
解决: 这里注意,我们在删除联系方式(tel)时,不能单纯以tel为主键就做删除操作。程序员在编写删除的SQL时,都应该写成根据【用户联系方式的主键和可操作用户的主键】一起删除这条信息的SQL。其他与用户相关的信息也该如此。

场景2: 对于请求中的关键参数进行间接映射,避免使用原始关键参数名,比如使用索引1代替id值123等。

案例: 在用户进入重置密码的页面后,就更换使用其他用户的用户名,从而成功修改其他用户的密码,然后就可以使用其他用户的账户了,这非常不合理。
解决: 这种情况下,我们可以使用缓存来进行辅助。在用户进入重置密码的前一步,即回答问题正确的情况下,后台服务器就用【此时的用户名和某个唯一值】组合生成token存储在缓存中,并返回给前端。当用户提交重置密码操作后,重置密码的接口中要求前端传递该值,我们就先根据用户名在缓存中取出token,如果取出的值和参数中传入的相同,则证明重置的当前用户的密码,允许修改数据库中此用户的密码;否则不予以重置操作。并且缓存中的唯一数据是有时间限制的,这样可以进一步提高安全性。

猜你喜欢

转载自blog.csdn.net/ly_6699/article/details/112870483