市面上很多注入、XSS等漏洞的挖掘文章,但是权限类漏洞讲的比较少。并且在最近项目上发现的越权,未授权类的漏洞比较多,就想着写这么一篇文章,也是总结一下自己最近的学习心得。
文章开头也希望大家看看OWASP TOP10漏洞的变化,刚开始我觉得没什么,注入也只是变成了第三。然后实际过程中发现,注入漏洞真的变少了,或者不容易发现了,更多关注的,便是访问控制类的漏洞。
首先理解什么是未授权漏洞
未授权字面上理解是未获得授权,对于正常的业务来说,有些功能点需要经过登录之后才能进行,那么如果我们通过一些绕过,无需登录也可以完成此类操作,那么便是未授权访问漏洞了。
常见的未授权漏洞一般分为两种:
1、组件类的,如redis未授权、mongodb未授权等,也是比较常见的。对于此类漏洞,可以理解为不需要登录即可执行里面的功能,所以存在未授权漏洞。
2、WEB层面的,如某某CMS未授权文件上传、未授权创建账号等。因为可以绕过登录限制进行操作,所以存在未授权访问漏洞。
本文旨在探究WEB层面的未授权访问漏洞,暂不涉及组件类漏洞,感兴趣的可以参考格格巫 MMQ!!师傅的文章:https://blog.csdn.net/weixin_43214644/article/details/124348759
由于 HTTP 是无状态的协议,不能保存每一次请求的状态,所以需要给客户端增加 Cookie 来保存客户端的状态。在一些xss的文章中也常常会讲到Cookie的概念。以防有师傅不理解,这里简单讲一下。
Cookie,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。简单来说,Cookie就是一个加密了的字符串,用来分辨用户身份的,有点像放在保险箱中的身份证。
当然不仅仅只能通过cookie,还有auth,jwt等认证方式。大体方向是一样的,都是为了辨别用户身份。
理解了什么是cookie之后,我们一起模拟一个场景:
用户A是某网站的管理员,他今天的任务是修改一个账号的信息。首先,A打开网站后台登录界面,输入账号密码后登录系统,在系统后台界面点击用户管理功能,在管理功能中找到并点击修改按钮,在修改界面进行了修改账号信息的操作,点击完成。
思考:
1、在登录后,A至少点击了几个功能?
2、点击后台功能的时候,系统是怎么知道A是否登录的?
第一个问题,访问用户管理是一个,点击修改按钮是一个,点击修改完成按钮是一个。至少有3个,可能细节没有描述好,还会有更多。
进入到第二个问题,我想应该很多人已经知道了,就是Cookie,或者说是认证因子。考虑用户的体验性,不可能进行一步操作便输入一次账号密码的,当然,这是最安全的。
挖掘方式很简单,既然系统通过检测Cookie等认证因子进行判断是否登录,那么只需要将认证因子删除,分析删除前后返回包的变化即可判断。
这样一想,对于使用Burp测试来说,只需要将数据包中的Cookie等字段值置空或者修改为无用字符,再查看前后的数据包是否相同即可。有那么一个插件可以帮助快速挖掘此类漏洞。
项目地址:https://github.com/theLSA/burp-unauth-checker
burp本身的抓包模块也有个功能可以进行替换,将授权类参数替换即可,不过好像不太好用,这是直接修改数据包内容而不是重放操作,影响体验。如图新增了一个规则,将匹配到Match的替换成Replace的内容。
代码层面以某OA系统为例,通过auth.inc.php文件进行鉴权,在需要鉴权的文件中包含auth.inc.php,即可达到鉴权的效果。
例如某个备份数据库操作,便在最前面包含了auth.inc.php文件进行鉴权。
auth.inc.php文件中可以看到进行了校验
使用用户A的权限去操作用户B的数据,如果能够成功操作,则称之为越权操作。如果A、B的权限相同,或者说是在同一水平层面的,那么我们称此操作为水平越权。如果A的权限小于B的权限,那么我们称此操作为垂直越权。
如果问我近几个月的渗透测试项目什么漏洞比较多,我应该会说越权漏洞。在理解了越权漏洞之后,发现这类问题真的特别多,并且挖掘难度没有特别大。
首先我将挖掘越权类漏洞分为两大类:
1、未使用cookie鉴权,通过修改userid等字段进行越权。
2、使用cookie鉴权,未检测对应操作是否符合当前权限预期。
(下面通过某CMS模拟漏洞环境,并非实际存在越权类漏洞。)
要挖掘越权类漏洞,不能局限于1、2个功能点。首先需要在大体方向上判断,整个系统的功能点,有没有通过userid等参数值进行校验的。常见方式便是通过全局搜索userid、id、countid等字符,通过修改对应id值进行判断。
例如此处获取用户数据功能,如果未检测用户id是否与cookie对应。那么便可以通过枚举用户id,获取其他用户数据。
或者在某个获取验证码功能,通过修改user字段值,伪造代替其他用户获取验证码进行越权操作。
第一种、拥有两个账号密码的情况下,使用管理员账号操作,抓取数据包,修改cookie为普通用户的cookie
第二种、只有普通账号的情况下,通过js文件发现接口,通过自主访问接口,fuzz字段值进行越权测试
1、登录管理员用户,获取以下cookie
PHPSESSID=lm5n7it0hinhbnqa3fp4v263i3
2、登录普通用户,获取以下cookie
PHPSESSID=9sa9vq9ng9n7b9hodjrkel5qg7
3、使用管理员进行添加用户操作并抓取数据包
4、将数据包发送到重放模块,替换cookie为普通用户cookie。如果依旧可以正常执行,那么即表示存在越权漏洞。
当然也可以使用burp替换的方式进行
这种情况下测试越权比较麻烦,但是更加适用于没有账号然后通过暴力破解获取了一个低权限账号的情况下,一般会先通过js文件、swagger等获取存在的接口,然后访问接口查看是否能直接获取信息。如果能够获取信息那么删除认证因子看看是否能够未授权。
如果直接访问提示错误,并且没有办法fuzz到具体的参数的话,一般就无法利用了。但是有些情况下,会提示缺少什么参数,或者什么参数不能为空。这就可以构造出具体的请求包进行测试了,如果能够进行操作,比如获取某用户信息,修改某用户数据,那么便是存在越权漏洞。
使用普通账号登录后的Cookie,构造更新数据的数据包,成功执行更新操作,即存在越权漏洞。
当提示无权限或者其他错误信息,即不存在越权漏洞。
权限问题最近发现了特别多,一开始挖掘替换cookie实现的越权,感觉好像没什么危害,但是当只有普通用户的情况下,通过js文件翻到了许多接口,再结合一些数据包中的参数,fuzz之后成功构造了数据包,越权实现了许多高危操作后,我发现越权漏洞确实应该重视。那么怎么修复此类漏洞呢?其实只要在每个操作前面做两个步骤:1、检测cookie是否已登录。2、如果该功能属于管理员才能操作的功能,检测cookie中的用户是否属于管理员组。