XSS跨站攻击六则

首先说一下,什么是xss。xss中文名叫跨站脚本攻击,英文全名叫Cross Site Scripting,为了和css(层叠样式表)区分开,所以叫了xss。(百度百科)叫啥无所谓,我们主要来看xss能干啥。

举个最简单的例子,如果你的html页面只有一个输入框和一个按钮,点击按钮是将输入框的内容弹出来。如果坏人在这个输入的内容中插入了一段js代码,这样的话就会在页面载入的时候执行这段代码。既然如此简单就可以在别人的页面中插入自己的代码,坏人就可以尝试做更多坏事。

再举一个更坏的例子。假设某贴吧的发帖逻辑存在xss漏洞,我在发帖的时候写进去了一段js代码。虽然发帖成功,但由于js代码逻辑没有错误是不会显示在页面上的(就算显示了还能怎么样)。这段代码的功能是,所有见到了这段代码的人都会调用点赞接口,为楼主点一个滑稽币。这样,我只需要让更多人看到我的帖子,我就会得到很多很多滑稽币。

再再举一个真实的例子,就发生在微信上。完全原生开发的微信,已开始我也是完全没有想到哪里可以xss注入。当漏洞被和谐了之后我才知道,xss在发帖选择方位时的地图那里。发送朋友圈时填写的地址可以用户输入,在这个输入中注入一段代码,就可以让你的好友刷到你的朋友圈的时候都弹出一个提示框。

图:

好了介绍就到这里,接下来是正题。我们老板不知道从哪弄来了一个xss游戏,就是一个国外的网站,里面有6个xss题目。玩了一个半下午,连看攻略带搜翻译,给通关了。

第一题

题目是这样的:

大概就是给了你一个页面,页面有一个输入框和一个按钮,让你用xss的手段alert一个提示框出来。

页面代码如下:

由于是入门题目,就是给人随便玩一玩。输入框没有做任何过滤,也就是输入任何js代码都会执行。直接输入答案过关。

答案:

第一题就是给人一种xss的概念,我总结来就是,不管网站的开发者写了啥,我就钻空子写我的代码,用别人的设备执行我的代码。

第二题

第二题是一个聊天页面,在输入框中输入一段文本,点击按钮后文本就会被添加到上面的聊天内容中。

经过了第一关的历练,我直接就尝试在输入框中输入

然后点击按钮,发现没有反应。使用chrome控制台,发现这段dom结构确实被添加到了页面,但是没有执行。

百度了一波,发现js代码只有在页面载入的时候才会执行。还有另一种可以让js代码立即执行的方式,那就是appendChild。然后想到可以在聊天框中插入图片标签,然后执行js代码。(其实我是看了答案)

然后输入答案,过关。

答案:

这关就算是……开挂了。onerror的属性之前没用过,可以说是xss的知识点了。这种奇怪的属性是不是专门给xss留的后门啊…

不管了,下一关。

第三关

第三关大概是一个图片展览的页面,点击页面上的tab可以切换图片,同时地址栏的参数也会变。比如点击Image3,

这下灵感就来了,我们的注入点肯定是#号后面的参数了。

我们先来暗中观察一波代码。

大概问题就在第17行了。页面载入的时候,将#号后面的数字作为参数读入程序,并且直接拼接到img标签中。如果我们将自己的代码拼接到这段代码中,就可以被执行了。

正常情况下,我们在#号后面填写了3,会创建这样一个img元素:

如果我们要进行攻击,就不填3。我们尝试填写这么一堆东西:

2222.jpg' onerror='alert(123)' id='

这时会创建这么一个dom元素:

还是使用第二题的原理,当图片载入不了的时候,会出发onerror里的代码。其实这一关还有其他办法,如果不知道onerror这个属性,onclick属性总知道吧。所以,这么写也是正确答案:

2.jpg' onclick='alert(123)' id='

第四关

大概的意思是,输入一个数字作为秒,创建一个计时器。时间到了之后弹出一个提示框。这个提示框不算,通过xss来注入一个提示框就算过关。

