xml地图|网站地图|网站标签 [设为首页] [加入收藏]
从数组和对象中提取数据的优雅方法,的网站都
分类:web前端

成人网站PornHub跨站脚本(XSS)漏洞挖掘记

2017/06/08 · 基础技术 · 1 评论 · XSS

原文出处: FreeBuf   

图片 1

关于 Web 安全,99% 的网站都忽略了这些

2016/11/16 · 基础技术 · 安全

原文出处: 野狗   

图片 2

Web安全是一个如何强调都不为过的事情,我们发现国内的众多网站都没有实现全站https,对于其他安全策略的实践更是很少,本文的目的并非讨论安全和攻击的细节,而是从策略的角度引发对安全的思考和重视。

ES6:解构——JavaScript 从数组和对象中提取数据的优雅方法

2017/04/17 · JavaScript · es6

原文出处: deadcoderising   译文出处:胡子大哈   

ES6 有很多新特性,它很大程度上提升了 JavaScript 的编程体验,并且也告诉外界,JavaScript 依旧强势。

其中一个新特性是其对数组和对象的解构,通过解构方法从数组和对象中提取数据变得非常简单和方便。接下来看一下它是如何做到的,我们从数组开始讲起。

写在前面的话

当PornHub公布了他们的公开漏洞奖励计划之后,我敢肯定的是该网站之前存在的一些低级漏洞或比较容易发现的漏洞都已经被别人挖出来了。但是当我开始着手挖PornHub的漏洞时,我却在15分钟之内就发现了第一个漏洞,而在几分钟之后我又找出了第二个漏洞。在我整个挖洞生涯中,我从来没有以这么快的速度挖出过漏洞,所以我觉得非常的激动!

作为回报,我收到了PornHub所提供的总共500美金的漏洞奖励,外加一件非常炫酷的T恤衫,衣服的图片我已经发到Reddit上了,如下图所示:

图片 3

当我将这张照片发到Reddit上之后,我压根没想到它会受到如此多的关注,而且很多人都向我私信并问我有关挖洞的事情,例如“你是怎样完成攻击的?”以及“你为什么要攻击PornHub?”等等。由于要遵守漏洞奖励计划的规定,我当时并不能给大家回答这些问题,但是现在这些漏洞已经被修复了,所以我打算在这篇文章中跟大家描述一下挖洞的整个经过。

1. 数据通道安全

http协议下的网络连接都是基于明文的,信息很有可能被泄露篡改,甚至用户都不知道通信的对方是否就是自己希望连接的服务器。因此,信息通道安全有以下两个目标:

  • 身份认证
  • 数据不被泄漏和篡改

幸运的是https解决了上述问题的(更多关于https的细节可以看下上一篇干货扒一扒https网站的内幕)。理论上https是安全的,即使如此,https依然应该被重视,因为理论上理论和实践是一样的,但实践中又是另外一回事。前段时间爆发的心血漏洞就是一个例子。

从数组中提取数据

假设你有如下的数组,里面是几个人的名字:

JavaScript

const names = ['Luke', 'Eva', 'Phil'];

1
const names = ['Luke', 'Eva', 'Phil'];

接下来,使用解构从里面提取数据。

挖洞过程

我当时正在使用浏览器浏览PornHub Premium网站,而我仅在20分钟之内就发现并报告了两个反射型跨站脚本(XSS)漏洞。跨站脚本漏洞将允许攻击者在一个网站中执行恶意脚本,OWASP给出的XSS漏洞定义如下:

“一名攻击者可以利用XSS漏洞向不知情的用户发送恶意脚本。终端用户的浏览器无法确定这些脚本是否可信任,并且会自动运行这些恶意脚本。因为它会认为这个脚本来自一个可信任的源,而恶意脚本将访问浏览器中保存的cookie、会话token或其他的敏感信息,并利用这些信息来完成其他的恶意目的,而有些脚本甚至还可以修改页面的HTML代码。”

图片 4

