XSS绕过姿势

定义

XSS为跨站攻击脚本,指攻击者将js脚本(可能是其他脚本)插入到web页面,当用户浏览该网页是,代码就会执行,造成恶意攻击。

分类

Xss分为三种,反射型xss、存储型xss、DOM-based xss。反射型xss多指欺骗用户去点击包含漏洞的链接,造成攻击,危害小,不持久,服务器内不包含js脚本代码。存储型xss多指攻击者利用评论,发表文章等可以将代码写入服务器的地方,将恶意代码植入服务器,当用户浏览该网页时,存储在里面的代码会执行,造成攻击。DOM-based xss指的是通过修改页面的DOM节点形成的xss。注意函数document.getElementById().

漏洞特征

常存在于用户与服务器进行数据交互的地方,一般在应用拼接变量到html页面时产生。其实用户可以上传的所有数据,包括header等都可能包含脚本文件并加入服务器。

在HTML标签中输出:

代码:

Xss payload:

代码:

Xss payload:

所有在标签中输出的变量,未经任何处理,都可能造成xss.防御方法是对变量使用HtmlEncode.

在html属性中输出:

代码:

Xss paload:

防御方法也是对变量HtmlEncode.

在script标签中输出:

代码:

Xss payload:

防御方法是使用JavascriptEncode

在事件中输出:

代码:

Xss payload:

防御方式是使用JavascriptEncode

在css中输出:

Xss payload:

在STYLE等标签中插入url。造成攻击。一般尽可能的禁止用户可控制的变量在style标签,html标签的style属性,以及css文件中输出。如果真的有需求,使用encodeForCSS()函数。

在地址中输出:

代码:

Xsspayload:

防御方法是用URLEncode。但注意别改变url语义。

document.write在页面输出:

代码:

直接在页面输出锚点id,构造一个带xss的锚点即可。

Xss payload:

XSS payload构造技巧及绕过姿势

script标签:

如果服务器对script进行了一次移除(preg_replace函数),可以用大小写:

如果过滤是加了/i,大小写无法绕过,则用双标签:

如果过滤了alert,可用:

该标签还可以用于定义一个行内的脚本或者从其他地方引入脚本:

base>标签:

该标签用于定义页面上的所有使用相对路径标签的hosting地址。该标签将指定其后的标签默认从某一地址取url。作用于该标签之后的所有标签。攻击者可以在页面插入标签,可以通过在远程服务器上伪造图片、链接或脚本,劫持当前页面中所有使用相对路径的标签,所以一定要过滤这个标签。

Onclick事件:

Onmousedown事件:

img标签配合onerror事件:

Window.name对象:

攻击者可以利用这个对象实现跨域跨页面传递数据。Window对象是浏览器的窗体,很多时候不受同源策略的限制。方法是对window.name复制,便可以执行该段代码。执行跳转页面等操作。

行内样式(inline style):

我们同样可以在行内样式里利用 IE 浏览器支持的动态特性:

过滤器会检查关键字 style,随后跟随的不能是

所以,让我们需要把

css import:

IE 浏览器支持在 CSS 中扩展 JavaScript,这种技术称为动态特性(dynamic properties)。允许攻击者加载一个外部 CSS 样式表是相当危险的,因为攻击者现在可以在原始页面中执行 JavaScript 代码了。

为了绕过对 @import 的过滤,可以在 CSS 中使用反斜杠进行绕过:

IE 浏览器会接受反斜杠,但是我们绕过了过滤器

利用字符编码:

因为有些页面会编码转义,而%c1与\两个字符组合在一起形成一个新的字符,从而绕过转义。

绕过长度限制:1.利用js事件绕过2.将payload写到别处,通过简短的代码加载这段代码。

比如location.hash。并且根据http协议,这里的内容不会在http包中发。所以web日志不会记录到里面的内容:

因为location.hash的第一个字符是#,所以必须除掉第一个字符。

构造url:

3.利用注释符绕过长度限制

如果我们能控制两个文本框,第二个文本框可以控制更多字节,可以用html的注释符打通两个文本框,例:

第一个文本框输入”>

第二个文本框输入–>

构造出:

单引号绕过:

用单引号闭合绕开过滤

防御措施

1.在服务器配置选项中将session.cookie_httponly设为true。防止攻击者劫持cookie

2.对即将输出内容进行转义或编码,采用HtmlEncode, htmlspecialchars(),htmlentities() ,JavascriptEncode等函数处理后再输出。

3.处理用户输入的图片,视频的富文本,采用白名单的方式过滤ifrme,script,base,form,svg,img等危险标签。尽可能禁用用户自定义css和style。以及on事件

4.对所有用户提交的内容进行可靠的验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受长度范围内、采用适当格式、预期字符内容提交,其他内容一律以白名单的方式过滤。

5.实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站执行

4.确认接收的内容不包含js脚本,去掉任何对远程内容的引用(特别是css和js)

6.对javascript字段进行检索,若含有,一般都含有xss攻击

7.禁用script,base等危险标签。

8.处理用户输入的图片,视频的富文本,采用白名单的方式过滤ifrme,script,base,form,svg等危险标签。尽可能禁用用户自定义css和style。以及on事件

9.防御DOM Based xss 当变量输出到script时进行一次js编码,然后在document.write到页面时,如果是输出到js事件或者js脚本,则再js编码一次。如果输出到html内容或者属性,则再做一次htmlEncode。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190619A0R8VA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券