一、概述
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
危害:
- 盗取管理员cookie
- XSS蠕虫
- 挂马(水坑攻击)
- 键盘记录等等。。。。。。
二、XSS分类
1、反射型
反射型xss又称非持久型xss,xss代码出现在url参数或者请求中,浏览器发出请求时,参数值作为输入提交到服务器,服务器接受处理后
参数值出现在响应的html中
,最后浏览器解析执行了这段xss代码。
代码
<?php
if (!empty($_GET["name"])){ // 接收前端参数
echo $_GET["name"]; // 在页面打印参数,浏览器会解析该参数
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form>
<input type="text" name="name">
<input type="submit" name="">
</form>
</body>
</html>
服务器接受处理后
参数值出现在响应的html中
,js代码被执行
带有xss的链接:http://localhost/xss/fanshe.phpname=666%3Cscript%3Ealert%281%29%3C%2Fscript%3E
2、存储型
存储型xss又称持久型xss,它和反射型最大的区别就是,攻击脚本将被永久地存放在目标的数据库或文件中。
代码
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitize name input
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; // 插入到数据库中
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
攻击脚本被保存到数据库中
任何一个用户访问到该页面都会弹窗
3、DOM型
DOM XSS和反射型和存储型的差别是在于DOM XSS 的代码不需要服务器解析响应的直接参与,出发XSS靠的是浏览器DOM解析器的解析,可以完全认为是客户端的事情。
代码
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form>
<input type="text" name="name">
<input type="submit" name="">
</form>
<script type="text/javascript">
var temp = document.URL; //获取url地址
var index = document.URL.indexOf("name=") + 5; // 定位用户输入的参数
var par = temp.substring(index); // 截取内容
document.write(decodeURI(par)); // 解码并输出到页面中
</script>
</body>
</html>
三、手工挖掘
看url参数输出位置
看输入框输出位置
输出点位置
1、输出在标签外(尖括号的外部)
2、输出到标签中
闭合引号
支持js事件的属性可以部闭合单双引号:onload,onclick 。。。。。。
不支持js事件的属性必须要闭合单双引号:class,id 。。。。。。
不闭合引号,构造事件属性
3、输出到script标签中
案例一需要闭合引号:
案例二输入的内容可以插入到网页中:
4、引号尖括号被过滤
8进制 16进制 unicode编码的标签可以被解析还原成为原来的标签
四、XSS防御
- XSS的防御需要根据实际情况对用户的输入进行严格的过滤,基于过滤的CSS防御方式通常分为两种:基于黑名单的过滤和基于白名单的过滤。后者的防御效果往往更好,对于用户在白名单之外的输入,可以直接忽略。在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。
- 在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS的损失。
设置成 TRUE,Cookie 仅可通过 HTTP 协议访问。 这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。 要有效减少 XSS 攻击时的身份窃取行为,可建议用此设置(虽然不是所有浏览器都支持),不过这个说法经常有争议。 PHP 5.2.0 中添加。 TRUE 或 FALSE
js脚本无法获取BDUSS的cookie信息
如果cookie加了httponly有没有办法获取到???
后端代码中使用过滤函数
<?php
echo htmlspecialchars("<>'\"");
echo "<br><br>";
echo addcslashes("'\"'");
?>
对特殊字符进行转义