一、概念:
XSS:跨站脚本攻击(英文全称:Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,比如HTML代码和客户端脚本如Javascript中。从效果和稳定性上可分为:反射型XSS和存储型XSS。反射型XSS一般都需要引诱用户触发事件,比如点击一个按钮;而存储型XSS是将恶意代码存储在服务端,只要用户请求服务端要查看数据就会执行存储的恶意代码,因此具有很强的稳定性。
二、攻击条件:
1、能够向web页面注入恶意代码;
2、这些恶意代码能够被浏览器成功的执行。
三、攻击示例:
1、反射型XSS攻击:
如果需要用户输入name,这个name经过服务端后又会回显给用户,那么如果用户输入name的内容是Javascript中的方法调用,比如:
<script>alert("中毒了")</script>
那么经过服务端后返回这条信息通过HTML展示给用户时,浏览器会认为这是Javascrip代码片断,所以会执行。最终会弹出提示框,而不是显示文本内容。
<?php
$name=$_GET['name'];
echo $name;
?>
2、存储型XSS攻击:
和上例中反射型XSS攻击类似,唯一的区别是用户输入的name存储到了数据库中,当其他人查询这条记录时,浏览器会认为这是Javascrip代码片断,所以会执行。最终会弹出提示框,而不是显示文本内容。
3、DOM型XSS攻击:
实际上也属于反射型XSS攻击,只是这种攻击是通过修改DOM属性(比如增加点击事件)来达到攻击的目的。比如:
<html>
<head>
<title>录入</title>
</head>
<body>
<script>
function submit(){
var str=document.getElementById("text").value;
document.getElementById("div1").innerHTML="<a href='" + str + "'>click</a>";
}
</script>
<div id="div1"></div>
<input type='text' id="text" value="">
<input type="button" id="button" value="提交" onclick="submit()">
</body>
</html>
如果输入的是如下内容,那么用户点击“提交”后,点击生成的“click”链接,同样会执行用户植入的恶意代码。
' onclick=alert("中毒了") '
四、防御措施:
任何漏洞的防御措施都不能保证一定能防御恶意的攻击,即使能那也只是暂时的。但这些防御措施一定能加大这些恶意攻击的成本,或时间,或金钱。如果花了100元用了10天时间研究出一种攻击方式去攻击某网站获利10元钱,那么这个攻击成本太高了,恶意攻击的目的不就是为了获利?如果无利可图,那么恶意攻击就少了,但并不排除一些黑客级玩家炫技的情形。
1、最常见的XSS攻击是为了获取Cookie,因为Cookie中存着用户的身份信息,所以需要在设置Cookie时设置HttpOnly属性;
2、将可能引起XSS攻击的字符清除或转义成没有攻击能力的字符像<等,比如:
1>ASCII中的控制字符,比如:
x00-x1F
2>HTML标签,比如:
<javascript>,<vbscript>,<expression>,<applet>,<meta>,<xml>,<blink>,<link>,<style>,<script>,<embed>,<object>,<iframe>,<frame>,<frameset>,<ilayer>,<layer>,<bgsound>,<title>,<base>,<details>
3>HTML标签中的事件,比如:
onabort,onactivate,onafterprint,onafterupdate,onbeforeactivate,onbeforecopy,onbeforecut,onbeforedeactivate,onbeforeeditfocus,onbeforepaste,onbeforeprint,onbeforeunload,onbeforeupdate,onblur,onbounce,oncellchange,onchange,onclick,oncontextmenu,oncontrolselect,oncopy,oncut,ondataavailable,ondatasetchanged,ondatasetcomplete,ondblclick,ondeactivate,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,onerror,onerrorupdate,onfilterchange,onfinish,onfocus,onfocusin,onfocusout,onhelp,onkeydown,onkeypress,onkeyup,onlayoutcomplete,onload,onlosecapture,onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseout,onmouseover,onmouseup,onmousewheel,onmove,onmoveend,onmovestart,onpaste,onpropertychange,onreadystatechange,onreset,onresize,onresizeend,onresizestart,onrowenter,onrowexit,onrowsdelete,onrowsinserted,onscroll,onselect,onselectionchange,onselectstart,onstart,onstop,onsubmit,onunload,ontoggle,oninput,oncanplay
3、一些恶意代码并不是直接注入到页面的,而是通过类似src属性引入的,所以不容易发现。因此必要的时候需要对src所引用的资源的内容进行检查;
4、有些恶意代码为了对抗防御,会做一些特殊处理,比如:
1>将字母用大小写混拼来对抗防御
<ScRipt>ALeRt("依然中毒了");</sCRipT>
2>对恶意代码做二次包装,过滤只会去掉第一层,去掉第一层后第二层正好可以攻击
<scr<script>ipt>alert("依然中毒了")</scr<script>ipt>