1.level 1
打开源码,发现参数是通过GET方法传递的.
查看页面源代码,可以发现get传参name的值test插入了html里,还回显了payload的长度 。
插入payload
?name=<script>alert()</script>
alert()
alert()
是 JavaScript 中的一个全局函数。它用于在浏览器中显示一个带有指定消息的简单对话框。这个对话框通常包含一个 “确定” 按钮,用户点击 “确定” 按钮后对话框关闭。
2.level 2
查看源码,还是通过GET传参并将变量进行html实体化输出。
htmlspecialchars()
htmlspecialchars()是一个在许多编程语言(如 PHP)中用于处理 HTML 代码的函数。它的主要功能是将特殊字符转换为 HTML 实体,以防止这些字符在 HTML 环境中被错误地解析。在 HTML 中,有一些字符具有特殊的含义,例如<、>、&和"。如果这些字符直接出现在 HTML 内容中,可能会导致 HTML 标签被错误地解析,从而破坏页面的结构或者导致安全漏洞(如跨站脚本攻击,XSS)。
构造payload
"> <script>alert()</script> <"
3.level 3
输入上一关的payload: '> <script>alert()</script> <'
发现输入输出的值都被实体化了,并且使用了单引号闭合 。
HTML事件可以直接嵌入到标签当中,因此不需要进行标签的闭合,从而可以绕过标签被闭合的情况。这里我们使用onclick构造payload,当点击输入框时就会触发onclick事件。
直接输入οnclick=alert(1)发现前后单引号需要闭合。
如果输入'onclick=alert(1)’,查看页面源代码显示
则payload为
'onclick='alert(1)
显示
再点击输入框触发onclick事件即可
也可以配合javascript伪协议来构造payload
JavaScript 伪协议(JavaScript pseudo-protocol)是一种特殊的 URL 格式,用于在网页中执行 JavaScript 代码。它通常以 “javascript:” 开头,后面跟随着 JavaScript 代码。
' onclick=javascript:alert() '
4.level 4
直接输入
<script>alert(1)</script>
发现 <> 被去掉了 。
查看源码发现,它使用了一个str_replace函数。
str_replace()
str_replace是 PHP 中的一个字符串函数。它的主要作用是在一个字符串中替换指定的子字符串。例如,你可以用它来替换文本中的错别字、更新特定的词汇,或者将一种格式的文本转换为另一种格式。
函数语法:str_replace ( mixed $search, mixed $replace, mixed $subject [, int &$count ] )
$search:要查找的字符串或数组。它是需要被替换的内容。如果是数组,会在$subject中查找数组中的每个元素并进行替换。
$replace:用于替换$search的字符串或数组。如果是数组,那么它的元素会和$search数组中的元素一一对应进行替换。
$subject:被操作的原始字符串或者数组。如果是数组,函数会遍历数组中的每个元素进行替换操作。
$count(可选):一个变量的引用,用于存储替换的次数。
这里延用上一关的思路,当<>被过滤时使用事件进行绕过。
payload
"onclick="alert(1)
5.level 5
先输入
<script>alert(1)</script>
发现在第一个<script标签中多了一个_
查看源码
首先对传过来的参数进行了strtolower()处理。
strtolower()
strtolower()
是一个在很多编程语言中都存在的字符串处理函数。它的主要功能是将一个字符串中的所有大写字母转换为小写字母。
这意味着我们我们不能使用Script标签和on事件了。
a标签的基本语法: <a href="目标地址">链接文本</a>。点击“链接文本”这几个字时,浏览器就会跳转到目标网站的首页。
此时要用到JavaScript伪协议。
payload:
"><a href=javascript:alert(1)>1</a>
点击1后就触发了payload,成功绕过!
6.level 6
查看源码,发现以上标签都被过滤掉了。
在 HTML,JavaScript 和 CSS 中,通常对于标签名和属性名不区分大小写的,但是对于属性值是区分大小写的。
又因为前面有htmlspecialchars函数,
因此构造payload:
"><Script>alert(1)</script>
7.level 7
"><sscriptcript>alert(1)</sscriptcript>
8.level 8
可见双引号也被实体编码了。观察href可以知道,如果插入javascript:alert(1)就可以直接执行payload,但是被过滤了,所以我们对payload进行Unicode编码或者十六进制编码
(1)
在线Unicode编码解码https://www.matools.com/code-convert-unicode
javascript:alert()
(2)使用hackbar编码