BearRui(AK-47)
花开有时,错过了一日便错过了一季,就象人生错过了相遇,就不再找寻到美丽的相聚
随笔- 39  文章- 2  评论- 1288 
博客园  首页  新随笔  联系  管理  订阅 订阅
URL中允许携带sessionid带来的安全隐患。

  很多WEB开发语言为了防止浏览器禁止了cookie而无法识别用户,允许在URL中携带sessionid,这样虽然方便,但却有可能引起钓鱼的安全漏洞。

 

图示:

   下图是从测试组发来的安全报告中剪出来的,图有些小问题,本来想重画1个,在visio中没找到合适的图。所以只能用别人的图了。

       

 

说明:   

  让我们对上图的步骤进行详细说明:   

  1. 黑客用自己的帐号登录,假设登录页面是:http://www.abc.com/login.jsp   

  2. 服务器返回登录成功。   

  3. 黑客从cookie中查看自己的sessionid,比如是1234   

  4. 黑客把带自己sessionid的地址发送给一般用户。http://www.abc.com/login.jsp;jsessionid=1234(不同的语言带sessionid的方式不一样,着是jsp的方式)   

  5. 用户在黑客给的地址中用自己的帐号进行登录,登录成功。(这个时候用户登录的信息就会覆盖黑客之前的登录信息,而且2个人用的是同1个sessionid)   6. 黑客刷新页面,看到的账户信息就是用户的信息了,而不是之前黑客自己帐号的信息。

 

防治:  

  要防止这种问题,其实也很简单,只要在用户登录时重置session(session.invalidate()方法),然后把登录信息保存到新的session中。

 

后语:  

  可能你跟我一样,刚开始看到这个时候,就自己去测试到底能不能钓鱼成功,经过我的测试是可以成功的,但测试过程中需要注意下面几个问题:  

  1. 要注意你使用的语言是如何在URL中带sessionid。(我测试的时候开始在URL中使用大写的jsessionid,导致一直不起效)    

  2. 要http://www.abc.com/login.jsp;jsessionid=1234页面登录表单的action也带上了jsessionid,不然也没用。对于这个问题你可能觉得如果login.jsp表单的action是写死,而不是读取当前URL的,     可能就不会出现这个钓鱼问题。这只能防住1个方向。黑客可以做1个和login.jsp一模一样的页面(比如http://www.abc1.com/login.jsp),然后把这个地址发个客户,而这个地址中的表单这样写就可以:   <form action="http://www.abc.com/login.jsp;jsessionid=1234" ....

[作者]:BearRui(AK-47)
[博客]: http://www.cnblogs.com/BearsTaR/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2010-08-24 08:44 BearRui(AK-47) 阅读(4246) 评论(60) 编辑 收藏
发表评论
1911179
 回复 引用 查看   
#1楼[楼主] 2010-08-24 08:53 | BearRui(AK-47)      
@Artech
HTTPS也是一样的啊,照样能传递sessionid,黑客并不是为了得到你的用户名和密码,所以用不用https对他没什么影响。

 回复 引用 查看   
#2楼 2010-08-24 08:53 | szyicol      
我觉得,这个问题并不是URL的问题,即使用cookies,也一样存在这个情况!

这个我有深深体会,前段时间,为了刷新TX的一个页面,就用httpwebrequest登陆了一次,取得cookie之后,保存到本地文件,然后拿这个文件,在公司也可以用,在家里也可以用,寒!!!后来,TX更改了规则,强制一个cookie只能保持14个小时,并且,根据异常情况,强制删除连接。。

 回复 引用 查看   
#3楼[楼主] 2010-08-24 08:56 | BearRui(AK-47)      
@szyicol
cookie当然可以实现,但用cookie欺骗比较麻烦,比如你说的情况,你怎么让你做好的cookie发给用户,让用户去用你的cookie了?使用URL钓鱼就比较简单能实现了。只是发个URL地址。

 回复 引用 查看   
#4楼 2010-08-24 09:06 | zhangle      
其实,有一个笨一点的办法,sessionid加密,重新写获取和设置sessionid的方法
 回复 引用 查看   
#5楼[楼主] 2010-08-24 09:07 | BearRui(AK-47)      
@zhangle
这个一样,黑客仍然只要获取到加密的sessionid,然后发给用户,你服务器最终解密的结果还是同1个sessionid

 回复 引用 查看   
