我的越权之道

小川 2013-11-04 10:40:00

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/用户名 

WooYun: 搜狐白社会任意用户信息修改漏洞

查询:

select * from tablename where id=12345 

WooYun: Like团用户信息泄露+越权漏洞(可获取大量用户住址联系信息)

本人不做开发,sql语句比较弱,大牛勿喷,此处只是为了说明问题。大家可以看到,以上语句都涉及where,而后面的userid或username即是越权的突破口。在操作数据库时功能请求中往往会带着一些参数来用于辨别信息的唯一值。而这些参数就是我们越权时需要注意的。

在web开发中判断用户身份的字段往往是不会在客户端传递的。用户登录系统后,开发人员一般会创建一个session来保存用户名。当用户在查看、修改个人信息等需要判定用户身份时,就直接从session中获取,而不会在客户端传递,也就避免了篡改。但若出现从客户端传递的话,那么就必须要有一步权限验证的要求了。所以在测试越权时要用抓包工具截获请求,细览下可能存在辨别信息的唯一值,来进行测试。这里要说一点,传输的参数并不一定在请求参数中,也有可能存在链接等位置。如:

WooYun: 虾米网送娃娃漏洞(平行权限漏洞)

有人可能开始抱怨,请求中那么多参数、而且还可能存在一个请求需要多个辨别参数的可能,再加上链接中也有可能,这也太难找了。现提供一个方法可以轻松让你知道哪里存在越权。喜欢玩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:15

抢个沙发慢慢看

X

xsser 2013-11-04 12:47:52

我草 越权领主

B

big、face 2013-11-04 14:58:00

前排

小胖子 2013-11-04 15:57:22

卧槽,我来捧场了!

X

xsser 2013-11-04 16:47:25

刚想到,这种能够自动化发现么

龙臣 2013-11-04 17:38:04

同问,有什么自动化思路莫

袋鼠妈妈 2013-11-04 17:41:59

排排

I

insight-labs 2013-11-04 20:07:15

不科学啊,你把cookie整个都替换了,就不叫越权了,这和xss到cookie没区别。如果你只替换了cookie里的用户名或者email的部分,不改变其他部分,却可以访问到替换后用户名的数据,这样才叫越权。
很多时候虽然登录信息保存在cookie里,但是以加密的形式保存,这个时候要想越权,要么拿到别人的cookie,要么破解了cookie的加密之后改。

墨水心_Len 2013-11-04 21:03:46

楼主码字辛苦。不过对文末更换cookie这块的论述表示赞成楼上观点。断然把全部cookie信息替换掉,那就非越权范畴了。望指正

X

xsser 2013-11-04 22:08:55

楼上两位理解错误啊 它是说用A的COOKIE去操作B的请求啊 如果可以成功为嘛不是越权呢 已指正

X

xsser 2013-11-04 22:08:55

楼上两位理解错误啊 它是说用A的COOKIE去操作B的请求啊 如果可以成功为嘛不是越权呢 已指正

X

xsser 2013-11-04 22:10:21

擦 特地回复两次

_

_Evil 2013-11-05 00:38:03

回复多几次我也不会在意

小川 2013-11-05 09:09:12

这里的重点其实和XSS盗cookie没有任何关系。要注意一点,我是直接从小号那复制cookie过来的,不是盗取的。复制小号的cookie主要目的就是为了模拟小号发请求去改大号的数据。复盖大号浏览器中的请求后,就相当于小号发的请求却能改变大号的数据,这不就是越权了吗

小川 2013-11-05 09:26:26

我也想过写个自动化测试工具,哪怕是个半自动化测试工具,但是我技术不到家,如何像fiddler那样设置代理捕获浏览器请求、如何让工具分析请求(比如删除就必须得现有数据,这数据如何创建、有没有字符限制?这让工具识别,我觉得是不可能)

X

xiaoL 2013-11-05 10:09:15

本身替换cookie操作就是为了查找区分用户特征的参数...
这样确实比切换浏览器来的便捷...
不过一直觉得越权和逻辑漏洞属于一类

I

iskit 2013-11-05 14:56:50

越权应该算是逻辑漏洞吧

S

se55i0n 2013-11-06 14:54:27

越权帝码字幸苦了

X

x-star 2013-11-06 19:10:41

MARK 不错

好人 2013-11-07 21:48:53

楼主好样

W

wefgod 2013-11-07 23:46:49

明白洞主的意思了。不过其实也没那么麻烦,复制cookie有时候好长呢……

病狗 2013-11-08 10:36:45

剪贴板够用了

病狗 2013-11-08 10:38:49

那是测试是否存在越权,用小号能否修改大号数据

N

niliu 2013-11-08 13:30:17

赞啊~~~

小胖胖要减肥 2013-11-08 21:46:32

我来解释吧 比如 用户A修改密码,会传很多参数,这个时候正常情况无法修改,因为参数有个加密的参数验证,这个时候用户b去修改密码,替换掉b的cookies为用户a的就能修改掉用户a的密码。如果只是换参数是不行的
你想想看代码是什么地方写的奇叭了 小川应该就是这个意思