我所发现的第一个漏洞存在于网站的“兑换码”区域,这个文本框并不会对用户的输入数据进行检测,而我们就可以在这个输入框中输入攻击payload了,于是我就可以用下面给出的payload来让页面显示我们的脚本信息:

PAYLOAD+STACK++%3E%27" /Autofocus/Onfocus=confirm`1`//&error=1

1
PAYLOAD+STACK++%3E%27" /Autofocus/Onfocus=confirm`1`//&error=1

这个payload的第一部分“PAYLOAD STACK”用于确保我们的payload可以被正常发送。如果我输入的是:

++%3E%27" /Autofocus/Onfocus=confirm`1`//&error=1

1
++%3E%27" /Autofocus/Onfocus=confirm`1`//&error=1

如果没有输入刚才的“PAYLOAD STACK”,那么Web应用将会屏蔽我所输入的内容,此时页面就不会显示任何脚本内容了。在payload前面输入一些无害内容可以欺骗网站的验证器,而我们的payload就可以正常执行了。

我所发现的第二个漏洞同样是一个XSS漏洞,这个漏洞的发现过程就更简单了。我当时发现了一个只会对新用户显示一次的URL参数,当我在这个参数中输入了一个payload之后就成功触发了网站的XSS漏洞,也许这就是该漏洞为何迟迟没有被发现的原因吧。大多数漏洞猎人会在开始挖洞之前先熟悉一下目标站点,有些人甚至会凭感觉来尝试找出漏洞,但是我一般采用的是一种不同的方法。我个人比较喜欢从匿名窗口入手,此时网站通常会认为我之前从未访问过它,而这些窗口中一般都会存在安全漏洞。

我发现如果我没有付费的话,我基本上是无法查看PornHub Premium的网站内容的。但是在我支付之前,网站会弹出一个窗口并告知用户当前正在访问色情网站,用户需要点击窗口中的按钮来确定是否急需访问。除此之外我还发现,当我点击了“Enter”(进入)按钮之后,网站URL地址的其中一部分会发生改变并增加了一个参数。这个存在漏洞的参数就是“&compliancePop=no_gateway”,而我就可以在这个参数中输入下面给出的payload:

&compliancePop=no_gateway%22-confirm`1`-%22

1
&compliancePop=no_gateway%22-confirm`1`-%22

加载了这个payload之后,我就可以让网站显示出“1”,也就是我们payload中的信息,而这就意味着这里存在一个XSS漏洞。

2. 浏览器安全

https解决了点到点的安全问题和身份认证问题,接下来会出现问题的地方就只有2个:浏览器和服务器,这个层面上的安全问题并没有https一样的银弹可以一次性解决。

从数组中取元素

首先从最基本的开始——提取数组中第一个元素。

JavaScript

const [first] = names; console.log(first); // 'Luke'

1
2
const [first] = names;  
console.log(first); // 'Luke'

ok,下面分析一下这个语法都做了什么。把一个变量用中括号括起来,表示我们想要取得 names 数组中的第一个元素,并且把它分配给指定的变量,本例中即变量 first

那么现在想要提取几个元素,比如第一个和第二个怎么办呢?很简单,在中括号中添加变量就可以。这样会从数组中顺序提取几个元素分配给指定的变量。

JavaScript

const [first, second] = names; console.log(first, second); // 'Luke' 'Eva'

1
2
const [first, second] = names;  
console.log(first, second); // 'Luke' 'Eva'

总结

我将这两个漏洞都上报给了PornHub,他们也在24小时之内对漏洞进行了审核确认。我很感谢PornHub的工作人员给我们提供了一个非常公平的漏洞奖励计划,而且我也要为他们的工作效率和快速响应能力点个赞。更重要的是,他们非常在意用户的安全,这也是很多其他的网站应该学习的地方。

如果你还想知道更多的挖洞经验,请关注我的Twitter(@ jon_bottarini)。

1 赞 1 收藏 1 评论

图片 5

2.1 origin 源

了解浏览器安全,有一个概念特别重要,那就是源(origin) 什么是源呢?

  • 相同的HOST
  • 相同的协议
  • 相同的端口