#6楼 2010-08-24 09:10 | 普若伽门      
这个问题自WEB有cookies就有了,其实也没什么大不了的问题,得要用户客户端安全保障才行,用户丢了cookies你怎么弄都不解用。
 回复 引用 查看   
#7楼[楼主] 2010-08-24 09:12 | BearRui(AK-47)      
引用普若伽门:这个问题自WEB有cookies就有了,其实也没什么大不了的问题,得要用户客户端安全保障才行,用户丢了cookies你怎么弄都不解用。


非也,跟我前面说的一样,cookie欺骗难度大,实现困难,可能非一般的黑客能实现的,而URL带sessionid的欺骗,就连我这样的一般WEB技术人员都能做到。

 回复 引用 查看   
#8楼 2010-08-24 09:27 | quange      
在session中加入一个密钥,KEY=MD5(用户名+IP+登录时间+“345SDFGDFGsdfqweqweZSX”);服务端每次效验session的密钥,搞定................
 回复 引用 查看   
#9楼 2010-08-24 09:30 | jan4984      
我想上面同学说的加密还是可以的,只要在加密后的session ID 里面嵌入一个有效防止欺骗的签名。比如登陆时间、IP 地址或者浏览器类型。
 回复 引用 查看   
#10楼 2010-08-24 09:30 | jan4984      
@quange
汗... 3min时间差...

 回复 引用 查看   
#11楼[楼主] 2010-08-24 09:31 | BearRui(AK-47)      
@jan4984
@quange

这个倒是可以,不过每次请求都解密,不知道会不会比较影响性能。

 回复 引用 查看   
#12楼[楼主] 2010-08-24 09:34 | BearRui(AK-47)      
引用jan4984:
@quange
汗... 3min时间差...

哈哈,抓的很是时候。我还以为你说的就是他了

 回复 引用 查看   
#13楼 2010-08-24 09:35 | Gray Zhang      
要解决这个问题,最好就是别用Session做登陆
 回复 引用 查看   
#14楼 2010-08-24 09:39 | 梦幻天涯      
@BearRui(AK-47)
安全和性能本来就是一对矛盾体, 设计就是要在他们之间做权衡, 在线银行这种业务,我想安全比性能更重要。

 回复 引用 查看   
#15楼[楼主] 2010-08-24 09:41 | BearRui(AK-47)      
@Gray Zhang
哪登录信息总是需要保存到1个地方吧,而且还只能通过类似于sessionid的方式与浏览器之间保持状态啊。我文章中提供的办法解决URL中的sessionid问题还是可以的。

 回复 引用 查看   
#16楼[楼主] 2010-08-24 09:41 | BearRui(AK-47)      
引用梦幻天涯:
@BearRui(AK-47)
安全和性能本来就是一对矛盾体, 设计就是要在他们之间做权衡, 在线银行这种业务,我想安全比性能更重要。


这个说的是。

 回复 引用 查看   
#17楼 2010-08-24 09:44 | 裸牛      
能不能判断URL参数中是否有sessionid,如果有就进行相应的处理,而不是直接登陆。
 回复 引用 查看   
#18楼[楼主] 2010-08-24 09:47 | BearRui(AK-47)      
@裸牛
这也是可以的,但你要怎么取到sessionid,因为sessionid在URL中不是直接通过参数的方式传递,而是一种特殊的方式,比如jsp:login.jsp;jsessionid,ASP.NET好像是:/S(1234)/login.aspx。不知道这种方式是否能直接取到值。

 回复 引用 查看   
#19楼 2010-08-24 09:52 | 裸牛      
引用BearRui(AK-47):
@裸牛
这也是可以的,但你要怎么取到sessionid,因为sessionid在URL中不是直接通过参数的方式传递,而是一种特殊的方式,比如jsp:login.jsp;jsessionid,ASP.NET好像是:/S(1234)/login.aspx。不知道这种方式是否能直接取到值。

如果是像你说的这样,那在服务器端肯定是可以处理的,固定的URL处理固定的参数么

 回复 引用 查看   
#20楼[楼主] 2010-08-24 09:58 | BearRui(AK-47)      
@裸牛
我还是觉得直接重新产生新的session比较简单。

 回复 引用 查看   
#21楼 2010-08-24 10:03 | 裸牛      
刚查了下资料,在.net2.0下面,只有SessionStateSection.Cookieless设置为true时才会出现URL中传递sessionid的情况,否则是不会出现这种情况的。

资料如下:http://msdn.microsoft.com/zh-cn/library/system.web.configuration.sessionstatesection.cookieless.aspx

 回复 引用 查看   
