XSS简介
跨站脚本攻击(Cross Site Script)本来缩写是CSS,但是为了与层叠样式表(Cascading Style Sheet)区分,所以在安全领域叫做 “XSS”。
XSS 攻击,通常指黑客通过 HTML 注入 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击行为。
在这种行为最初出现之时,所有的演示案例全是跨域行为,所以叫做 “跨站脚本
” 。时至今日,随着Web 端功能的复杂化,应用化,是否跨站已经不重要了,但 XSS 这个名字却一直保留下来。
那么什么是XSS呢?看看下面的例子。
假设一个页面吧用户输入的参数直接输出到页面上:
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>"
?>
正常情况下,用户向param
提交的数据会展示到页面中,比如提交:
http://xss/3.1-1.php?param= this is test
会得到如下结果:
但是如果提交一段HTML代码:
http://xss/3.1-1.php?param=<script>alert(/XSS/)</script>
会发现,alert(‘XSS攻击’)在当前页面执行了
用户输入的script
代码已经被写入了页面源码中。
XSS根据效果可以分为如下几类:
第一种类型:反射型 XSS
反射型 XSS 只是简单的把用户输入的数据 “反射” 给浏览器。也就是说,黑客往往需要诱使用户点击一个恶意链接,才能攻击成功。
反射型XSS也叫做“非持久型 XSS”
第二种类型:存储型 XSS
存储型XSS是指应用程序直接将攻击者提交的恶意代码存储到服务端保存,然后永久显示在其他用户的页面上。
比较常见的就是,黑客写下一篇包含恶意JavaScript代码的博客文章,文章发表后,所有访问该博客的用户,都会在它们的浏览器中执行这段恶意的JavaScript代码.黑客把恶意的脚本保存到服务端,所以这种XSS攻击就叫做"存储型XSS".
第三种类型:DOM Based XSS
实际上,这种类型的XSS并非按照“数据是否保存在服务器端”来划分,DOM Based XSS 从效果上来说也是反射型XSS。单独划分出来是因为DOM Based XSS 的形成原因比较特别,发现它的安全专家专门提出了这种类型的XSS。出于历史原因,也就把他单独作为一个分类了。
通过修改页面的 DOM 节点形成的 XSS,称为 DOM Based XSS。
看如下代码:
<script>
function test(){
var str = document.getElementById("text").value;
document.getElementById("t").innerHTML = "<a href='"+str+"'>testLink</a>";
}
</script>
<div id="t"></div>
<input type="text" id="text" value="">
<input type="button" id="s" value="write" onclick="test()">
点击 “write” 按钮后,会在当前页面插入一个超链接,其地址为文本框的内容:
在这里,“write” 按钮的 onclick 事件调用了 test() 函数。而在 test() 函数中,修改了页面的DOM节点,通过innerHTML 把一段用户数据当做HTML写入到页面中,造成了DOM based XSS。
构造如下数据:
' onclick=alert(/XSS/)//
输入后,页面代码就变成了:
<a href='' onclick=alert(/XSS/) //'>testLink</a>
首先用一个单引号’ 闭合掉href的第一个单引号,然后插入一个onclick事件,最终再用注释符“//”注释掉第二个单引号。
点这个新生成的链接,XSS就会被执行。
实际上,还可以选择直接闭合标签,并且插入一个新的HTML标签。尝试以下输入:
'><img src=# onerror=alert(/xss2/) /><'
页面就变成了:
<a href=""><img src="#" onerror="alert(/xss2/)">YourLink</a>
脚本就被执行了: