英文全称(Cross Site Script),简称“XSS”。
XSS攻击,通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
XSS根据效果不同分为:
1.反射型XSS
例如:
<div>${input}</div>
正常URL请求假设是这样:
http://www.a.com/test.htm?param=这是一个测试!
传递给变量input的值是“这是一个测试!”。然而,如果请求URL是:
http://www.a.com/test.htm?param=<script>alert(/XSS/)</script>
就会发现alert()方法执行了。可以查看网页源代码确认。
反射型XSS只是简单地把用户输入的数据“反射”给浏览器。黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫做“非持久型XSS”(Non-persistent XSS)。
2.存储型XSS
存储型XSS会把用户输入的数据“存储”在服务器端。有很强的稳定性。
比较常见的一个场景就是,黑客写下一篇包含有JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的JavaScript代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击就叫做“存储型XSS”。存储型XSS通常也叫做“持久型XSS”(Persistent XSS)。
3.DOM Based XSS
这种类型的XSS并非按照“数据是否保存在服务器端”来划分,DOM Based XSS从效果上来说也是反射型XSS。
DOM Based XSS:通过修改页面的DOM节点形成的XSS。
<script>
function test(){
var str = document.getElementById("test").value;
document.getElementById("t").innerHTML="<a href='"+str+"'>testLink<>";
}
</script>
<div id="t"></div>
<input type="text" id="text" value=""/>
<input type="button" id="s" value="write" οnclick="test()"/>
在这里,“write”按钮的onclick事件调用了test()函数。而在test函数中,修改了页面的DOM节点,通过innerHTML把一段用户数据当做HTML写入到页面中,这就造成了DOM based XSS。
构造数据:
’ οnclick=alert(/XSS/) //
输入后,页面代码就变成了:
<a href='' οnclick=alert(/XSS/) //' >testLink</a>
//在这里是注释掉后面的单引号。
点击这个新生成的链接,脚本将被执行。
除了构造一个新事件外,还可以选择闭合掉<a>标签,并插入一个新的HTML标签。
尝试如下输入:
’><img src=# οnerrοr=alert(/XSS2/)/><'
页面代码变成了:
<a href=''><img src=# οnerrοr=alert(/XSS2/)/><' ' >testLink</a>
恶意脚本被执行。