(一)简介
XSS(Cross Site Scripting)即跨站脚本攻击。攻击者在Web页面或URL里插入恶意的JavaScript脚本,而服务器与客户端信任用户的输入,没有对内容进行限制和过滤。当用户浏览网站时,嵌入的恶意代码会被浏览器解析执行。
漏洞危害:
窃取帐号,入侵者可以冒充用户身份登录后台。使得攻击者具有恶意操纵数据的能力,包括读取、更改、添加、删除;
网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该页面时,用户的计算机会被植入木马;
广告植入和钓鱼。攻击者可植入广告,或发送钓鱼信息,严重影响到用户的正常使用和体验;
(二)漏洞类型
1. 反射型
<非持久化>
前端发出请求时,XSS代码作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器被解析执行;
常见位置:URL(如:日期查询参数)、搜索框、查询框
2. 存储型
<持久化>
提交的代码会存储在服务器端的数据库、内存、文件系统;
常见位置:论坛评论、个人信息修改、富文本编辑器
3. DOM型
基于文档对象模型(Document Object Model)的一种漏洞。它的攻击代码并不需要服务器解析响应,其依赖浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行;
在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞,
如:document.getElementByld(“x’).innerHTML、document.write)
(三)XSS 检测
漏洞位置判断
浏览器存在交互 -> 用户可以自定义输入内容;
输入能返回到前端的页面上被浏览器当成脚本语言解析执行;
使用审查元素,输入的特殊字符未被实体化标签 -> > <;
自动化工具 XSS - Strike
XSStrike is a Cross Site Scripting detection suite equipped with four hand written parsers, an intelligent payload generator, a powerful fuzzing engine and an incredibly fast crawler.
参考: 网络安全-XSStrike中文手册(自学笔记)_lady_killer9的博客-CSDN博客_xsstrike
下载地址:GitHub - Ra1dhunter/xss-strike
XSS 利用平台
自行搭建:github : https://github.com/trysec/BlueLotus_XSSReceiver
公开平台:1. 登录 - Wordpress博客学习XSS平台 2. NGXPT 3. XSS Hunter
常见PAYLOAD (注意闭合)
事件触发: '"><img src=0 οnerrοr=alert(document.cookie)>;//
内部标签: '"><script>alert(document.cookie)</script>;//
伪协议: '">xss;//
XSS绕过
由于网站可能存在过滤机制,会对XSS攻击的敏感函数进行过滤:
大小写转换;
引号的使用;
左斜线代替空格;
对标签内的属性进行转码;
5.双写绕过;
(四)安全开发与修复
网页安全政策 CSP(Content Security Policy)
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。开启CSP策略的方法,一种是通过 HTTP 头信息的
Content-Security-Policy
的字段;另一种是通过网页的
<meta>
标签。
详情见这篇文章: Content Security Policy 入门教程 - 阮一峰的网络日志
实体化标签
验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下 :
输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。
注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。
警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。对客户端提交的数据进行过滤,一般建议过滤掉双引号(”)、尖括号(<、>)等特殊字符,或者对客户端提交的数据中包含的特殊字符进行实体转换,比如将双引号(”)转换成其实体形式",<对应的实体形式是<,<对应的实体形式是>以下为需过滤的常见字符:
[1] |(竖线符号)
[2] & (& 符号)
[3];(分号)
[4] $(美元符号)
[5] %(百分比符号)
[6] @(at 符号)
[7] '(单引号)
[8] "(引号)
[9] '(反斜杠转义单引号)
[10] "(反斜杠转义引号)
[11] <>(尖括号)
[12] ()(括号)
[13] +(加号)
[14] CR(回车符,ASCII 0x0d)
[15] LF(换行,ASCII 0x0a)
[16] ,(逗号)
[17] \(反斜杠)
2、在请求返回页面关键字符进行转义;
[1] “(双引号):"
[2] ’ (单引号):&apos
[3] &(&符号):&
[4] <(左尖括号):<
[5] >(右尖括号):>
在不影响应用的前提下,建议将cookie标记为httpOnly,同时禁用TRACE方法。
Java实现XSS防御
Java实现XSS防御 - 夏威夷8080 - 博客园
PHP实现XSS防御
PHP直接输出html的,可以采用以下的方法进行过滤:
htmlspecialchars函数;
htmlentities函数;
HTMLPurifier.auto.php插件;
RemoveXss函数;
PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:
尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容;
必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤;
富文本编辑器
不含有富文本编辑器(自定义样式)且没有使用DOM的站点
输入:过滤双引号,单引号,左右尖括号,分号;
输出:对上述字符进行HTML实体编码即可;
不含有富文本编辑器(自定义样式)但使用DOM的站点
输入:在DOM中转义双引号,单引号,左右尖括号,分号;
输出:在输出之前进行编码,如:innerHTML=encodeHTML(output);
含有富文本编辑器(自定义样式)但没有使用DOM的站点
输入:过滤双引号,单引号,分号;
输出:对上述字符进行HTML实体编码即可;
(五)深度收藏指南
(以上图片资源来自某安全公众号,收藏过久忘了是哪个,如有侵权请告知)
版权归原作者 ROODIE.Z 所有, 如有侵权,请联系我们删除。