每一个工程师都要学的安全测试,老板再也不用担心服务器被黑

 本文由云+社区发表

本篇包含了XSS漏洞攻击及防御详细介绍,包括漏洞基础、XSS基础、编码基础、XSS Payload、XSS攻击防御。


第一部分:漏洞攻防基础知识

XSS属于漏洞攻防,我们要研究它就要了解这个领域的一些行话,这样才好沟通交流。同时我建立了一个简易的攻击模型用于XSS漏洞学习。

1. 漏洞术语

了解一些简单术语就好。

VUL

Vulnerability漏洞,指能对系统造成损坏或能借之攻击系统的Bug。

POC

Proof of Concept,漏洞证明;可以是可以证明漏洞存在的文字描述和截图,但更多的一般是证明漏洞存在的代码;一般不会破坏存在漏洞的系统。

EXP

exploit,漏洞利用;利用漏洞攻击系统的代码。

Payload

(有效攻击负载)是包含在你用于一次漏洞利用(exploit)中的攻击代码。

PWN

是一个黑客语法的俚语词 ,是指攻破设备或者系统。

0DAY漏洞和0DAY攻击

零日漏洞或零时差漏洞(Zero-dayexploit)通常是指还没有补丁的安全漏洞。

零日攻击或零时差攻击(Zero-dayattack)则是指利用这种漏洞进行的攻击。

零日漏洞不但是黑客的最爱,掌握多少零日漏洞也成为评价黑客技术水平的一个重要参数。

CVE漏洞编号

Common Vulnerabilities and Exposures,公共漏洞和暴露,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。

可以在https://cve.mitre.org/网站根据漏洞的CVE编号搜索该漏洞的介绍。也可以在中文社区http://www.scap.org.cn/上搜索关于漏洞的介绍

2. 漏洞攻击模型

img1.png

上图为一个简单的攻击模型。攻击就是将Payload通过注入点注入到执行点执行的过程。过程顺畅就表明这个漏洞被利用了。

第二部分:XSS基础知识

基础知识看完,现在我们可以开始接触了解XSS基础了。XSS基础不好就不用研究了,大家没用共同语言。

1. 什么是XSS?

XSS全称Cross-site scripting,跨站脚本攻击。攻击者通过网站注入点注入恶意客户端可执行解析的Payload,当被攻击者访问网站时Payload通过客户端执行点执行来达到某些目的,比如获取用户权限、恶意传播、钓鱼等行为。

2. XSS的分类

不了解分类其实很难学好XSS,大家对XSS分类有很多误解,而且很多文章上都解释错的,这里我给出一个相对好的XSS分类。

2.1 按照Payload来源划分

存储型XSS

Payload永久存在服务器上,所以也叫永久型XSS,当浏览器请求数据时,包含Payload的数据从服务器上传回并执行。

过程如图:

img2.png

存储型XSS例子:

发表帖子内容包含Payload->存入数据库->被攻击者访问包含该帖子的页面Payload被执行

反射型XSS

又称非持久型XSS,第一种情况:Payload来源在客户端然后在客户端直接执行。第二种情况:客户端传给服务端的临时数据,直接回显到客户端执行。

过程如图:

img3.png

反射型XSS例子 :

  1. 传播一个链接,这个链接参数中包含Payload->被攻击者访问这个链接Payload在客户端被执行。
  2. 在客户端搜索框输入包含payload的内容->服务端回显一个页面提示搜索内容未找到,payload就被执行了。

2.2 按照Payload的位置划分

DOM-based XSS

由客户端JavaScript代码操作DOM或者BOM造成Payload执行的漏洞。由于主要是操作DOM造成的Payload执行,所以叫做DOM-based XSS,操作BOM同样也可以造成Payload执行,所以这个名词有些不准确,其实叫JavaScript-based XSS更好。

DOM-based的Payload不在html代码中所以给自动化漏洞检测带来了困难。

过程如图:

img4.png

反射型DOM-based XSS的例子:

在客户端搜索框输入包含payload的内容->服务端回显一个页面提示搜索内容未找到,payload就被执行了。

存储型DOM-based XSS的例子:

从服务端接口中获取包含Payload的内容->JavaScript通过操作DOM、BOM造成Payload执行

HTML-based XSS

Payload包含在服务端返回的HTML中,在浏览器解析HTML的时候执行。这样的漏洞易于做自动化漏洞检测,因为Payload就在HTML里面。当然HTML-based XSS也有反射型和存储型的。

过程如图:

img5.png

反射型HTML-based XSS的例子:

