网站攻防之CSRF和XSS跨站脚本攻击
进入正题之前,先扯一番:黑客本义并非某些人以为的利用网络干坏事的人,刚开始或者说现在的很多,黑客是以技术大牛的形式存在的,也就是在网络领域有一门专场的牛人。有些黑客不干坏事而是干好事,比如利用网站的漏洞,去告诉网站开发运营者你的网站有漏洞,要修补啦,他们却并不会利用这漏洞干坏事,而是以发现漏洞追求技术快感为享受。
说是网站攻防演练,但估计这套东西已经很老很少用了,毕竟作为课程实验的实例都是“经典”的。不过里面的攻防思想特别是利用漏洞的思想对于学习是很有用处的。
(下面对于CSRF的解释和区别都是援引自实验PPT非个人原创)
CSRF(Cross-site request forgery跨站请求伪造):CSRF通过伪装来自受信任用户的请求来利用受信任的网站。说白点,就是类似于我们平时遇到的点了病毒链接然后就OO的实例。就是用户在登录某网站的状态下,访问了恶意网站,然后会自动执行一串恶意代码,不知不觉地被攻击者冒充(其实说利用了自己的身份更好)去访问了正常网站A,至于向A发送什么指令,会导致什么结果,那是后话了。示例图:
•XSS是Cross-site是一种由于网站存在漏洞而使攻击者可以在其中插入攻击代码,当其它用户请求包含攻击代码的页面内容时,对用户发起的脚本攻击。•攻击通常是用脚本的形式(javascript etc)。•攻击通常会窃取用户和跨站请求(CSRF)攻击的区别Ⅰ的cookie,冒充用户访问网站,达到窃取用户信息、修改用户资料等目的。和跨站请求(CSRF)攻击的区别:CSRF攻击通常是通过一些引诱手段把用户导向到恶意网站。假定用户网站为SiteV,恶意网站为SiteA。如果用户先前在浏览器浏览过SiteV ,那对应SiteV的cookie就会被记录下来,当用户浏览SiteA的时候,用户会加载攻击者预先编写好的恶意脚本,脚本会冒充用户发送一个正常请求给SiteV,请求会把用户浏览过网站SiteV的cookie也一起发送。这时SiteV无法识别这个请求是从SiteV还是从SiteA发起的,从而 SiteV也接受并处理了这个请求,进而达到跨站攻击的目的。•XSS通常无需通过引诱手段把用户导向恶意网站,而是利用用户网站的漏洞(因网站没有过滤恶意代码的功能)在网站植入一段恶意代码(攻击者在用户网站注册一个账号,然后在自己的用户信息编辑里写入一段恶意代码),当用户浏览到攻击者的信息(用户简介profile),攻击者会窃取到用户的cookie。下次攻击者利用用户的cookie就可以冒充用户访问网站。为什么拿到Cookie可以冒充用户:Cookie可以理解为用户浏览某个网站后生成的一个对应的认证凭据,Cookie保存在本地当前浏览器。Cookie会随用户向网站发起请求的时候一起发送。
当用户登陆某些网站,一些网站后台代码会把用户登陆的信息(账号、密码 etc)写到本地的Cookie,如果用户登陆网站退出后没有注销,那cookie会一直记录用户信息,下次用户重新打开浏览器再访问网站的时候网站后台会提取cookie的信息,再次验证到用户的登陆信息并把用户置为登陆状态。
如果用户在登陆状态同时又浏览了攻击者信息,便会自动执行了攻击脚本,从而cookie被攻击者窃取到。当然如果用户退出时注销那cookie就不会保存用户信息,因为这时候系统会在后台程序设置cookie相关的用户信息记录字段为空。
所以当一个用户在登陆一个有跨站漏洞网站同时又访问该站其它用户的信息或又访问恶意网站,那是很危险的! 实验环境和工具:两台SEEDUbuntu虚拟机(专门用来做实验的SEED Project Ubuntu系列,已为我们配置好了本地web server和java环境等等),NAT网络连接。网站链接:http://http://www.zjjv.com//。其他工具:Live HTTP Header(专门用来抓HTTP包的)、FireBug(网页调试如JavaScript调试工具)、TCP server小程序,等等。预备知识:HTML、javascript、PHP、Java、C、Linux。CSRF任务:
任务1:假设你是Boby,你想在elgg上添加Alice为好友,然而Alice不愿意加你为好友,于是你打算利用CSRF攻击来使得Alice自动添加你为好友。这个任务需要你通过get请求完成这次CSRF攻击。
任务2:这次轮到Alice黑化。Alice希望Boby在自己的elgg个性签名上写“我支持SEED计划”,但是Boby不喜欢做实验,于是不想写这个个性签名。于是Alice利用POST请求完成了这次CSRF攻击。
任务3:其实呢,Elgg是有提供CSRF防御机制的,只是在实验中被暂时隐藏了而已。(要不然你以为这么容易可以攻击到咯)因此任务3要求大家开启CSRF防御,并观察实验现象。
XSS任务:
任务1:写一个简单的显示消息的javascript脚本并植入你的简介,当用户浏览你的简介的时候执行这个脚本显示消息。
任务2:写一个盗取当前用户cookie的脚本的javascript脚本并植入你的简介(profile),当用户浏览你的简介的时候执行这个脚本并显示用户的cookie。
任务3:写一个javascript脚本并植入攻击者的简介(profile),该脚本盗取当前用户cookie并把cookie发送给攻击者(在另外一台虚拟机)的TCP Server 。当用户浏览攻击者的简介的时候执行这个脚本。
任务4:用Java编写一个用窃取到的用户cookie,冒充用户把samy添加为自己的朋友的攻击程序。
任务5:用编写一个Javascript攻击脚本写,当用户访问攻击者的简介的时候,可以自动盗取用户的cookie并冒充用户修改信息并添加samy为自己的好友。
任务6(选做):编写一个Javascript攻击脚本,当用户访问攻击者的简介的时候,可以自动盗取用户的cookie并冒充用户修改信息并添加samy为自己的好友。并要求攻击代码能自身复制(类似蠕虫病毒Worm)。
各任务分析:
CSRF:
任务1:其实就是当用户A访问恶意网站时自动利用用户A的身份向服务器发送相应的指令,也就是说后台自动“帮”用户A给服务器发命令。
任务2:同样是当用户A访问恶意网站时自动利用用户A的身份向服务器发送相应的指令,只不过上面发送的是添加好友的指令(GET),这次则发送的是修改签名的指令(POST)。
任务3:CSRF攻击防范机制Secret-token方法是利用时间戳及用户ID哈希出一个不断变化的值,而已网站植入的代码并不能知道或伪造这个值,所以便无法完成上面的两个任务了。
XSS:
任务1:这个简单,就是在恶意用户的profile里面插入一段javacript脚本,所有人(包括恶意用户自己)浏览恶意用户的profile时,都会看到这个脚本产生的一个alert弹窗。
任务2:跟任务1差不多,只不过这里弹窗输入的是用户的cookie信息(用document.cookie获取)。
任务3:这次植入的不是简单的一句javascript脚本了,而是一个可以获取用户cookie并且将它发送到指定位置(攻击者的TCP server)。然后攻击者那边可以利用实现打开了的TCP server接收到这个cookie包。
任务4:利用上面任务3获取到的用户的cookie,攻击者在自己的机器里用java程序冒充用户给web服务器发送篡改命令。
任务5:利用Ajax技术写一个JavaScript脚本嵌入攻击者自身的Profile当中的,当其他人查看攻击者的Profile时会自动执行这个脚本,从而盗取用户的cookie并冒充用户给服务器发送修改信息和添加好友指令。
任务6:跟任务5差不多,不过多了一步就是将受害者的个人简介替换成之前那段恶意脚本(利用document.getElementById函数)。
实验结果:
(1)CSRF:
任务1:首先登录Alice账号并手动添加Boby为好友,然后用Live HTTP Header工具观察HTTP包头:
就是一个GET命令,附带信息有friend的id号(friend=40),后面elgg这东西是个时间戳,防伪冒用的。
然后修改攻击者网页的内容,添加一个
标签,但是src使用添加好友的url链接,也就是当用户访问了这个恶意网页之后,因为会自动GET
标签的内容,所以url自动就发出去了,浏览器根据url发送给服务器添加好友的命令。
网页源代码如下:
然后Alice在登录状态下访问这个网址的index.html:
用Live工具可以看到后台自动发送了一个GET命令:
刷新一下Alice的好友圈,发现Boby被自动添加为Alice自己的好友:
任务2:
先手动测试下,Alice手动修改自己的Profile里面的签名并保存,这之后记得要删除签名:
观察Live工具里面的内容:
是个POST命令,后面跟的是要修改后的Profile里面的一些变量值。
然后攻击者(Alice)网页index.html文件修改成如下:
This page forges an HTTP POST request.h1>
要一一对应包头里面的每个键值对,如cookie等,这里因为需要修改用户profile的同时还要添加samy为好友,所以我这里开了两个ajax的XMLHttpRequest,一个用户修改用户profile,一个用户添加samy为好友。
然后在攻击者的About me栏插入这个脚本(brief description无法插入这么长的内容):
保存,可以发现并不会直接显示出来,只能用firebug工具发现植入的JavaScript脚本:
然后受害者Alice去搜索查看下Boby的Profile页面:
点击进入发现Live工具包头可以看到发送了GET和POST指令,分别就是上面说的一个是POST修改用户信息,GET添加Samy为好友:
查看Alice自己的Profile页面,发现签名被篡改:
查看好友圈发现被自动添加了Samy为自己的好友:
于是,任务5也完成了。
任务6:
结果未实现,但是我知道了大体思路,能够伪造修改Profile的包头,但是却无法真正实现在受害者介绍栏中插入整一个脚本。所以这里我只能演示一下不插入整个脚本文件所有内容,而是只插入一句Hello world,然后篡改受害者昵称和添加Samy为还有都没问题,脚本如下:
p>