Pass1 文本解析为 `HTML`
1 | <?php |
直接输入即可弹窗,在这里我们输入的字符串直接被带入前端执行
注意到,若alert中的为字符串,则需要单引号或双引号进行包裹,单数字则不需要
Pass2 `input` 标签 `value` 注入
来到第二关可以发现前端原样输出了我们输入的内容,但是没有执行相应的js
代码,这是因为<
和>
被转义成了 <
和>
导致的,但我们发现下面的
<input name=keyword value="<Script>alert(1)</Script>">
我们手动进行尝试闭合,在payload前面加上">
即可
<input name=keyword value=""><Script>alert(1)</Script>">
Pass3 `htmlspecialchars()` 的弱点
**本题要求 PHP 版本低于 8.1.0。在 8.1.0 版本中此漏洞已经修复。**HTML 标准规定了一个叫做实体(Entity)的概念。在 HTML 中,<h1>
会被解释为标题标签,那我们如何以文本形式显示出 <h1>
这四个字符呢?答案是使用字符实体,将 <
用 <
替代,将 >
用 >
替代。在 HTML 中,如果我们写 <h1>
,就会显示为 <h1>
而不会被解析。
在 PHP 中,后端需要渲染出一个 HTML 给前端,对传来的字符串就要进行这样的处理,将 <
这样的字符转换为 <
这样的实体。Level 1 就是没有进行这种处理的下场。
一个通常的做法就是:使用 PHP 自带的 htmlspecialchars()
函数处理字符串,进行字符转义。具体用法可以参考官方文档。
在 8.1.0 及以上的 PHP 版本中,这个函数默认会转义 <
、>
、&
、'
、"
这五个字符,基本可以防范这里的 XSS 攻击。
但是,8.1.0 以下版本的 PHP 默认只会转义 <
、>
、&
、"
这四个字符,不会转义单引号 '
。这就给这个函数带来了巨大的安全隐患。
回到这题,我们仍然尝试 <script>alert(1)</script>
,打开页面源码,观察这个 input 输入框(上面是无法进行闭合了)
<input name=keyword value='<script>alert(1)</script>'>
既然<
和 >
会被转义,那么如何去不使用<script> </script>
,就是利用加载器如 onmouseover
onmouseover
当鼠标移动到输入框上时,会触发 onmouseover
最终的payload:' onmouseover=alert(1) '
首尾的’都需要有空格以保证html输出正常
或者是' onmouseover=javascript:alert(1) '
Pass4 没有过滤单双引号
1 | <input name=keyword value="scriptalert(1)/script"> |
疑似是黑名单过滤了 < > 那么用pass3的payload即可,注意改为双引号闭合
" onmouseover=javascript:alert(1) "
Pass5&6 href 的危险
1 | <input name=keyword value="<scr_ipt>alert(1)</script>"> |
发现<script>
和onmouseover
都被过滤了
那么利用href
构造payload
payload"> <a href=javascript:alert(1)>hack</a>
点击hack即可弹窗
Pass6和5相似,href
被替换为 hr_ef
,事实上,这题使用了很蠢的字符过滤:区分大小写地搜索敏感词。而 HTML 并不区分大小写。所以将 href 写为 hREF 之类的即可。
payload "> <a Href=javascript:alert(1)>hack</a>
Xss备忘录
1 | <Script>alert('Xss漏洞存在')</Script> |