在客户端搜索框输入包含payload的内容->服务端回显一个页面提示搜索内容未找到,payload包含在HTML被执行。

存储型HTML-based XSS的例子:

发表帖子内容包含Payload->存入数据库->被攻击者访问包含该帖子的页面Payload在HTML页面中被执行

3. XSS的攻击目的及危害

很多写出不安全代码的人都是对漏洞的危害没有清晰的认识,下图是2017 OWASP 网络威胁Top10:

img6_头图 自截取.jpg

可以看到XSS在网络威胁中的地位举足轻重。

3.1 目的

  1. cookie劫持
  2. 篡改网页,进行钓鱼或者恶意传播
  3. 网站重定向
  4. 获取用户信息

3.2 危害

  1. 传播类危害
  2. 系统安全威胁

第三部分:XSS攻击的Payload

这部分我们分析下攻击模型中的Payload,了解Payload必须了解编码,学习好JS也必须要了解好编码。要想真正做好网络安全编码是最基本的。

1. 编码基础

编码部分是最重要的虽然枯燥但必须要会。后面很多变形的Payload都建立在你的编码基础。这里通16进制编码工具让你彻底学会编码。

1.1 编码工具

16进制查看器:方便查看文件16进制编码

MAC:HEx Friend

windows: HxD

编辑器Sublime:可以通过Sublime将文件保存不同编码类型

img7.jpg

1.2 ASCII

定义:美国信息交换标准代码,是基于拉丁字母的一套计算机编码系统,主要用于显示现代英语和其他西欧语言。

编码方式:属于单子节编码。ASCII码一共规定了128个字符的编码,只占用了一个字节的后面7位,最前面的1位统一规定为0。0~31及127(共33个)是控制字符或通信专用字符。32~126(共95个)是字符(32是空格。

1.3 ISO-8859-1(Latin1)

定义:Latin1是ISO-8859-1的别名,ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。

编码方式:ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

注意:ISO-8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。比如,虽然”中文”两个字不存在iso8859-1编码,以gb2312编码为例,应该是”d6d0 cec4”两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:”d6 d0 ce c4”(事实上,在进行存储的时候,也是以字节为单位处理的)。所以mysql中latin1可以表示任何编码的字符。

Latin1与ASCII编码的关系:完全兼容ASCII。

1.4 Unicode编码(UCS-2)

Code Point: 码点,简单理解就是字符的数字表示。一个字符集一般可以用一张或多张由多个行和多个列所构成的二维表来表示。二维表中行与列交叉的点称之为码点,每个码点分配一个唯一的编号,称之为码点值或码点编号。

BOM(Byte Order Mark):字节序,出现在文件头部,表示字节的顺序,第一个字节在前,就是”大端方式”(Big-Endian),第二个字节在前就是”小端方式”(Little-Endian)。

在Unicode字符集中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它的码点是FEFF。而FFFE在Unicode中是不存在的字符,所以不应该出现在实际传输中。在传输字节流前,我们可以传字符”ZERO WIDTH NO-BREAK SPACE“表示大小端,因此字符”ZERO WIDTH NO-BREAK SPACE“又被称作BOM。

BOM还可以用来表示文本编码方式,Windows就是使用BOM来标记文本文件的编码方式的。Mac上文件有没有BOM都可以。

例如:\u00FF :00是第一个字节,FF是第二个字节。和码点表示方式一样属于大端方式。

Unicode编码字符集:旨在收集全球所有的字符,为每个字符分配唯一的字符编号即代码点(Code Point),用 U+紧跟着十六进制数表示。所有字符按照使用上的频繁度划分为 17 个平面(编号为 0-16),即基本的多语言平面和增补平面。基本的多语言平面又称平面 0,收集了使用最广泛的字符,代码点从 U+0000 到 U+FFFF,每个平面有 216=65536 个码点;

Unicode编码:Unicode 字符集中的字符可以有多种不同的编码方式,如 UTF-8、UTF-16、UTF-32、压缩转换等。我们通常所说的Unicode编码是UCS-2 将字符编号(同 Unicode 中的码点)直接映射为字符编码,亦即字符编号就是字符编码,中间没有经过特别的编码算法转换。是定长双字节编码:因为我们UCS-2只包括本的多语言平面(U+0000 到 U+FFFF)。

UCS-2的BOM:大端模式:FEFF。小端模式:FFFE。

文件保存成UTF-16 BE with BOM相当于UCS-2的大端模式,可以看到16进制开头为FEFF

Latin1与Unicode编码的关系:Latin1对应于Unicode的前256个码位。

img8.png

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信