我们使用第一关的测试方法尝试一下,打咩
直接看源码,看到,尝试一下闭合
<?php
ini_set("display_errors", 0);
$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>
</center>';
?>
看一下这个函数htmlspecialchars
查看源码
可以看到在<h2> </h2>标签之中的恶意代码被编码了。
其中<和>都被编码成了html字符实体。
猜测在服务器端用htmlspecialchars()函数对keyword参数的值进行了处理。
接着往下看可以看到插入到value参数值中的恶意代码并没有被编码而是直接原样返回
但是问题是这里的js代码在标签属性值中,浏览器是无法执行的。
既然上面的恶意代码被编码了,那么只能从属性值中的恶意代码处进行突破了。
要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以了。
将keyword的参数值重新赋值"><script>alert('xss')</script>//
左边的">去闭合原先的"
右边的//去注释原先的">
可以看到浏览器成功弹窗了,说明我们提交的恶意代码被浏览器执行了。
去服务器端看看level2.php
代码
箭头1处将get方式传递到服务器端的keyword参数的值赋给str变量。
在箭头2处是用htmlspecialchars()函数对变量str进行处理之后显示到网页上。
在箭头3处却是直接将变量值插入到了<input>标签的value属性值中
因为这里并没有对敏感字符进行编码和过滤,所以可以通过构造实现XSS攻击。