XSS 漏洞

Posted ROODIE.Z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS 漏洞相关的知识,希望对你有一定的参考价值。

(一)简介

        XSS(Cross Site Scripting)即跨站脚本攻击。攻击者在Web页面或URL里插入恶意的javascript脚本,而服务器与客户端信任用户的输入,没有对内容进行限制和过滤。当用户浏览网站时,嵌入的恶意代码会被浏览器解析执行。

漏洞危害:

1. 窃取帐号,入侵者可以冒充用户身份登录后台。使得攻击者具有恶意操纵数据的能力,包括读取、更改、添加、删除;

2. 网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该页面时,用户的计算机会被植入木马;

3. 广告植入和钓鱼。攻击者可植入广告,或发送钓鱼信息,严重影响到用户的正常使用和体验;

(二)漏洞类型

1. 反射型

<非持久化>

        前端发出请求时,XSS代码作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器被解析执行;

常见位置:URL(如:日期查询参数)、搜索框、查询框

2. 存储型

<持久化>

        提交的代码会存储在服务器端的数据库、内存、文件系统;

常见位置:论坛评论、个人信息修改、富文本编辑器

3. DOM型

        基于文档对象模型(Document Object Model)的一种漏洞。它的攻击代码并不需要服务器解析响应,其依赖浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行;

        在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞,

如:document.getElementByld(“x’).innerhtml、document.write)

(三)XSS 检测

漏洞位置判断

1. 浏览器存在交互 -> 用户可以自定义输入内容;

2. 输入能返回到前端的页面上被浏览器当成脚本语言解析执行;

3. 使用审查元素,输入的特殊字符未被实体化标签 -> &gt &lt;

自动化工具 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>;//

伪协议: '"><a href=javascript:alert(document.cookie)>xss</a>;//

XSS绕过

由于网站可能存在过滤机制,会对XSS攻击的敏感函数进行过滤:

1. 大小写转换;

2. 引号的使用;

3. 左斜线代替空格;

4. 对标签内的属性进行转码;

5.双写绕过;

(四)安全开发与修复

网页安全政策 CSP(Content Security Policy

        CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。开启CSP策略的方法,一种是通过 HTTP 头信息的Content-Security-Policy的字段;另一种是通过网页的<meta>标签。

详情见这篇文章: Content Security Policy 入门教程 - 阮一峰的网络日志

实体化标签

        验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下 :

1. 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。

2. 输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。

3. 明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。

4. 注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。

5. 警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。对客户端提交的数据进行过滤,一般建议过滤掉双引号(”)、尖括号(<、>)等特殊字符,或者对客户端提交的数据中包含的特殊字符进行实体转换,比如将双引号(”)转换成其实体形式",<对应的实体形式是<,<对应的实体形式是>以下为需过滤的常见字符:

[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的,可以采用以下的方法进行过滤:

1. htmlspecialchars函数;

2. htmlentities函数;

3. HTMLPurifier.auto.php插件;

4. RemoveXss函数;

PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤

1. 尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容;

2. 必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤;

富文本编辑器

不含有富文本编辑器(自定义样式)且没有使用DOM的站点

输入:过滤双引号,单引号,左右尖括号,分号;

输出:对上述字符进行HTML实体编码即可;

不含有富文本编辑器(自定义样式)但使用DOM的站点

输入:在DOM中转义双引号,单引号,左右尖括号,分号;

输出:在输出之前进行编码,如:innerHTML=encodeHTML(output);

含有富文本编辑器(自定义样式)但没有使用DOM的站点

输入:过滤双引号,单引号,分号;

输出:对上述字符进行HTML实体编码即可;

(五)深度收藏指南

(以上图片资源来自某安全公众号,收藏过久忘了是哪个,如有侵权请告知)

以上是关于XSS 漏洞的主要内容,如果未能解决你的问题,请参考以下文章

CSRF介绍

原创干货 | XSS漏洞解析与挖掘

从零学习安全测试,从XSS漏洞攻击和防御开始

XSS漏洞攻防

从零学习安全测试,从XSS漏洞攻击和防御开始

XSS漏洞攻击