注:越权不要影响其他用户的数据,本文章仅供技术研究,任何非法行为与本文无关。
账号 a 能操控账号 b 的数据。账号 a 和账号 b 平级。
水平越权最好有两个账号,什么覆盖、删除功能的越权,不要尝试在其他用户的账号上。
账号 a 能使用账号 b 的接口,账号 b 是管理员或 vip,开发者认定账号 b 能独享一些特殊接口。
或者说账号能不按规定访问功能。
水平越权需要两个账户进行测试,因为一些删改的功能点会影响其他用户的数据,另外有时候返回包是没有办法提现是否越权成功的,需要在第二个账号上查看效果。
越权修改和删除全站帖子,修改自己的帖子并抓包,然后遍历帖子id即可越权:
POST /api/shop_transfer/edit HTTP/2
Host: xxx.com
Content-Length: 434
Xweb_xhr: 1
Content-Type: application/x-www-form-urlencoded
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Priority: u=1, i
id=215635&title=1234&area=123&rent=123.00&rent_id=0&transfer_fee=123.00&industry_id=9&industry_type_id=18&shop_type_id=1&city_id=182&county_id=1025&village_id=1646&address=11111111111111&content=sssssssssssssssssss&contacts=如果你看到这个,说明存在越quan&longitude=0.000000&latitude=0.000000

越权修改地址,通过篡改地址id,达到越权的目的:
登录第二个账号,发现成功修改:
越权查看,点击编辑地址,抓包:
点击后抓包:
GET /app/index.php?i=5&c=entry&do=shop&m=sz_yi&p=address&op=get&id=227622 HTTP/1.1
Host: xxx.com
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.9
Priority: u=1, i
Connection: keep-alive
遍历地址id即可:
uuid场景下,id不可遍历,但是可以尝试在系统中其他位置或接口中找到他人的uuid来进行越权。
某系统,在如下场景获得他人uuid:
抓包如下:
通过上述方法获取他人uuid后,将此数据url编码后作为sender参数内容。
{"departmentCode":"2627e74b6aff40fb8da660fd9552f8c5-dept","organizationNames":"0xxxx","userId":"xxxx","userName":"xxx","uuid":"e832ca35-cd81-435a-a513-f0f5c51a38c9"}
越权伪造他人身份发送信息:
POST /EIP////sendMessage HTTP/2
Host: xxx.cn
Content-Length: 644
Sec-Ch-Ua-Platform: "Windows"
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Sec-Ch-Ua-Mobile: ?0
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Priority: u=1, i
receiverId=xxxx&content=你好啊!!!&sender={"departmentCode":"2627e74b6aff40fb8da660fd9552f8c5-dept","organizationNames":"0xxxx","userId":"xxxx","userName":"xxx","uuid":"e832ca35-cd81-435a-a513-f0f5c51a38c9"}
id仍然不可遍历,但是id通过时间戳构成,如何变废为宝?
大多数情况下,时间戳类型的id虽然可遍历,但是爆破所有的id几乎不可能,一天一共有86400秒,也就是说,你跑86400次才能跑完一天时间之内创建的id,效率极低。
但是不可遍历就无法利用吗,看如下案例:
上图中id存在越权,其构成为:
EA251016-150741-1111
EA年月日-时分秒-id号
可以通过插入探测标记,来帮助我们越权测试,比如说我们创建了如下id的身份信息:
EA251017-143551-1119 # 这表明在14点35创建了一个身份信息,id号为1119。
EA251017-152317-1122 # 这表明在15点23创建了另一个身份信息,id号为1122。
在1119和1122之间,发现1120和1121被他人占用了,这说明在14点35到15点23之间,其他人创建了两个身份信息,那么我们就生成14点35到15点23的时间,依次遍历即可。
成功遍历到1121的id:
那么问题来了,如果id是纯时间戳,没有这种1119和1122帮助我们探测该怎么办?
这种情况下,只能找一个用户最有可能活跃的时间段来进行爆破,比如说下午2点到6点。
越权+xss组合拳。而越权能把self-xss提升为存储xss,甚至危害更高。
这只是一个简单的提交数据的功能,提交后发现self-xss,因为大多数情况这种私密的东西只能自己和管理员(或权限更高的用户)查看。(只是一个简单的self-xss)
但是账号2能越权修改账号1提交的数据:
越权修改成功:
那么在越权修改的时候插一个xss标签,直接能精准打击所有用户。
垂直越权如果有两个账号(一个低权限,一个高权限)的情况下,测试非常简单,将低权限账户cookie替换到高权限的账户进行测试即可。
但大多数情况下,无法同时获取到高低权限账户,只能获取低权限账户。这时,只能通过findsometing或者jsfinder等js提取工具来提取js接口,或者说手动审计并提取前端js接口。
无高低权限账户情况下挖掘垂直越权非常苛刻,因为不仅需要提取js中的接口,还要猜测此接口的参数。通过js接口fuzz挖掘的垂直越权全都是get型(无参数)的,也有另一种情况就是垂直越权功能点直接暴露在前端界面上,这时候的垂直越权不需要构造参数,最后一种情况就是垂直越权的功能点没有显示在前端页面上,只能提取接口然后猜参数。
提取接口,get型直接梭哈,这个案例是小程序的漏洞,小程序接口需要解包后提取js接口:
findsomething提取接口,get型直接梭哈:
就是刚才说的第二种情况,垂直越权接口能通过前端页面触发,不需要构造参数:
这种虽然是post型的,但是参数不需要构造,就是通过js代码访问接口而已:
第三种情况,越权接口暴露在前端页面上,但前端直接阻拦不让访问,这时通过提取接口通过猜测参数构造数据包。
点击立即咨询后,会直接弹出如下提示:
这时常规思路就是提取接口猜测参数,但是这个案例下有更简单的办法,就是在规定时间内(9点到12点,14点半到17点)访问此服务,不就不需要构造参数了吗?然后在规定时间外再访问此接口,发现规定时间外能成功发起咨询:
参数如下,硬猜很难猜:
{
"title":"校园跑",
"lbfl":"非艺术类",
"zxnr":"每个学期都要进行校园跑吗?"
}

当然这个洞是没啥危害的,但是思路还是好的。
水平越权大多出现在与用户绑定的间接数据上,如:地址、帖子、评论、订单等。
垂直越权有三种挖掘场景:
get型梭哈。
直接通过前端点点点,不需要猜参数。
前端不让点点点,只能猜测参数。