XSS简介
参考书籍:《白帽子讲web安全》
XSS 跨站脚本攻击(Cross Site Script),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过(插入恶意脚本,实现对用户游览器的控制。
XSS漏洞原理
首先在本地搭个PHP环境,代码如下:1
2
3
4<?php
$input = $_GET["param"];
echo "<div>".$input."</div>";
?>
1 | http://localhost/ch01/xss.php?param=hello |
可以看到页面输出hello,那么尝试提交一段HTML代码会怎么样呢1
http://localhost/ch01/xss.php?param=<script>alert('xss')</script>
成功弹出框,说明存在XSS注入,这就是简单的XSS基本原理了.
这里有个不错的链接讲解
XSS的原理分析与解剖
xss分为三类:
反射型XSS:又称“非持久性XSS”(Non-persistent XSS),只是简单地把用户输入的数据“反射”给浏览器。
存储型XSS:又称“持久型XSS”,用户输入的数据存储在服务器端,具有很强的稳定性
DOM Based XSS:这种类型并非按照“数据是否保存在服务器端”来划分,从效果上来说也是反射型XSS,但其形成原因较特别。出于历史原因,就把他单独作为一个分类了。修改页面的DOM结点形成XSS,故称之为DOM Based XSS。
再看如下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14<html>
<body>
<script>
function test(){
var str = document.getElementById("text").value;
document.getElementById("t").innerHTML = "<a href='"+str+"' >testLink</a>";
}
</script>
</body>
</html>
<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.
接下来尝试构造如下数据:1
' onclick=alert('xss') //
输入后页面代码变成了:1
<a herf='' onclick=alert('xss')//'>testLink</a>
- 第一个单引号闭合掉href的第一个单引号
- //是注释符,注释掉第二个单引号
点击这个新生成的链接,脚本将被执行:
这个就是恶意脚本的执行。
还有另一种利用方式——除了构造一个新事件外,还可以选择闭合掉标签,并插入一个新的HTML标签:1
'><img src=# onerror=alert('xss') /><'