XSS的基本概念
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript。
跨站脚本攻击`(Cross Site Scripting)`缩写为CSS,但这会与层叠样式表`(Cascading Style Sheets,CSS)`的缩写混淆。因此,我们将跨站脚本攻击缩写为XSS。
xss的原理
HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,<title>与</title>之间的字符是页面的标题等等。
当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段`JavaScript脚本时`,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。
我们可以在本地构造一个网页来了解一下xss的原理。
<html>
<head>
<title>XSS原理分析</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="input"><input type="submit">
</form>
<hr>
<?php
$xss = $_GET['input'];
echo '请输入<br>'.$xss;
?>
</body>
</html>
网页如下图
如果我们给他输入一个恶意的HTML代码看看。
<script>alert(/xss/)</script>
成功进行了一次xss攻击。alret(/xss/)在页面中执行了。
我们来看看源代码。可以看到我们的Scritp脚本,已经写入到页面中了。
xss的分类
XSS有三类:反射型XSS(非持久型)、存储型XSS(持久型)和DOM XSS。
反射型XSS Non-persistent XSS
发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射。
存储型XSS persistent XSS
存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。
最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击。
DOM XSS DOM Based XSS
DOM XSS和反射型XSS、存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情。
我们来看看一个例子。
<html>
<head>
<meta charset="UTF-8">
<title>dom XSS原理分析</title>
</head>
<body>
<h1 >DOM XSS原理分析 cn0sec.cn</h1>
<input type="text" name="address1" value="请输入">
</body>
</html>
我们看看网页
如果我们输入
"/><script>alert(document.cookie)</script><!-
那么就会变成
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">
嵌入的JavaScript代码将会被执行。
XSS的危害
挂马(水坑攻击)
盗取用户Cookie。
DOS(拒绝服务)客户端浏览器。
钓鱼攻击
劫持用户Web行为,甚至进一步渗透内网。
其它安全问题