2012年(272)
分类: 网络与安全
2012-06-25 14:19:09
今天晚些时候看到木瓜在blog中指出我前篇文章里提到的局限性不存在的问题,我又重新做了几次测试,发现确实是这么回事,但是这里还有些细微的地方需要明晰一下。
首先,因为cookie是只针对域的,和是否是http还是https无关(除了cookie标记为 secure flag),所以即便是目标网站全站都使用了https,我们也可以通过伪造http请求来欺骗浏览器,让浏览器发送cookie。
先勾上gmail里只允许https访问的选项:
如下:
正常的surf jacking:
GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Paros/3.2.13
Host:
Proxy-Connection: Keep-Alive
Cookie: BAIDUID=664BDBF912A0BD8529B578F1D2D89628:FG=1; BDSTAT=d7b696a29856a99b8018cd481c49ff83b059362bca5c10384743fbf2b0117772; BD_UTK_DVT=1; BDTIP=1215783899; BDUSS=ZtcjdSeWNKQn5xNGpz......
HTTP/1.1 301 Moved Permanently
Location:
Cache-Control: private
Content-Length: 0
GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Paros/3.2.13
Cookie: GXSP=S; S=gmail=RDS-f2sELkDIQBXTwhRP8g:gmail_yj=Qq5TkzIBOhEO4zmXoyhx1A:gmproxy=UW9D_swGb_s:gmproxy_yj=f8GBnMVjCTM:gmproxy_yj_sub=y45fb75LRSw; TZ=-480; SID=DQAAAHoAAADkfcVmPLBi6tXXC0LiAR2M3Js6NAxIB3dc1fHXTYzibMTdCGPevS3YCX24mVl03pf_mnBLcoKYG9yNuizcwgDAE4Xl7qGzk8MH5CUHhzdnvarGZtzXTAn_cHbzzPI2jyCVhReiuYyfgiQCa2g3kAoyXboO9_9QdxRsL3ymexB7uA; GMAIL_HELP=hosted:0
Proxy-Connection: Keep-Alive
Host: mail.google.com
这个时候cookie是发送出来的
而若访问某个不存在的页面
GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Paros/3.2.13
Host:
Proxy-Connection: Keep-Alive
Cookie: BAIDUID=664BDBF912A0BD8529B578F1D2D89628:FG=1; BDSTAT=d7b696a29856a99b8018cd481c49ff83b059362bca5c10384743fbf2b0117772; BD_UTK_DVT=1; BDTIP=1215783899; BDUSS=ZtcjdSeWNKQn5xNGpzNGNhYVJ5WUtlOXRoS2JINVN2d......
HTTP/1.1 301 Moved Permanently
Location:
Cache-Control: private
Content-Length: 0
GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Paros/3.2.13
Cookie: TZ=-480; SID=DQAAAHoAAADkfcVmPLBi6tXXC0LiAR2M3Js6NAxIB3dc1fHXTYzibMTdCGPevS3YCX24mVl03pf_mnBLcoKYG9yNuizcwgDAE4Xl7qGzk8MH5CUHhzdnvarGZtzXTAn_cHbzzPI2jyCVhReiuYyfgiQCa2g3kAoyXboO9_9QdxRsL3ymexB7uA; PREF=ID=d73fbea1cce4392a:NW=1:TM=1218557317:LM=1218557317:GM=1:S=UoyYLQEOE9o_Juix; GMAIL_HELP=hosted:0
Proxy-Connection: Keep-Alive
Host: mail.google.com
HTTP/1.1 404 Not Found
Date: Tue, 12 Aug 2008 16:12:51 GMT
Content-Type: text/html; charset=UTF-8
Server: gws
Content-Length: 1352
可以看到cookie也发送出来了。
所以我前文提到的局限性中的"需要目标网站里存在一个非HTTP页面"的条件是不存在的。
实际上这里不是我今天要讲的重点,重点是关于session cookie和persistent cookie的问题
如果在登录GMAIL的时候选择“在本计算机上保存帐户”
则会选择使用本地存储cookie(stored cookie 或叫做 persistent cookie)。
如果不选择,则使用的是session cookie,里面包含了session id. 如果浏览器进程结束了,那么session cookie就销毁了。
在我的IE 6中测试,如果使用本地存储cookie,那么在使用surf jacking技术时,新开浏览器窗口的后是能捕获到cookie的。如我上篇文章里的例子。
但是如果是使用的session cookie,则在新开IE6浏览器窗口里是抓不到cookie的,因为IE6新开窗口是启动了一个新的IE进程,而这个新的IE进程是无法获取之前IE进程里的http session的。
如下:
GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Paros/3.2.13
Host:
Proxy-Connection: Keep-Alive
Cookie: SOHUHOMETAB=visit:3; TurnAD9=visit:2; TurnAD351=visit:1; TurnAD119=visit:2; TurnAD118=visit:2; TurnAD10=visit:1; TurnAD120=visit:1; TurnAD11=visit:1; TurnAD349=visit:2; TurnAD350=visit:2; TurnAD352=visit:1; FULL=w:1; LIUMEITI101=w:1; LIUMEITI102=w:1; BOOKTURN=w:1; _BOO......
HTTP/1.1 301 Moved Permanently
Location:
Cache-Control: private
Content-Length: 0
GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Paros/3.2.13
Host: mail.google.com
Proxy-Connection: Keep-Alive
没有cookie发送出去。
然后会跳到google登录页面
可见在IE6环境下,如果target使用的是session cookie,那么要攻击成功,就需要被攻击者使用同一个IE进程去访问新的网站。
比如用户先登录了GMAIL,然后在这个窗口里去访问,结果response页面被surf jacking。 这个时候由于该浏览器进程里的session cookie还没有销毁,所以可以重新获取到,而发送新的request到gmail的时候,就会带上这个session cookie了(该过程已验证)。
对于IE7 的环境,如果我没有记错的话,整个IE7只有一个浏览器进程,新开tab页还是属于这个进程的,所以从enablesecurity的视频演示来看,应该是能获取到前一个tab页的这个session cookie的。不过我没有安装IE7,所以没有进一步验证了。
对于IE8 ,及其beta2,好像对tab这部分有些改动,比如增加了tab process,有了virtual tab的机制,具体影响如何还要等正式出来以后再测试测试。
Surf Jacking的意义在于可以突破https,获取https里保护的一些敏感数据。
而对抗方法最有意义的应该是在http包中只发送部分cookie,而关键cookie则只能在https包里出现。gmail正是这样做的。