#22楼[楼主] 2010-08-24 10:06 | BearRui(AK-47)      
@裸牛
哦,原来NET是这样的啊,跟JAVA的不一样,ASP.NET这样做就是有服务器端来决定是否启用URL sessionid了,而不是根据客户端是否启用了cookie来决定,这样也挺好。

 回复 引用 查看   
#23楼 2010-08-24 10:12 | 裸牛      
@BearRui(AK-47)
准确来说,在.net2.0里面,cookieless改为了四个枚举值
AutoDetect,UseCookies,UseDeviceProfile,UseUri
默认是第三个
详见:http://www.cnblogs.com/hjf1223/archive/2006/10/14/529227.html

 回复 引用 查看   
#24楼[楼主] 2010-08-24 10:21 | BearRui(AK-47)      
@裸牛
NET还是比较智能啊,我对ASP.NET不是很熟,~_~

 回复 引用 查看   
#25楼 2010-08-24 10:24 | 裸牛      
@BearRui(AK-47)
呵。。。准确来说,比较傻瓜吧

 回复 引用 查看   
#26楼[楼主] 2010-08-24 10:27 | BearRui(AK-47)      
@裸牛
哈哈,傻瓜相机就是智能相机啊

 回复 引用 查看   
#27楼 2010-08-24 11:19 | 亚历山大同志      
能用这个方法窃取你的帐号的话,说明你的机器已经被攻占了
 回复 引用 查看   
#28楼[楼主] 2010-08-24 11:26 | BearRui(AK-47)      
@亚历山大同志
非也,同学可能没看清楚,不需要攻占,只需要发送1个地址给用户,用户点击了这个URL就行了,这是钓鱼行为。

 回复 引用 查看   
#29楼 2010-08-24 11:28 | 梦幻天涯      
@亚历山大同志

一般都是中了木马的招了

 回复 引用 查看   
#30楼[楼主] 2010-08-24 11:31 | BearRui(AK-47)      
@梦幻天涯
不一定,有很多用户对电脑,web不是很了解,看见别人发的URL就随便点。

 回复 引用 查看   
#31楼 2010-08-24 11:37 | Aicken(李鸣)      
6. 黑客刷新页面,看到的账户信息就是用户的信息了,而不是之前黑客自己帐号的信息。
-----------------------这一步相当于黑客又重复了一遍步骤5,服务器端刷新sessionid下关联的数据信息,并将信息返回给对应请求端。而此时的数据信息,是用黑客账号获得的服务器数据,服务器并不会直接返回某一sid下的数据,换言之这一步是用黑客信息又覆盖了用户信息。
除非黑客与用户的请求此时、同时在服务器的等待列表中,这样才会达到信息混淆的效果。

 回复 引用 查看   
#32楼 2010-08-24 11:48 | Artech      
引用BearRui(AK-47):
@Artech
HTTPS也是一样的啊,照样能传递sessionid,黑客并不是为了得到你的用户名和密码,所以用不用https对他没什么影响。

哦,是的,误解了,呵呵!

 回复 引用 查看   
#33楼 2010-08-24 12:06 | Allen Zhang      
楼主给广大小黑客上了一堂如何做钓鱼网站,说不好,过几天一批新钓鱼网站因此而产生了。
 回复 引用 查看   
#34楼[楼主] 2010-08-24 12:21 | BearRui(AK-47)      
引用Aicken(李鸣):
6. 黑客刷新页面,看到的账户信息就是用户的信息了,而不是之前黑客自己帐号的信息。
-----------------------这一步相当于黑客又重复了一遍步骤5,服务器端刷新sessionid下关联的数据信息,并将信息返回给对应请求端。而此时的数据信息,是用黑客账号获得的服务器数据,服务器并不会直接返回某一sid下的数据,换言之这一步是用黑客信息又覆盖了用户信息。
除非黑客与用户的请求此时、同时在服务器的等待列表中,这样才会达到信息混淆的效果。


不是,我说的刷新页面,并不是重复提交登录页面。因为用户已经用黑客的sessionid登录了(登录后一般会把user对象保存到session中),服务器会用用户的user对象覆盖黑客之前的user对象。这时黑客刷新页面,取到的就是用户的user数据了。

 回复 引用 查看   
#35楼[楼主] 2010-08-24 12:22 | BearRui(AK-47)      
引用Allen Zhang:楼主给广大小黑客上了一堂如何做钓鱼网站,说不好,过几天一批新钓鱼网站因此而产生了。


