1、测试
开始页面,传入<script>alert(1)</script>,不出意外没有弹窗
2、按住CTRL+U,查看返回的前端代码
3、看后端源码
htmlspecialchars()
是一个 PHP 函数,用于将特殊字符转换为 HTML 实体。比如& (和号)转化成为 &
" (双引号)转化成为 "
< (小于)转化成为 <
> (大于)转化成为 >
' (单引号)转化成为 '
默认行为:
- 仅编码双引号("),单引号(')不会被转换。
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
4、构造payload
我们这里可以得出,他会对左右尖括号和双引号:<> " "进行转化为HTML字符实体,所以不能用<script>进行弹窗,但可以通过<input>标签的一些特殊事件来执行js代码,采用单引号闭合绕过
payload:
' οnfοcus=javascript:alert('xss') >
' οnfοcus=javascript:alert('xss')//
'οnclick=alert(1)//
'οnclick='alert(1)
但要注意的是,如果使用3、4payload,onclick的属性值必须是被单引号或者双引号包围
例如,使用3、4payload,查看网页源码
可以看到,第二 alert(1) 并没有被单引号包裹,为什么也可以被html解析进行弹窗,原因在于:
onclick
属性的值没有引号,但浏览器通常仍然会尝试解析和执行alert(1)
这部分代码。后面的//'
被JavaScript解释器视为一个单行注释的开始,因此它后面的内容(即//'
)会被忽略。
- 浏览器在解析HTML时,为了兼容不同来源的、可能包含错误的HTML代码,通常会具有一定的容错能力。这意味着即使HTML代码存在某些不符合标准或规范的地方,浏览器也会尝试解析并渲染页面,而不是直接报错。
例如下面的就没有被浏览器容错处理,所以html代码不执行alert(1):
吐槽:
安全必须要会代码!!!!!!!!!!!
总结:
1、既然单引号不会被转义,我们可以用单引号闭合 value 这个字符串
2、<>
都会被转义,不能闭合这个标签不能用 <script>
标签来注入 JavaScript 代码,可以用特殊事件触发器,比如 onfocus
或者 onclick
3、htmlspecialchars()对特殊字符转化的html实体,但默认不转化单引号
4、onclick属性被单引号包裹才会执行
5、注意构成闭合,然后插入xss代码的思路