xss-labs(1-5)
level-1 简单触发
构造<script>alert(1)</script>
,直接弹窗说成功了,这是为什么呢?
看看源代码,对于提交的name没有任何限制,直接输出到页面上,所以导致弹窗.
level-2 ">闭合input标签
在搜索框中输入<script>alert(1)</script>
看看效果
没有弹窗?
前端代码也没有发现特别的东西
进行代码审计看看,使用了htmlspecialchars($str)
函数
htmlspecialchars()
函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 ""
- ' (单引号)成为 '
- < (小于)成为 <
- > (大于)成为 >
突然间无从下手了
又回去看了看前端源码,发现<input可以闭合
构造"><script>alert(1)</script>
level-3 '绕过html编码并闭合value
根据提示,突破点应该在搜索框上
查看前端源码,<input也可以闭合
构造"><script>alert(1)</script>
,很遗憾失败了
看看源码
输入框中的字符也被转义成实体了,闭合方法失效了
htmlspecialchars($str)
函数默认是只编码双引号的!默认只编码双引号!默认只编码双引号……重要的事情说三遍!!!
可用的引号类型:
- ENT_COMPAT - 默认。仅编码双引号。
- ENT_QUOTES - 编码双引号和单引号。
- ENT_NOQUOTES - 不编码任何引号。
所以单引号可以绕过htmlspecialchars()
函数
使用事件触发器尝试绕过一下,比如onchange, onclick, oninput
等等
以下均可绕过
'onclick='alert(1) //点击以后触发时间
'onclick=alert(1)空格'
'oninput='alert(1) // 当要在input中输入内容时触发事件
'oninput=alert(1)空格' 同上
'onchange='alert(1) // 发生改变的时候触发该事件
'onchange=alert(1)空格' 同上
'onmouseover='alert(1)//移动到区域时触发该事件
'onmouseover=alert(1)空格'
绕过成功
level-4 "闭合value
闭合标签没用了,试试事件触发'onclick='alert(1)
,还是不行
看看源码
他把尖括号给替换成空格,在value中用的双引号,但是没有用htmlspecialchars($str)
函数从而导致输入"
不会被实体转义,因此可以用"
闭合value,然后触发弹窗
"onclick="alert(1)
成功
level-5 过滤<script和on
试试前面几题的payload,都不行
'onclick='alert(1)
点击搜索后,它自动把onclick
换成了on_click
,有带奇怪哦
看看源码
它把on,<script替换了,导致语句不能执行
这意味着并没有对script过滤,构造一个只有单词script的语句:"><a href=javascript:alert(1)>xss</a>
点击xss即可弹窗