1、打开页面
2、传入xss代码
payload:<script>alert(xss)</script>,发现返回<script>alert(xss)</script>
3、分析原因
打开f12,没什么发现
看后端源码,在这form表单通过get获取keyword的值赋给str,然后str通过htmlspecialchars()过滤
htmlspecialchars()
是 PHP 中的一个函数,用于将特殊字符转换为 HTML 实体。这通常用于防止跨站脚本攻击(XSS),并确保特殊字符(如<
,>
,&
,"
,'
等)在 HTML 上下文中被正确解析。
php
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
4、构建payload
所以我们通过前端可以看到:<input name=keyword value="<script>alert(xss)</script>">
所以我们考虑将**<input name=keyword** **value=" "**这个闭合,然后后面在跟我们的xss代码,这样传入的value就被过滤,但我们xss就被网页执行
所有构建payload:"> <script>alert("xss")</script>
然后变成: <input name=keyword value=" "> <script>alert("xss")</script>
5、疑惑反思
做题遇到的疑惑:
一开始我在想传入<script>alert("xss")</script>, 不是被htmlspecialchars
函数转义成<script>alert("ls /")</script>了么,然后又通过代码:echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>" 输出前端,为什么最后页面显示是**"没有找到和 <script>alert("ls /")</script> 相关的结果** 。而不是**"没有找到和<script>alert("ls /")</script>相关的结果."**
通过查阅资料,就懂了
6、网页渲染过程
原理:
1、你参数传进去,PHP 后端中使用 htmlspecialchars
对输入进行转义
2、然后开始执行PHP的后端代码,你的参数就执行不了,传入的payload也执行不了
3、PHP后端代码执行完后,浏览器会将转义后的字符还原为原始字符进行显示
4、因此,页面最终显示的是用户原始输入的内容,而不是转义后的字符
所以我们要通过闭合来绕开后端的过滤,来执行我的payload
**反思:**开发与安全缺一不可
总结:
1、xss的payload的构建可以f12查看前端代码
2、理解构建xss的闭合过程,其实就是绕过过滤