当前位置:   article > 正文

XSS-通关小游戏(1-20)_xss小游戏1-20

xss小游戏1-20

在玩游戏之前先简单的了解下,什么是XSS?

1.什么是xss

XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

2.xss原理

(1).攻击者对某含有漏洞的服务器发起XSS攻击(注入JS代码)

(2)诱使受害者打开受到攻击的服务器URL(邮件、留言等,此步骤可选项)

(3)受害者在Web浏览器中打开URL,恶意脚本执行。

3.xss类型

 (1)反射性:

        非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

 (2)存储型:

      持久化,代码是存储在服务器中的,如在个人信息或发表文章以及留言板等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等

 (3)DOM:

      DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

这里通过XSS小游戏来进一步的了解XSS:

这里有在线版的:闯关地址:http://test.xss.tv

当然也可以自己搭建,怎么搭建,请自行百度。(建议自行搭建,可以分析源码)

那么,开始吧!

第一关:

0.只要触发alert()函数就能跳转到下一关,其他关卡也是一样的

1、先找输入点

2、再找输出点

那么,我们应该如何输出呢?来分析一波源码:

输出在标签之间,那么直接构造:<script>alert(/xss/)</script>

也可以用其他事件onload,onclick,onerror,prompt,confirm等。例如:<svg/οnlοad=alert(1)>

第二关:

分析源码:

对比查看网页源代码:

我们看到第一个输入点,使用了 htmlspecialchars() 函数,它把预定义的字符转换为 HTML 实体。

预定义的字符是:

  • &:转换为&amp;
  • ":转换为&quot;
  • ':转换为成为 '
  • <:转换为&lt;
  • >:转换为&gt;

例子:

这是比较典型的搜索框XSS,输出点1已经被HTML实体编码了,使用了htmlspecialchars函数。我们可以在输入点2中用事件来弹框:

" onclick=alert(1)>     需要点击一下输入框。(点击事件-JS知识点)

" onmouseover=alert(1)>   需要要鼠标滑过输入框(鼠标事件-JS知识点)

或者:"><script>alert(/xss/)</script>

 

第三关:

分析源码:

<input name=keyword  value='".htmlspecialchars($str)."'>    //可以从这个看到value值也被实体化

而且value是以单引号结束

但是htmlspecialchars默认配置是不过滤单引号。只有设置了:quotestyle,才可以

那么可以用单引号闭合并且不能包含<>则

设置payload
' οnclick='window.alert()

或者:' οnclick=alert(1)%0a    %0a用做换行使得input标签语法正确,主要是因为过滤了“>”。(不是很明白,但能成功)

可以看到闭合成功,并且执行成功

第四关:

分析源码:

与第三关相比:

可以发觉多了两行代码

$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);

将输入的内容分别去掉了 <,>

但是输入框没有被实体化,但是' 变为"  

可以用第三关的payload稍作修改:

">οnclick="window.alert() 

或者 " οnclick=alert(1)%0a

 

可以看到闭合成功,并且执行成功

第五关:

分析源码:

可以看到与第四关不同地方

$str = strtolower($_GET["keyword"]);    strtolower()  函数将大写字符串转化为小写
$str2=str_replace("<script","<scr_ipt",$str);      将<script  替换为 ,<scr_ipt
$str3=str_replace("on","o_n",$str2);                 将on替换为,o_n

此处没办法使用on事件了,所以我们不能利用第四关的payload了上面先转化为小写然后替换  所以将<script>大写也无用

此处重新构建payload

"><a href=javascript:alert();>test</a>

可以看到闭合成功,并且执行成功

 

第六关:

分析源码:

相比第五关,src,data,herf也被替换了,最重要的是少了strtolower()函数,而str_replace函数是区分大小写的,所以这一关测试的主要是大小写问题,可以用大小写绕过。

"><a HREF=javascript:alert()>test</a>

"><svg x="" Onclick=alert(1)>

可以看到闭合成功,并且执行成功

SVG教程

第七关:

分析源码:

可以从上面代码看出,它使用了strtolower函数先将大写转化为小写之前方法无用,但是从下面可以看出,它将替换的字符串都都替换为空,那么我们想,如果添加两个呢,他会不会只过滤一个呢,这里需要注意的是必须在字符串中间再添一个,而不是一个后面跟着一个。这就是我们常说的双写绕过。

"><a hrhrefef=javascrscriptipt:alert()>test</a>

"><scrscriptipt>alert()</scrscriptipt>

" oonnclick="window.alert() 

可以看到闭合成功,并且执行成功

方法很多,请自行尝试。

第八关:

分析源码:

