level-1
1.寻找输入输出点


2.插入js代码出现弹框

####总结
js弹窗alert()
level-2
输入js代码无作用,出现过滤


htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体(文本),如:将<转换为<;,>转换为>,使得代码无法运行。
但是在第二个输出点没有过滤
可以进行构造闭合
"><script>alert(1)</script>

成功!!!
总结
闭合绕过
level-3

插入构造的js代码后,依然被过滤(两个“的颜色不一样,说明被过滤)

把 ” 换成 ‘ 时成功转义

使用事件,添加属性,发现多了一个 ’

构造’ onclick=’alert(1),成功添加属性

点击搜索框,触发弹框
总结
使用事件onclick绕过html实体化
level-4

发现尖括号消掉了,可以用事件

输入一个 ‘
输入 “ 成功闭合

” onclick="alert(1)

level-5

script转义了

onclick也转义了

使用js的伪协议
构造闭合,添加a标签(跳转链接)
"><a href=javascript:alert(1)>你好</a>


总结
插入标签 如a标签的href属性
level-6

href被过滤

使用大写绕过
script大写也行

总结
大小写绕过
level-7
script没有了,可能是双写



成功绕过
总结
双写绕过
level-8
该关过滤有点严格,前面的方法都用不上
可以使用html字符实体
点我跳转

使用时 &#x (16进制)

t -> 74
总结
href属性自动解析Unicode编码
level-9



定义和用法
strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。
**注释:**strpos() 函数是区分大小写的。
**注释:**该函数是二进制安全的。
相关函数:
- strrpos() – 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
- stripos() – 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
- strripos() -查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
链接插入js
%0d url编码–回车
javascript:%0dhttp://%0aalert(1)

level-10
发现没有输入的地方,打开开发者工具之后发现输入框隐藏了

发现没有提交按钮
此时就用到代码审计
发现get传参

只有t_sort传参有输出
t_sort="%20type="text"%20onmousemove="alert(1)

把后面的type属性顶掉
type="hidden"—>…..
总结
根据源码猜传参的参数名,隐藏的input标签可以插入type=“text”显示
level-11
10–>11关时

输入点在请求头里

找到输入输出点

修改输入点
" type="text" onmousemove="alrt(0)

成功修改

总结
考虑http头传值,本关是referer
level-12
找到输入点

进行抓包
更改UA头
" type="text" onmousemove="alrt(0)

放过数据包
成功
总结
UA头传值
level-13

抓包

修改cookie
" type="text" onmousemove="alrt(0)

放行
总结
cookie传值
level-14
找到输入输出点

ng-include指令就是==文件包涵==的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号

所以可以随便包涵之前的一关并对其传参,以达到弹窗的效果
对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如 < script >,但是可以包涵那些标签的东西比如< a>、< input>、< img>、< p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签,可参考XSS常见的触发标签,构造payload

当然也能用p标签,可以构造payload
?src='/level1.php?name=<p onmousedown=alert()>哈哈哈</p>'
总结
ng-include文件包涵,可以无视html实体化
level-16

script被过滤

尝试双写,发现过滤了

使用其他标签
发现空格过滤
< img scr=%0donerror=alert(1)>

使用%0d unicode编码代替空格
总结
回车代替空格绕过检测
level-17

加了空格后发现元素被顶掉了

插入onmousemove事件