绝情刀 2013-11-10 17:56:49

+1

X

xfkxfk 2013-11-10 20:36:28

@小胖胖要减肥 你这里说的是b修改密码时,用的a的cookie,最后修改了a的密码,这不就是a发的修改密码的请求么?这不是越权吧。我觉的应该是最后修改了b的密码。[email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */ 这里说的是用A的cookie是操作B,成功的话这就是越权。

X

x1aoh4i 2013-11-12 19:30:25

需要登录,然后抓取到带有姓名,手机,身份证,用正则判断,然后对URL进行分析,更换ID,跟之前的页面进行易扣死,行么?
实现难度较大

晓川 2013-11-13 18:46:33

@小川 张姿势了 by晓川

核攻击 2013-11-23 14:55:13

楼主手机号是故意不打码的么……
mobile: 13161297686

I

Ivan 2013-11-23 21:25:28

马克下

P

possible 2013-11-27 10:49:29

如果能弄一个程序:
1.使用账户A登录,抓取所有连接
2.使用账户B登录,抓取所有连接
3.比较两份连接列表,抓出差集,然后更换session或者cookie重新发送请求,确定是否可以正常响应,即是否越权,不知道是否可行,纯属yy

T

tntC4stl3 2013-12-09 12:36:54

+10086 这种说法比较好理解

小土豆 2013-12-11 20:19:25

看了小川的洞。很佩服小川啊。

P

px1624 2013-12-28 12:59:12

写的不错额,我测试越权的方法就是你说的最基础的办法,两个帐号两个浏览器同步进行,难怪你比我搞笑。直接复制cookie这方法是不错啊!哈哈。我觉得一般http的抓包还是charles好用!

麻花藤 2014-01-18 21:35:06

来晚了,这都多少楼了,@小川 我一直是你漫画的忠实粉丝哦

H

Hero 2014-02-01 18:31:56

Ctrl+A & Ctrl+C &Ctrl+V

B

bupter 2014-04-17 11:32:53

抓取所有的包,全局替换一下cookie或者session,在reply一下拿到responce

猫头鹰 2014-04-23 19:51:47

妈蛋,把你洞一个个全看过去了怎么破 --

D

D&G 2014-04-29 10:25:23

受教了。赶紧试试去。换cookie存在一个问题就是,有时候,where的判断条件(用户名字段)是存在cookie中的。如果可以精确的,直接替换认证用户登录状态的相关字段就完美了。

小贱人 2014-06-12 23:52:20

已阅

老和尚 2014-07-16 17:28:00

崇拜中!!!!!!!!!!!!!!

神笔马良 2014-09-13 17:32:09

注册几个账号来试下

T

todaro 2015-01-05 16:10:48

这里的替代饼干,只是为了获取这个人的身份信息,用他的身份来测试是否能修改我本人的信息,因为我本人的信息只有我自己能够修改,并不是任何一个饼干都可以。要是任何一个饼干都可以,就说明这个权限是开放的,并不是针对我自己的。个人理解

U

undefined 2015-03-30 16:32:36

我看小川那点替换的说明时候 确实理解错误了,但是一看下面评论就恍然大悟,
1.A发出请求改密码,比如请求的参数里有A的用户名a
2.把A的Cookies修改为B,这样身份就变成B了,请求就变成,B请求修改A的密码,因为请求的参数没有改变,比如用户名还是a,仅仅是身份变成了B,请求修改的各项参数还都是A的。所以请求就变成,B请求修改A的密码。
3.修改成功,说明越权。
希望后来的人弄明白洞主的意思,这篇文章很不错,我之前完全没接触过越权,看完了感觉很不错!感谢洞主的分享!

S

SeaCream 2015-04-19 17:13:42

感谢分享!

包包 2015-04-20 01:14:32

额,有一点没看懂。。。为什么你最后说把cookie覆盖过去,就可以检查是否有越权了?
那不是cookie欺骗吗。。。?求解答。。

包包 2015-04-20 01:16:36

@undefined 哦哦,之前没看评论,现在懂了。。确实神奇

F

Friday 2015-06-09 13:59:07

刚练习完,感觉小川哥哥说的很有道理啊┑( ̄Д  ̄)┍

枯荣 2015-08-19 17:13:38

学习了 thx 看懂了

小川 2015-09-09 15:57:22

楼下的全没看出来,insert into 是不能跟where的,这个是错误的.......丢人了,但并不是说insert不能越权

情痴 2015-11-25 19:51:29

学习了,谢谢大牛分享

V

vaf 2015-12-03 22:19:32

@小川 还是好文,以前不怎么在意越权的。什么事都只奔着shell。

黑色键盘丶 2016-05-22 06:33:07

学到了

小川

一个致力要将乌云变成搞笑论坛的男人

twitter weibo github wechat

随机分类

网络协议 文章:18 篇
漏洞分析 文章:212 篇
逻辑漏洞 文章:15 篇
MongoDB安全 文章:3 篇
Python安全 文章:13 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录