经过前三关,搁脚丫子想也知道是在那个输入框动手脚了。连他们给的提示都没看(实际是看了),直接看源代码。

第一个页面,就是输入数字那页,源代码看上去没啥特别的。就是使用form表单将用户输入的数字获取到,然后开始倒计时。

再看下一个页面。

实际是同一个页面。就是接受到了数字之后,在第21行执行。这种写法实际上很危险,很容易就被xss注入了。正常情况下,用户不搞事情的情况下,21行是这样的:

但我们是要搞事情的啊,我们肯定不能正常输入3。我们输入这样一堆东西,试图想在载入页面的时候执行我们输入的代码:

1');alert(123);'

后来发现,分号会被转义:

试了很多次,双引号也会被转义。然后使用逗号链接两个函数,避开分号。成功注入。

答案:

1');alert(123);'

第五题

第五关大概是一个注册网站,点击注册后会提示用户输入电子邮箱,不管输入什么都会提示感谢注册。这道题搁脚丫子看也是一个糊弄用户的网站,用户输入的东西他们根本没有接受。所以不是后端糊弄前端就是前后端合起伙来糊弄老板,或者是老板前后端一起糊弄用户。

既然都用了这么多次脚丫子了,所以我们再用脚丫子看看这道题。第一个页面好像就是一个欢迎页面,没有什么好注入的。然后我们的脚丫子到了第二页,发现第二页有一个get参数next,看上去是指引下一个页面的。我们打开源代码,修改next参数,发现a标签的href属性变了。

这下就好弄了。首先我想到的是使用双引号切割法,于是我在next参数后面填上了:

" onclick=alert(123);

试图创建这样的一个a标签:

然后……失败了…

发现自己太天真了。首先,双引号被转义成了",然后还多了半个双引号,里面全都是字符串…总之就是失败了。

重新思考一下问题。不管什么参数,都会被拼到href中作为a标签的链接。这让我想起了一位前辈写的清理缓存功能的代码:

点击清理缓存

写到这里,这位前辈的坟头草应该很高了…

这恰好启发了我,既然会被转义,我就不写会被转义的字符不就好了。于是,把前辈的代码原封不动弄了上去。

过关。

答案是:

javascript:alert('清理缓存成功')

第六关

居然这么快就到了最后一关,最后一关应该是boss难度了吧。想到这里不由得*花一紧。

网站的作者为了让我们练手,使用了更加危险的做法陪我们玩耍。在url中使用#号接收一个js文件的地址,然后在js中载入这个新的js。

图中红框的代码展示了作者如何载入新的js文件。

破解了五个辣鸡网站之后,在第六关的我很淡定,并且没有丝毫的孩怕。我发现,所有可以让我输入内容的地方都可能是破解点。

所以,这关的位置就很简单了——载入的js文件。

我的思路是,自己写一个js文件,在载入的时候alert出点什么东西。然后在# 号后面载入我的js文件,弹框过关。

于是我写了一个js文件,放在了我们项目的服务器上。代码很简单,给喃看也无所谓。

所以,这关的答案就是!

https://xss-game.appspot.com/level6/frame#https://www.dxever.com/xt/js/xss.js

等……等等…不对。。

页面提示我

这老孙子啊……还做了正则匹配,在代码的第21行附近。

读一读正则表达式,好像还有漏洞……

大概漏洞就是没有匹配大写。(实际我是看了答案)

所以!正确答案就是!

https://xss-game.appspot.com/level6/frame#Https://www.dxever.com/xt/js/xss.js

过关。

这关的http写成Http、HTtp什么的都行,总之就是url接受任何大小写的http,正则表达式只匹配了小写的http。

至此通关。

总结:

作为前端,对所有用户输入的内容都要抱有警惕性。后端在接收前端发过来的数据也要抱有警惕性。

所以,下一期没准就是SQL注入。为您展现从删库(; DROP DATABASE;)到跑路。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180104G0NFGX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券