XSS闯关小游戏通关笔记

level1 — 无过滤

分析源码,没有任何的过滤。
XSS闯关小游戏通关笔记_第1张图片

直接在链接中构造最基本的XSS弹窗即可,弹窗内容为1.

<script>alert(1)</script>

XSS闯关小游戏通关笔记_第2张图片

level2 — input中未设置过滤

分析源码,发现在echo输出中有一个函数htmlspecialchars()

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。可以看成是对特定字符的过滤。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >

所谓的HTML实体,即让输入的预留字符转换为预留字符本身的符号,就是一个普通的字符,不带有功能。比如
就是浏览器上的要显示的字符,而不会被解释为网页标签 换行符的

XSS闯关小游戏通关笔记_第3张图片
从源码中可以看到,程序对输出进行了处理,但并未对输入进行处理,所以我们可以在input标签中构造语句,使得input标签被闭合,再执行之后的XSS语句。

"><script>alert(123)</script>

利用前面的">可以将input标签闭合,从而使后面的XSS语句得以执行。
XSS闯关小游戏通关笔记_第4张图片

level3 — 未过滤单引号

分析源码,在输入和输出中都使用了htmlspecialchars()进行过滤,在level2已经介绍了该函数,本关中再进一步介绍一下。

htmlspecialchars(string,flags,character-set,double_encode)

该函数有四个参数,其中只有string是必须的,其他三个可缺省,缺省状态下为默认值。其中,对于flags的使用如下:

可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。

XSS闯关小游戏通关笔记_第5张图片

所以,在本关中,flags处于默认缺省状态,未过滤单引号,其他几个都过滤。所以我们可以利用单引号配合鼠标事件来构造XSS语句。

'onclick=alert(123)//

其中单引号用于闭合前面的value(注意观察源码中的value也是用的单引号开始),//用于注释掉后方多余的符号或语句。因为采用的鼠标事件为点击事件,当提交XSS语句后需要点一下输入框即可通过。

level4 — 未过滤双引号

分析源码,输入的字符被str_replace()将 “<” 和 “>” 替换为空,即过滤了尖括号,下面介绍一下str_replace()函数:

str_replace(find,replace,string,count)
参数		描述
find	必需。规定要查找的值。
replace	必需。规定替换 find 中的值的值。
string	必需。规定被搜索的字符串。
count	可选。一个变量,对替换数进行计数。

举例:
把字符串 “Hello world!” 中的字符 “world” 替换成 “Peter”:

echo str_replace("world","Peter","Hello world!");
输出结果为:Hello Peter!

且value使用双引号进行闭合,相当于与level3相比,只是把level的单引号换成双引号即可构造出XSS语句
XSS闯关小游戏通关笔记_第6张图片

"onclick=alert(123)//

注意:
为什么鼠标事件不用>就能够闭合? 因为鼠标事件本身就添加在input标签中,就算这里能使用>将input标签进行闭合,剩下的onclick事件也不能触发。

XSS闯关小游戏通关笔记_第7张图片

level5 — 未过滤javascript

分析源码,先将输入字符全部转为小写,再用str_replace()将

你可能感兴趣的:(WEB安全,xss,安全,web)