0x00 越权漏洞
越权漏洞是Web应用程序中一种常见的安全漏洞。它的威胁在于一个账户即可控制全站用户数据。当然这些数据仅限于存在漏洞功能对应的数据。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。所以测试越权就是和开发人员拼细心的过程。
0x01 分析可能存在越权的位置
上面说过了只要对数据库进行增、删、改、查询的情况都可能存在越权。我们来看一般我们在web应用开发时操作数据库常会出现的一般语句:
增加:
insert into tablename values(一些字段) where userid/username=12345/用户名
参考例子:
WooYun: 爱拍越权漏洞及设计不合理漏洞大礼包(妹子哭了)
删除:
delete from tablename where id=123
参考例子:
WooYun: 百度创意专家某功能平行权限漏洞(可删除他人素材)
更改:
update 一些字段 tablename set 一些字段 where userid/username=12345/用户名
查询:
select * from tablename where id=12345
WooYun: Like团用户信息泄露+越权漏洞(可获取大量用户住址联系信息)
本人不做开发,sql语句比较弱,大牛勿喷,此处只是为了说明问题。大家可以看到,以上语句都涉及where,而后面的userid或username即是越权的突破口。在操作数据库时功能请求中往往会带着一些参数来用于辨别信息的唯一值。而这些参数就是我们越权时需要注意的。
在web开发中判断用户身份的字段往往是不会在客户端传递的。用户登录系统后,开发人员一般会创建一个session来保存用户名。当用户在查看、修改个人信息等需要判定用户身份时,就直接从session中获取,而不会在客户端传递,也就避免了篡改。但若出现从客户端传递的话,那么就必须要有一步权限验证的要求了。所以在测试越权时要用抓包工具截获请求,细览下可能存在辨别信息的唯一值,来进行测试。这里要说一点,传输的参数并不一定在请求参数中,也有可能存在链接等位置。如:
有人可能开始抱怨,请求中那么多参数、而且还可能存在一个请求需要多个辨别参数的可能,再加上链接中也有可能,这也太难找了。现提供一个方法可以轻松让你知道哪里存在越权。喜欢玩XSS的人定会恍然大悟。
0x02 测试越权技巧
相信越权的成因大家都已经理解了,哪些功能可能存在越权大家也心里也有谱了。接下来就是测试了。相信这才是大家最想看的,王尼玛同学是如何高效测试越权的?
看官莫急,先看基础测试方法:要测试越权需要注册两个账户,来互相探测能否影响到对方数据。方法很简单打开两个不同的浏览器,大小号账户各自登录一个不同浏览器。
步骤一:
打开fiddler2按f11,截断大号上更新用户信息请求。(查看参数可以选择fiddler中Inspects下的WebFroms或TextView。只有在截断的情况下,才可以修改请求。)
判断出可能辨别用户身份的参数ulogin。
步骤二:截断小号浏览器中更新用户信息的请求
步骤3:将小号中ulogin的参数值替换为大号的,然后解除fiddler截断(shift+f11),将请求放过去(),查看下大号用户信息是否更改。
以上即是常规的测试方法。大家可以看到消耗时间的麻烦在辨别参数上、对比大号和小号请求有何不一样的参数值上、切换浏览器查看数等等。如果遇到更改删除等功能,还要两端各自新建出数据、查看id等等、麻烦的要死。
为了避免以上消耗时间的操作其实可以利用fiddler2复制小号浏览器中的cookie值,到大号的请求中即可验证越权。操作就是用fiddler先截获一个小号的访问目标站点的请求,在fiddler2的head标签下将cookie复制出来
小号的浏览器就可以不用管了,用Fiddler2截断大号的请求,把小号的cookie覆盖大号的cookie,进行测试。如果改变了大号的数据则说明越权,然后在分析是哪个参数造成的。如果未改变,则说明不存在越权,该功能直接越过。小号的cookie一直在剪贴板中的,所以在测其他功能会非常方便。用不了多长时间,即可测试完整个站点下的功能。
我们来看这个方法的优点:1不用去辨别哪个参数是辨别身份的;2不用两个账户同时去创建数据;3不用去查看小号id;4单浏览器即可测试,免去切换浏览器的烦恼。这就是我常用的方法,个人感觉已经很高效了,是不是觉得跟XSS窃取了cookie后劫持浏览器的感觉一样?但是此方法并不是对所有站点都起作用,有时你会发现小号会把大号挤出去进入大号的浏览器或者登陆状态消失,直接退出。具体什么原因造成的,我现在还不太清楚,估计是服务器端有对cookie的判断吧,希望大牛们能给出合理的解释。不过在测试大部分站点时此方法还是很好用的。顺便说一下Fiddler2是一个非常好用的抓包工具,熟练使用这个工具也是测试越权时的必要技能。小白们可以自行百度下其使用方法。
0x03 遵守的白帽子原则
越权的危害说轻则轻,说弱则弱,但是还是要求大家不要恶意破坏厂商数据,遵守白帽子原则。
各种吐槽:
╰╃清風 | 2013/11/04 11:02
抢个沙发慢慢看
xsser | 2013/11/04 12:47
我草 越权领主
big、face | 2013/11/04 14:58
前排
小胖子 | 2013/11/04 15:57
卧槽,我来捧场了!
xsser | 2013/11/04 16:47
刚想到,这种能够自动化发现么
小川 | 2013/11/05 09:26
我也想过写个自动化测试工具,哪怕是个半自动化测试工具,但是我技术不到家,如何像fiddler那样设置代理捕获浏览器请求、如何让工具分析请求(比如删除就必须得现有数据,这数据如何创建、有没有字符限制?这让工具识别,我觉得是不可能)
x1aoh4i | 2013/11/12 19:30
需要登录,然后抓取到带有姓名,手机,身份证,用正则判断,然后对URL进行分析,更换ID,跟之前的页面进行易扣死,行么?
实现难度较大
龙臣 | 2013/11/04 17:38
同问,有什么自动化思路莫
袋鼠妈妈 | 2013/11/04 17:41
排排
insight-labs | 2013/11/04 20:07
不科学啊,你把cookie整个都替换了,就不叫越权了,这和xss到cookie没区别。如果你只替换了cookie里的用户名或者email的部分,不改变其他部分,却可以访问到替换后用户名的数据,这样才叫越权。
很多时候虽然登录信息保存在cookie里,但是以加密的形式保存,这个时候要想越权,要么拿到别人的cookie,要么破解了cookie的加密之后改。
小川 | 2013/11/05 09:09
这里的重点其实和XSS盗cookie没有任何关系。要注意一点,我是直接从小号那复制cookie过来的,不是盗取的。复制小号的cookie主要目的就是为了模拟小号发请求去改大号的数据。复盖大号浏览器中的请求后,就相当于小号发的请求却能改变大号的数据,这不就是越权了吗
wefgod | 2013/11/07 23:46
明白洞主的意思了。不过其实也没那么麻烦,复制cookie有时候好长呢……
病狗 | 2013/11/08 10:36
剪贴板够用了
小胖胖要减肥 | 2013/11/08 21:46
我来解释吧 比如 用户A修改密码,会传很多参数,这个时候正常情况无法修改,因为参数有个加密的参数验证,这个时候用户b去修改密码,替换掉b的cookies为用户a的就能修改掉用户a的密码。如果只是换参数是不行的
你想想看代码是什么地方写的奇叭了 小川应该就是这个意思
墨水心_Len | 2013/11/04 21:03
楼主码字辛苦。不过对文末更换cookie这块的论述表示赞成楼上观点。断然把全部cookie信息替换掉,那就非越权范畴了。望指正
病狗 | 2013/11/08 10:38
那是测试是否存在越权,用小号能否修改大号数据
xsser | 2013/11/04 22:08
楼上两位理解错误啊 它是说用A的COOKIE去操作B的请求啊 如果可以成功为嘛不是越权呢 已指正
xsser | 2013/11/04 22:08
楼上两位理解错误啊 它是说用A的COOKIE去操作B的请求啊 如果可以成功为嘛不是越权呢 已指正
绝情刀 | 2013/11/10 17:56
+1
xsser | 2013/11/04 22:10
擦 特地回复两次
_Evil | 2013/11/05 00:38
回复多几次我也不会在意
xiaoL | 2013/11/05 10:09
本身替换cookie操作就是为了查找区分用户特征的参数...
这样确实比切换浏览器来的便捷...
不过一直觉得越权和逻辑漏洞属于一类
iskit | 2013/11/05 14:56
越权应该算是逻辑漏洞吧
se55i0n | 2013/11/06 14:54
越权帝码字幸苦了
x-star | 2013/11/06 19:10
MARK 不错
好人 | 2013/11/07 21:48
楼主好样
niliu | 2013/11/08 13:30
赞啊~~~
xfkxfk | 2013/11/10 20:36
@小胖胖要减肥 你这里说的是b修改密码时,用的a的cookie,最后修改了a的密码,这不就是a发的修改密码的请求么?这不是越权吧。我觉的应该是最后修改了b的密码。就像@xsser 这里说的是用A的cookie是操作B,成功的话这就是越权。
啊L川 | 2013/11/13 18:46
@小川 张姿势了 by晓川
核攻击 | 2013/11/23 14:55
楼主手机号是故意不打码的么……
mobile: 13161297686
留言评论(旧系统):