呵呵,这到不至于。

 回复 引用 查看   
#36楼 2010-08-24 12:43 | Assion Yang      
还真有人用Url方式保存SessionID?我还真没见过生产上这么做的。

<sessionState cookieless="UseCookies"></sessionState> 禁用UrlSessionID不就得了~

 回复 引用 查看   
#37楼[楼主] 2010-08-24 12:48 | BearRui(AK-47)      
@Assion Yang
很多WEB语言默认都是支持并启用该功能的,比如JSP。

 回复 引用 查看   
#38楼 2010-08-24 14:07 | msnweb      
用户在黑客给的地址中用自己的帐号进行登录,登录成功。(这个时候用户登录的信息就会覆盖黑客之前的登录信息,而且2个人用的是同1个 sessionid)

这个问题 更多的 是因为程序设计的问题。

服务器拿到 用户信息的时候,应该首先看有无session 已有session

应该作废前一个session.

 回复 引用 查看   
#39楼 2010-08-24 15:40 | Sylvester      
如果能发给用户自己写的页面的话,直接收取帐号密码不是更方便。
 回复 引用 查看   
#40楼 2010-08-24 16:53 | solo1991      
。。唉。。。
谁会只用sessionsid来判断?
都至少判断了IP地址等其他数据的。

 回复 引用 查看   
#41楼 2010-08-24 17:25 | Ivony...      
引用solo1991:
。。唉。。。
谁会只用sessionsid来判断?
都至少判断了IP地址等其他数据的。



你服务器前面有CDN每次来的IP都不一样怎么用IP判断?网吧多IP出口每次出口IP都不一样怎么用IP判断?浏览器不发User-Agent你怎么办?

发现很多人都喜欢想当然而不去尊重HTTP的游戏规则。好像服务器和客户端就是自家电脑一样。

 回复 引用 查看   
#42楼 2010-08-24 17:29 | solo1991      
@Ivony...
博客园还有邮件提醒功能啊。
确实,我没考虑到CDN。但我的意思不是说靠IP就行,"都至少判断了IP地址等其他数据的"。

 回复 引用 查看   
#43楼 2010-08-24 17:35 | Ivony...      
引用solo1991:
@Ivony...
博客园还有邮件提醒功能啊。
确实,我没考虑到CDN。但我的意思不是说靠IP就行,"都至少判断了IP地址等其他数据的"。



SessionID足以辨识客户端的身份,伪造是另一个问题。而不是说SessionID就不足以辨识了。

稀奇古怪的验证越多,在特定的HTTP场景中就会出现越多的稀奇古怪的问题。所以最好的办法是保持无知,只遵循最确定最小的游戏规则办事。

LZ的问题,其实我觉得重置SessionID都不是最好的解决方案,最好的解决方案是身份验证不依赖于Session,在URL多一个identityToken的话,就什么问题都没了。

 回复 引用 查看   
#44楼[楼主] 2010-08-24 17:56 | BearRui(AK-47)      
@msnweb
这个就是我说的清除session。

 回复 引用 查看   
#45楼[楼主] 2010-08-24 17:57 | BearRui(AK-47)      
引用Sylvester:如果能发给用户自己写的页面的话,直接收取帐号密码不是更方便。


也是,哈哈。

 回复 引用 查看   
#46楼[楼主] 2010-08-24 17:57 | BearRui(AK-47)      
引用solo1991:
。。唉。。。
谁会只用sessionsid来判断?
都至少判断了IP地址等其他数据的。


你的网站都判断了IP吗?

 回复 引用 查看   
#47楼 2010-08-24 18:31 | Alex He      
首先啊,难看的要死啊

 回复 引用 查看   
#48楼 2010-08-24 18:31 | Alex He      
引用BearRui(AK-47):
引用solo1991:
。。唉。。。
谁会只用sessionsid来判断?
都至少判断了IP地址等其他数据的。


你的网站都判断了IP吗?

判断IP这不扯蛋吗

 回复 引用 查看   
#49楼 2010-08-24 19:02 | IT鸟      
关键是蜘蛛不晓得session,但是他能从用户安装的ie工具条记录url,导致的后果不堪设想
 回复 引用 查看   
#50楼 2010-08-24 19:07 | wisenwu      
@Assion Yang
搞.net的人是不是搞的都成井底之蛙了。url带上sessionid这个方法不知道多少成功的j2ee项目是这么做的,请问你们有谁能盗网易的邮箱,哥哥们

 回复 引用 查看   
