可以把未授权访问漏洞理解成:一个房子没锁门,或者锁是坏的,任何人不用钥匙、不用登记,直接就能推门进去,还能随便翻东西、改东西、拿东西,甚至把房子里的东西全毁了。
一. 定义
未授权访问(Unauthorized Access)是指攻击者在未经过身份验证、未获得合法权限的情况下,绕过系统的访问控制机制,直接访问、读取、修改、删除系统资源(如数据、接口、文件、后台管理页面、数据库等)的安全漏洞。它属于访问控制类漏洞,是Web应用、服务器、网络设备、IoT设备中最常见、危害极大的高危漏洞之一。
比如正常情况下,你要进一个网站的后台、看自己的隐私数据、改系统设置,都得先登录(相当于拿钥匙开门),而且只能看/改自己权限内的东西。但有这个漏洞的系统,不用登录、不用账号密码,甚至你是普通用户,都能直接摸到管理员的地盘、看到别人的隐私、删改重要数据。
分为两类:
1.垂直越权
垂直越权就是不同权限等级的用户之间越界访问,比如普通账号盗用管理员的权限删帖子
测试方法:
- 盲测:是指没有提前拿到后台地址清单,靠积累的常见后台路径经验去一个个尝试访问,比如输入"/admin"、"/manage"这类网址,看能不能直接进入未授权的管理页面。
- 高低权限测试:简单说就是同时用普通账号和管理员账号分别登录两个浏览器,把普通账号的Cookie复制替换到管理员账号的浏览器里,看能不能用普通账号的身份执行管理员的操作,以此来验证系统的权限校验是否存在漏洞。
2.水平越权
水平越权是同一权限级别的用户之间越界,比如你用自己的淘宝账号登录后,能访问和你同等级的另一个用户的购物车。
二. 漏洞产生的核心原因
主要原因是后台越权:开发人员误以为前台页面没放后台功能的入口,用户就访问不到后台接口,但其实一旦后台的请求规则泄露,攻击者就能伪造请求直接调用接口;而且水平越权的功能本身就是对外开放的,这也给了攻击者可乘之机。
-
- 访问控制缺失/设计缺陷:系统未对资源访问做权限校验,或校验逻辑存在漏洞(如仅前端校验、后端未校验)。
-
- 身份认证绕过:利用弱口令、默认账号、Cookie/Token伪造、会话劫持、参数篡改等方式绕过登录验证。
-
- 接口/路径暴露:敏感接口、后台路径、文件目录未做隐藏或权限限制,可直接通过URL/路径访问。
-
- 权限校验逻辑漏洞:如越权访问(水平越权、垂直越权)、权限继承错误、权限判断条件可被篡改。
-
- 配置不当:服务器/应用开启目录浏览、默认权限开放、敏感文件未设置访问权限、API未做鉴权。
-
- 第三方组件漏洞:使用的框架、插件、中间件(如Tomcat、Nginx、Redis、MongoDB)存在未授权访问缺陷。
简单理解就是:要么是系统根本没装"门锁"(没做登录/权限校验),要么是门锁是假的(只在页面上拦一下,后台根本没检查),要么是门锁坏了(权限判断逻辑有问题,随便改个参数就能绕过去),还有的是用了默认的"万能钥匙"(系统自带admin/123456这种账号,没改),甚至房子的窗户、后门全敞着(敏感文件、接口直接暴露,谁都能找到)。
直接构造后台能识别的请求格式,比如知道了查询用户信息的接口是"/getUser?userId=1",把数字改成2就能看到另一个用户的信息,这个过程不一定需要拿到登录凭证(token),而是利用了权限校验的漏洞。
权限校验漏洞:系统没有在关键操作前验证你是否真的有资格做这件事。比如你本来只能看自己的订单,但系统只检查了你是登录状态,没检查你要查看的订单ID是不是属于你的,这就产生了权限校验漏洞。
三. 漏洞常见表现形式
-
- 直接访问敏感页面:无需登录即可打开后台管理页、用户信息页、配置页。
-
- 未授权接口调用:直接请求API接口(如/user/info、/admin/delete)即可获取/操作数据,无需Token/登录态。
-
- 目录遍历/文件读取:通过路径遍历(如../)访问服务器上的敏感文件(配置文件、日志、源码、数据库文件)。
-
- 未授权数据库/中间件访问:Redis、MongoDB、Elasticsearch、Memcached等未设置密码,可直接连接操作数据。
-
- 越权访问:普通用户访问管理员功能(垂直越权),或A用户访问B用户的私有数据(水平越权)。
-
- 默认账号/弱口令利用:使用系统默认的admin/123456等账号直接登录,绕过权限控制。
四. 漏洞危害等级与影响
-
- 危害等级:普遍为高危/ critical,部分场景(如直接获取数据库、服务器权限)为超危。
-
- 数据泄露:窃取用户隐私(手机号、身份证、密码)、商业数据、核心业务数据。
-
- 数据篡改/删除:恶意修改订单、用户信息、系统配置,删除核心数据导致业务瘫痪。
-
- 权限提升:获取管理员权限,进而控制整个系统、服务器。
-
- 服务器入侵:通过未授权访问获取服务器文件、执行命令,植入木马、挖矿程序,实现主机控制。
-
- 业务破坏:破坏支付、交易、管理流程,导致系统无法正常运行,造成经济损失与声誉损害。
黑客能直接偷走你的手机号、身份证、密码,能改网站的内容、删订单、删用户数据,能拿到管理员权限把整个网站搞瘫痪,甚至能进到服务器里装病毒、偷数据、搞破坏,对网站和用户来说都是大麻烦。
五. 漏洞检测方法
-
- 手动测试:遍历URL路径、测试接口参数、尝试绕过登录、检查默认端口/路径、验证权限校验逻辑。
-
- 自动化扫描:使用漏洞扫描工具(如AWVS、Nessus、Burp Suite)扫描未授权访问的接口与路径。
-
- 配置审计:检查服务器、中间件、应用的权限配置、鉴权规则、默认账号设置。
-
- 代码审计:审查后端代码中是否存在未做权限校验的接口、路径,校验逻辑是否存在缺陷。
-
- 渗透测试:模拟攻击者行为,尝试绕过认证、越权访问,验证漏洞的可利用性。
先打开Burp Suite并设置浏览器代理,让所有流量经过Burp抓取。接着用普通账号登录目标网站,在Burp的历史记录里找到查看个人信息的请求并发送到Repeater模块;再用管理员账号登录一次,同样抓取查看个人信息的请求,把管理员的Cookie替换到普通账号的请求里发送。如果能成功返回管理员的个人信息,就说明存在越权漏洞,原理就是系统没有对请求者的真实权限和所请求的数据权限做严格校验。
六. 漏洞修复与防护措施
-
- 完善身份认证与鉴权:所有敏感资源、接口必须强制登录验证,采用强认证机制(如多因素认证、Token鉴权)。
-
- 严格权限控制:遵循最小权限原则,区分用户角色与权限,实现垂直/水平权限隔离,后端做双重权限校验。
-
- 隐藏敏感路径与接口:禁用目录浏览,修改默认后台路径,敏感接口不暴露在公开环境。
-
- 修复配置问题:关闭中间件/数据库的默认端口、默认账号,设置强密码,限制IP访问,禁用不必要的功能。
-
- 代码安全开发:后端统一鉴权拦截,避免前端仅做校验,修复越权、参数篡改等逻辑漏洞。
-
- 第三方组件安全:及时更新框架、中间件版本,修复已知未授权访问漏洞,禁用不安全的组件。
-
- 安全监控与审计:记录访问日志,监控异常访问行为,及时发现未授权访问攻击。
研发层面可以给每个重要数据都加上"权限标签",比如用户A的订单只能被用户A和管理员查看,系统每次处理请求都要核对操作人权限和数据标签是否匹配,这样就算有人篡改了请求里的ID,没有权限也拿不到数据。监控层面可以重点盯着"短时间内频繁访问不同ID数据"的行为,比如1分钟内查了100个用户的订单,就自动触发告警并拦截,这种异常行为很可能是黑客在扫漏洞。
例如黑客如果摸清了网站的请求规律,用Cookie替换的方法就能很快拿到非授权的数据,不管是增删还是查询数据都可能出现越权问题。我们要做的防护有两方面,一是把订单ID这类关键参数做加密处理,别用容易被猜的数字顺序;二是在逻辑上严格校验,确保用户只能操作自己权限内的数据,从这两点切断黑客的越权操作。
可以利用数据加密技术,但加密有局限性:给用户ID做哈希加密能防批量遍历猜解,但如果加密后的ID泄露了,攻击者还是能拿着这个ID去访问对应的数据。而且现在公司基本都有流量监控,黑客用这种方法很容易被抓到,所以加密ID只能防小范围的试探,没法完全杜绝风险。参数加密只能挡住黑客用自动化工具批量猜解ID的遍历攻击,但如果黑客已经拿到了某个合法ID,加密并不能阻止他访问这个ID对应的数据,所以这只是缓解手段,不能从根本上解决越权问题。
更高级的防护方法是通过Nginx代理在传输层对请求和参数进行动态加密和混淆,这样黑客就算抓包也看不懂真实内容,而且这种加密对用户是透明的,不影响正常使用,但能有效拦截扫描工具的自动化攻击。
总结说就是
1、控制参数,加密或者多因素,防止遍历。但参数加密仅仅只能防止的是遍历,并不能真正解决越权,还只是缓解的方式;
2、流量监控。现在有一种防范越权和自动化扫描的方法。这个方法,在开发上不用做任何的越权防范,而且扫描器也无法进行正常网站爬行,目前也有产品推出。通过做nginx代理,获取所有的通讯web流量,并且对http传输的请求、内容进行重写、js混淆加密,对返回所有的连接、参数进行重写,到客户端后,流量能正常解析,浏览器能正常接卸,依赖于浏览器的特性,但是扫描器却不知道具体的连接、参数是什么,人工查看源代码时也是混淆过的,发出来的请求也是加密过的,但是到了nginx代理后,会根据加密算法进行解密,也就是web端请求数据也全加密了是吧,明文丢给后端的应用进行处理。
简单理解就是:就是把门锁装好、修好:所有重要页面和接口都必须登录才能进,给不同的人分不同的"钥匙"(权限),普通用户拿不了管理员的钥匙;把后门、窗户关好(隐藏敏感路径),换掉默认的万能钥匙(改默认账号、设强密码),定期检查门锁坏没坏(做安全测试、代码审计)。
小补充:
Cookie是网站存放在你浏览器里的小文件,里面可能包含你的用户ID、登录状态等信息。可以把用户ID当成你的身份证号,Cookie就是网站给你发的带照片的临时通行证,里面印着你的身份证号,每次访问网站时自动出示,证明"你是你"。
Token是一串加密的字符串,相当于你登录系统后拿到的"电子通行证"。当你登录APP或网站时,服务器会生成一个Token发给你,之后你每次操作都带上这个Token,服务器就能快速识别你的身份和权限,不用反复输入密码。和Cookie不同的是,Token一般由前端存在本地存储里,安全性更高,也更适合手机APP这类场景。