没有过滤:'  >  <  %  &  #,过滤了:"  src  on  script  data。输出点在a标签内,href属性中,属性中双引号被转换成HTML实体,无法截断属性,很明显,我们想到了协议绕过javascript:alert,由于script关键字被过滤,伪协议后面可以使用html的实体编码。payload:

(注:javascript:这个伪协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。)

javascrip&#x74;:alert(1)

javasc&#x72;ipt:alert(1)

javasc&#x0072;ipt:alert(1)

注意:

https://www.qqxiuzi.cn/bianma/zifushiti.php

字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。

这么做的目的主要有两个:
1、解决HTML代码编写中的一些问题。例如需要在网页上显示小于号(<)和大于号(>),由于它们是HTML的预留标签,可能会被误解析。这时就需要将小于号和大于号写成字符实体:
小于号这样写:&lt; 或 &#60;
大于号这样写:&gt; 或 &#62;
前面的写法称为实体名称,后面的写法则是实体编号。ISO-8859-1字符集(西欧语言)中两百多个字符设定了实体名称,而对于其它所有字符都可以用实体编号来代替。
2、网页编码采用了特定语言的编码,却需要显示来自其它语言的字符。例如,网页编码采用了西欧语言ISO-8859-1,却要在网页中显示中文,这时必须将中文字符以实体形式写入HTML代码中。

平时我们见的&nbsp;是html的实体字符,其实在后面 还对应一个实体编码。

有时会在HTML文档中看到形如:

  1. &#8721;
  2. &#x2211;
  3. &sum;

这样的字符序列,其实该序列是 HTML、XML 等 SGML 类语言的转义序列(escape sequence)。它们不是「编码」。(PS:至于是不是编码我也弄不清了,没搜到,这是抄别人的)

这三种转义序列都称为character reference(字符引用)

  • 前两种称为numeric character reference (NCR—字符数值引用),数字取值为目标字符的Unicode code point,以&#开头的后接十进制数字,以&#x开头的后接十六进制数字。
  • 最后一种是character entity reference(字符实体引用),后接预先定义的实体名称。

