直接在链接中构造最基本的XSS弹窗即可,弹窗内容为1.
<script>alert(1)</script>
分析源码,发现在echo输出中有一个函数htmlspecialchars()
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。可以看成是对特定字符的过滤。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
所谓的HTML实体,即让输入的预留字符转换为预留字符本身的符号,就是一个普通的字符,不带有功能。比如
就是浏览器上的要显示的字符,而不会被解释为网页标签 换行符的
从源码中可以看到,程序对输出进行了处理,但并未对输入进行处理,所以我们可以在input标签中构造语句,使得input标签被闭合,再执行之后的XSS语句。
"><script>alert(123)</script>
利用前面的">可以将input标签闭合,从而使后面的XSS语句得以执行。
分析源码,在输入和输出中都使用了htmlspecialchars()进行过滤,在level2已经介绍了该函数,本关中再进一步介绍一下。
htmlspecialchars(string,flags,character-set,double_encode)
该函数有四个参数,其中只有string是必须的,其他三个可缺省,缺省状态下为默认值。其中,对于flags的使用如下:
可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
所以,在本关中,flags处于默认缺省状态,未过滤单引号,其他几个都过滤。所以我们可以利用单引号配合鼠标事件来构造XSS语句。
'onclick=alert(123)//
其中单引号用于闭合前面的value(注意观察源码中的value也是用的单引号开始),//用于注释掉后方多余的符号或语句。因为采用的鼠标事件为点击事件,当提交XSS语句后需要点一下输入框即可通过。
分析源码,输入的字符被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语句
"onclick=alert(123)//
注意:
为什么鼠标事件不用>就能够闭合? 因为鼠标事件本身就添加在input标签中,就算这里能使用>将input标签进行闭合,剩下的onclick事件也不能触发。
分析源码,先将输入字符全部转为小写,再用str_replace()将