#51楼 2010-08-24 19:15 | wisenwu      
你们都只是看到了这个sessionid却没有看到这个sessionid背后的东西!
 回复 引用 查看   
#52楼[楼主] 2010-08-24 19:57 | BearRui(AK-47)      
我发现争论的越来越远了,~_~
 回复 引用 查看   
#53楼 2010-08-24 22:35 | mikelij      
楼主你说的防治办法不全面。防不住跨框架脚本。
 回复 引用 查看   
#54楼[楼主] 2010-08-24 22:50 | BearRui(AK-47)      
@mikelij
我这里说的不是脚本的问题,主要是说URL中sessionid的问题。

 回复 引用 查看   
#55楼 2010-08-25 09:42 | Assion Yang      
@wisenwu
好我是蛙,SessionId后面的东西还请说出来,我倒要看看是什么东西。

 回复 引用 查看   
#56楼 2010-08-25 11:16 | wisenwu      
@Assion Yang
Ivony的方案就是我目前的做法,这个token包含的东西可以很多(至于包含什么就可以结合你的数据库自由发挥了),甚至你可以做到结合这个token实现你的系统的诸多登录控制方案。

 回复 引用 查看   
#57楼 2010-08-25 11:35 | Assion Yang      
@wisenwu
之前做单点登录时考虑过URLSessionId的方式,后来还是打消了这个念头。指定SessionId的Cooikes为父域解决了问题。

 回复 引用 查看   
#58楼[楼主] 2010-08-25 12:22 | BearRui(AK-47)      
引用Assion Yang:
@wisenwu
之前做单点登录时考虑过URLSessionId的方式,后来还是打消了这个念头。指定SessionId的Cooikes为父域解决了问题。


采用sessionid、cookie的方式做单点登录不太好。首先不是特别安全,不支持其他域名的单点接入,还要保证IDP,SP之间能互相访问。

 回复 引用 查看   
#59楼 2010-08-25 12:55 | Assion Yang      
@BearRui(AK-47)
因为是子域间的SessionID互通,也不能算真正的单点登录吧。

 回复 引用 查看   
#60楼 2010-09-08 09:23 | wade black      
以前用过
刷新评论列表  刷新页面  返回页首
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

验证码: 验证码 看不清,换一个

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1806664 9BiZ859LMfE=
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 苹果第三名创始人:当年离开苹果因前景不明
· 报告称Android广告印象份额同比增长504%
· 百度高管称正调研东南亚市场 未来或建分公司
· 东芝索尼获得日本国有银行逾十亿美元贷款
· Getjar发布Android虚拟支付系统
» 更多新闻...
最新知识库文章:
· 编程的艺术:漂亮的代码和漂亮的软件
· GIT分支管理是一门艺术
· 编程:是一门艺术
· 编程是一门艺术吗?
· 对Java初学者的忠告
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务

抓虾
google reader
鲜果
哪吒
QQ邮箱
http://wap.feedsky.com/BearRui
昵称:BearRui(AK-47)
园龄:5年10个月
荣誉:推荐博客
粉丝:127
关注:3

搜索

 

最新随笔

  • 1. 产生唯一随机码的方法分析。
  • 2. URL中允许携带sessionid带来的安全隐患。
  • 3. JS 实现完美include
  • 4. 基于模板的excel导出
  • 5. 实现if elseif else的jsp标签。
  • 6. 记一复杂页面的前端优化(2) - 其他优化
  • 7. 记一复杂页面的前端优化(1) - 不一样的延迟加载
  • 8. 名站技术分析 — tudou网首页下列菜单的弹出效果
  • 9. LESS 让css也支持变量,运算符,include,嵌套规则等等
  • 10. CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能

随笔分类(38)

  • .NET(11)
  • CSS(3)
  • JAVA(2)
  • javascript(4)
  • Life(5)
  • WEB(4)
  • 高性能WEB开发(5)
  • 浏览器(1)
  • 名站技术分析(3)

随笔档案(39)

  • 2010年10月 (1)
  • 2010年8月 (3)
  • 2010年7月 (5)
  • 2010年6月 (4)
  • 2010年5月 (6)
  • 2006年6月 (4)
  • 2006年5月 (7)
  • 2006年4月 (9)

积分与排名

  • 积分 - 178246
  • 排名 - 484

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Copyright ©2012 BearRui(AK-47)