(其实我还发现使用Unicode转为中文,也可把&#x72;转为中文r

第九关:

分析源码:

和上一题一样,只不过多了一个自动检测url,如果发现没有带http:// 内容则会显示不合法, 那么怎么可以既有它,又不让它执行呢?只需填加个注释,(可选择多行注释和单行注释)包含http://就行了,构造payload:(强调一点构造的payload前面不要有空格,否则点击超链接会没有反应

javascri&#x0070;t:alert(1) /*http:// */ 

javascri&#x0070;t:alert(1) //http://

  

可以看到闭合成功,并且执行成功

第十关:

分析源码:

从源代码中,我们了解到只有两个url参数是有效的,分别是keyword和t_sort,且标签input被隐藏了,而我们的渗透点在t_sort参数上,所以我们构造payload:

t_sort=" onclick="alert()" type="text

 

可以看到闭合成功,并且执行成功

第十一关:

分析源码:

根据HTTP_REFERER 参数想到了HTTP头,那么我们可以在请求头进行XSS注入,这一关很显然注入点在Referer,那么我们可以使用burpsuite和火狐插件hackbar,在这一关中直接利用burpsuite抓包修改Referer,这里我用hackbar演示:

123456" οnmοuseοver=alert(1) type="text"

" type="text" οnclick="alert()

 

 

onmouseover是鼠标滑过事件。(注意:对于请求头操作建议使用BurpSuit,hackbar虽然能用,但有时效果并不好,这里我用hackbar是为了方便,但实际过程中,只成功 了几次,大多是无任何反应,可能是插件的原因,所以这里建议使用BurpSuite)

 

可以看到闭合成功,并且执行成功

第十二关:

这里顺便说一下,每个源文件,前面都会有这样的代码:

这是加载下一关的代码。注意一下就好。

我们接着看源码:

根据HTTP_USER_AGENT参数还是想到了HTTP请求头中的user-agent,那么,同理可以按照第十一关的方法来做:

" type="text" οnclick="alert()

123456" οnmοuseοver=alert(1) type="text

(暂不演示)

第十三关 :

分析源码:

看到$_COOKIE变量,自然而然的想到HTTP请求头,所以这题依然按照前面两关的方法来写:

user=" type="text" οnclick="alert(1)

user=123456" οnmοuseοver=alert(1) type="text

(暂不演示)

第十四关:

分析源码:

无法加载网址,这一关主要是:考察EXIF XSS  漏洞原理是通过修改图片的exif信息,造成解析图片exif触发XSS。利用工具推荐exiftool。可参考讲讲EXIF Viewer XSS漏洞的来龙去脉

第十五关:

分析源码:

AngularJS ng-include指令 (AngularJS前端三大框架之一,没学过)

此题用的是文件包含,那么我们可以让它调用一个evil code执行弹窗啊
payload :(htmlspecialchars()函数,把 < 和 > 还有 " 转换为实体,常用于防止浏览器将其用作 HTML 元素。)

网上的方法我都试过都不可以,而且我连最基本的跳转都完成不了,怀疑是不是环境的问题,不知道他们是如何成功的。

  1. src='level1.php?name=<img src=x onerror=alert(1)>'
  2. src='level2.php?keyword=" onclick="alert(123)" "'

 

这里放一张别人成功的图

第十六关:

分析源码:

查看第16关的代码,发现输入的东西经过了大小写的转换并且通过四次的替换检查,分别对script,空格,/,进行了替换,但是有一点很重要,尖括号没有被替换,这给我们留下很大的利用空间。

另外script被替代,我们可以使用img标签,剩下我们就需要考虑如何把空格的影响给去掉,这时候就需要使用编码来进行绕过了,可以选择%0d %0a (表会回车换行)进行绕过,构造出最后的payload

<img%0dsrc=1%0dοnclick="alert(1)">
<img%0asrc=1%0aοnerrοr=alert(1)>

可以看到闭合成功,并且执行成功

第十七题:

分析源码:

分析一下代码,发现输出点都进行了防护,对尖括号以及双引号进行了转义,但是不影响我们利用。<embed>标签定义嵌入的内容,比如插件,所以这里我们可以使用on事件去进行触发,但是首先得用b去闭合前面的等号,

构造payload

arg01=a&arg02=b onmouseover=alert(1)

可以看到闭合成功,并且执行成功

第十八关:

分析源码:

发现和第十七关一样:

第十九关:

分析源码:

这题不仔细看以为会和前两关一样实际上,实际上,难度已经提升了,已经触及到我的知识盲区了,这道题如果按照前面的写法,是无法正常闭合的:

而且他还有htmlspecialchars()函数进行过滤,这一题主要是flash xss,这里给出别人的方法:

(来自:https://www.jianshu.com/p/4e3a517bc4ea

  • flash xss,需要对flash的反编译对源码进行分析,这里使用jpexs-decompiler来分析,首先定位getURL函数

  • 然后追踪到sIFR的内容

  • 得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL只在内容为link时打开,所以分析contentIsLink函数

  • 所以我们可以构造<a > </a> 标签来传值

arg01=version&arg02=<a href="javascript:alert(1)">123</a>

  • 点击123即可xss

这个我本地测试并没有成功:

不知道为什么别人能成功,好烦!

第二十题:

flash文件好像都打不开

分析源码:

后台源码与十九关一样,这一题也是flash xss,继续搬运别人的博客,莫得办法,不会,还看不懂。。。

本题也属于Flash XSS,将xsf04.swf文件分析得知分析得知是zeroclipboard.swf

arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height

 

总结:

十五关之前没有什么问题,至于后面几关吧,有很多的问题,网上找别人写的要么类似,要么就是别人能正常运行,自己的就不行,这样的问题只能遗留下来了,作为初学者,我们现在要的是思路,这20关了解即可。

补充下一个小知识:(来自:https://www.dazhuanlan.com/2020/03/27/5e7d3fb416604/

上面的游戏都是直接看源代码才发觉到哪里有漏洞,那么肯定问题来了,如果不给源码的情况下该怎样去测试呢?因为在现实渗透中我们需要一个个payload测试是很麻烦的

这里我提供一种比较大众一点的fuzz技巧。利用burpsuit自动化xss

首先我们得在burpsuit的Extender模块中下载对应的XSS Validator插件

安装成功后可以发现菜单栏上会多一栏你插件的名字

这里我们还需要另外一个东西叫PhantomJs,这是下载地址:http://phantomjs.org/download.html,另外我们需要在xssValidator的github上下载一个小脚本(备注,链接好像失效了)

然后把它放在跟Phantomjs同一级目录下即可,然后利用Phantomjs打开即可,此时开始监听

这里我以小游戏第一关为例,现在就可以使用bp抓包发送至爆破模块,然后选择插件模式,选择我们的插件

然后去到该插件的页面复制它的特征码,加载进去字典中

点击attack,攻击成功的话会显示,同时监听也会出现报文的回显

这样去测试就比平常手工测试要便捷多了。

(备注:这东西是要自己尝试的,我也没看太明白,主要是对这个插件不熟悉,好东西就要分享。)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/395373
推荐阅读
相关标签
  

闽ICP备14008679号