何为XSS
首先,xss(Cross Site Scripting)是为了不和css(Cascading Style Sheets)缩写混淆而缩写为xss,直接翻译过来就是跨站脚本。
跨站脚本攻击是常见的前端web攻击。攻击者通过在页面中插入精心构造的恶意JavaScript脚本。引诱用户去点击构造的js恶意代码。当受害者去点击这些恶意代码后,游览器会去解析执行恶意的js代码。从而导致窃取用户身份/钓鱼/传播恶意代码等危害。很常见的一个xss攻击就是弹窗。
XSS的分类
反射型
储存型
DOM型
漏洞原理
反射型
反射型XSS也叫非持久型XSS,最常见的是Payload是构造在网址的某个GET参数的值里。
攻击者在URL中构造,将恶意链接发送给目标用户。当用户访问该链接时候,会向服务器发起一个GET请求来提交带有恶意代码的链接。后端服务器在没有对接受到的数据进行严格的过滤处理。完全对其信任从而导致出现xss漏洞出现。
<?php
$xss = $_GET['xss'];
echo $xss;
?>
传入的参数xss未经过过滤关键字以及编码处理就去执行传入的数据。
因此,可以构造http://127.0.0.1/xss/xss.php?xss=恶意代码。从而导致反射型xss发生。
这个过程如下:
前端触发->后端处理->数据返回前端->游览器渲染解析
即浏览器 -> 后端 -> 浏览器。
储存型
储存型XSS也叫持久性xss.
常见的就是在博客留言板、反馈投诉、论坛评论、将恶意代码和正文都存入服务器的数据库。每次访问都会触发恶意代码。攻击者在与数据库交互的地方插入恶意js代码。后端服务器未经过滤编码等处理就将恶意代码储存在数据库当中。当受害者点击这些交互的页面时,服务器回去数据库中调取恶意的代码。从而导致储存型xss漏洞。
<span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<html>
<head>
<title>储存型XSS</title>
</head>
<body>
<h2>留言信箱<h2>
<br>
<form action="xsscc.php" method="post">
留言内容:<textarea id='Mid' name="desc"></textarea>
<br>
<br>
联系方式:<input type="text" name="phone"/><br>
<br>
<input type="submit" value="submit" onclick='loction="XssStorage.php"'/>
</form>
<?php
if(isset($_POST['phone'])&&isset($_POST['desc'])){
$log=fopen("sql.txt","a");
fwrite($log,$_POST['phone']."\r\n");
fwrite($log,$_POST['desc']."\r\n");
fclose($log);
}
if(file_exists("sql.txt"))
{
$read= fopen("sql.txt",'r');
while(!feof($read))
{
echo fgets($read)."</br>";
}
fclose($read);
}
?>
</body>
</html></span>
通过POST的方式提交留言内容(desc)以及联系方式(phone),然后将提交的内容以及联系方式保持在sql.txt文件当中,当再次访问该脚本位置时候,再去读取sql.txt文件,并且将其输出。输入输出都未进行严格的过滤以及编码处理。从而导致xss漏洞。通过保存文件到sql.txt来模拟保存在数据库的方式。这部分的内容其实就是将POST提交的内容插入到数据库中。
这个过程如下:
前端与数据库交互的页面插入恶意的代码->后端服务器处理->恶意代码保存在数据库中->后端服务器读取数据库的内容->数据库读取内容->返回数据到前端->游览器渲染解析
浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
储存型
DOM型其实是一种特殊的反射型XSS 。在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。然后游览器在渲染成可看的界面。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>domxss</title>
</head>
<script>
eval(location.hash.substr(1))
</script>
<body>
</body>
</html>
触发#alert(123)
触发代码eval(location.hash.substr(1))
整个攻击过程是:
前端插入恶意代码->游览器解析