举栗子:

  • https//www.wilddog.com和http//www.wilddog.com非同源,因为协议不同。
  • http//wilddog.com和http//www.wilddog.com非同源,因为域名不同。
  • http//wilddog.com和http//wilddog.com:8080非同源,因为端口不同。

源这个概念为甚这么重要,这要从同源策略说起。

元素缺失时的默认值

以上面的数组为例,如果我们要取 4 个值,而数组中只有 3 个值会发生什么呢?

JavaScript

const [first, second, third, fourth] = names; console.log(fourth); // undefined

1
2
const [first, second, third, fourth] = names;  
console.log(fourth); // undefined

这种场景下,fourthunderfined

这在很多场景下都是我们不想见到的,所以可以当数组中没有那么多的值的时候,我们可以提前给变量赋上默认值。

JavaScript

const [first, second, third, fourth='Martin'] = names; console.log(fourth); // 'Martin'

1
2
const [first, second, third, fourth='Martin'] = names;  
console.log(fourth); // 'Martin'

2.2 同源策略

同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式。简单的说就是一个源的页面上的js只能访问当前源的资源,不能访问其他源的资源。那么资源是什么呢?

  • DOM
  • 通过AJAX请求的网络资源
  • Cookie
  • WebStorage,webSql

很显然,同源策略以源为单位,把资源天然分隔,保护了用户的信息安全。

同源策略是一堵墙,然而墙并非不透风。有很多方法可以绕过同源策略让javascript访问其他源的资源。比如:

  • JSONP:基于iframe的方法(iframe+window.name iframe+window.domain iframe+webMessage)
  • CORS:我认为只有CORS是”正当的”绕过同源策略的方法 同源策略是浏览器安全策略的基础,但同源策略面对很多攻击是无能为力的,比如XSS

跳过数组中的元素

学会了如何按顺序从数组中提取数据。现在有这样的场景:想要跳过数组中的某个元素取值,这样就可以避免取到不想取的值。解构方法中提供了很好的解决方案。

JavaScript

var [first, , second] = names; console.log(first, second); // 'Luke' 'Phil'

1
2
var [first, , second] = names;  
console.log(first, second); // 'Luke' 'Phil'

通过简单的添加逗号,就可以避免分配相应的数组元素,直接跳到下一个元素了。如果想要跳过多个元素呢?也很简单,多加几个逗号就可以了。

2.3 XSS (Cross-Site Script)

跨站脚本攻击,名字跟同源策略很像,事实上他们之间基本没有关系。跨站脚本攻击本质上是一种注入攻击(有兴趣了解更多注入攻击可以看Injection Theory)。其原理,简单的说就是利用各种手段把恶意代码添加到网页中,并让受害者执行这段脚本。XSS的例子只要百度一下有很多。XSS能做用户使用浏览器能做的一切事情。可以看到同源策略无法保证不受XSS攻击,因为此时攻击者就在同源之内。

图片 6

XSS攻击从攻击的方式可以分为:

  • 反射型
  • 存储型
  • 文档型

这种分类方式有些过时,长久以来,人们认为XSS分类有以上三种,但实际情况中经常无法区分,所以更明确的分类方式可以分为以下两类:

  • client(客户端型)
  • server(服务端型)

当一端XSS代码是在服务端被插入的,那么这就是服务端型XSS,同理,如果代码在客户端插入,就是客户端型XSS。

分配数组中剩下的给某元素

到现在,已经知道了如何从数组中提取单个元素,那么对于想要取数组中的后面连续部分的元素怎么办呢?看下面的解构代码。

JavaScript

var [first, ...rest] = names; console.log(rest); // ['Eva','Phil']

1
2
var [first, ...rest] = names;  
console.log(rest); // ['Eva','Phil']

通过在最后一个变量前加 ... 标记,这个意思是分配数组中剩下的所有元素给 rest 变量。

本文由澳门新葡亰手机版发布于web前端,转载请注明出处:从数组和对象中提取数据的优雅方法,的网站都

上一篇:没有了 下一篇:到作用域,的一次更新说明
猜你喜欢
热门排行
精彩图文