自HTTP诞生以来,万维网得到飞速发展,人们上网购物、浏览新闻、网上办公都离不开 Web 服务,Web 服务已成为人们生活中使用最广的网络应用之一。作为互联网中服务节点数量最多的网络应用类型,Web服务是人们获取信息源的主要方式,Web安全也已成为网络安全的重要组成部分。
为了保证各种Web服务的正常运行,就需要安全人员对Web服务进行安全性检测,及时发现Web服务存在的相关漏洞,并对这些漏洞进行修补,保证Web服务的正常运行。另一方面,随着网络攻防技术的不断发展,网络服务厂商的安防意识不断增强,有意识地减少直接暴露在互联网上的网络节点,降低被攻击风险,而 Web 服务作为必须暴露在互联网上的网络服务,一直是网络攻防的一个重要战场。
本章对CTF竞赛中的Web安全问题进行详细介绍。首先介绍Web安全相关的基础知识和常用工具;接着按照Web服务层级和分类的不同,分3个小节对Web安全的主要内容进行论述;最后对 Web 安全中核心的认证机制及重要的注入类漏洞和反序列化漏洞的原理和利用方法进行原理性讲解。对于 Web 安全中的其他常见漏洞,比如命令执行、文件包含、路径穿越、越权漏洞等,本书将穿插在各小节进行分析讲解。
根据百度百科的定义:Web是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在 Internet 上的一种网络服务,为浏览者在 Internet 上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将 Internet上的信息节点组织成一个互为关联的网状结构。
通过解读这个定义来分析Web的本质,具体如下。
① Web是一种建立在互联网上的网络服务。
② Web是基于超文本标记语言(HTML)和HTTP的分布式图形信息系统。
③ Web具有动态交互、跨平台的特性。
④ Web中的文档及超链接构建了互联网上的网络信息节点。
⑤ 信息节点在互联网上组成了互为关联的网状结构。
从对这个定义的解读中可以发现,从广义上讲,Web 其实是一种基于 HTML 和 HTTP的网络服务,Web提供了文本、图形、多媒体等内容。Web服务架构的本质是客户-服务器结构(Client/Server,C/S),通过对 Server 端呈现内容、通信协议、客户端的标准化,实现了Web服务的全球可访问性。从狭义上讲,提供网络服务,并通过HTTP进行数据网络传输的应用都可以被认为是Web内容,如网络应用程序接口(API)、基于HTTP通信的应用程序等。
小贴士: 从安全研究的角度来看,一般以狭义的理解方式来看Web服务,即所有采用HTTP(S)进行数据传输的应用都是Web安全研究的内容。
Web服务的本质是一种基于HTTP(S)进行数据传输的标准化C/S的网络服务,Web服务的一般框架结构如图3-1所示。
图3-1 Web服务的一般框架结构
(1)服务端
服务端的主要功能是通过后台的应用处理生成 HTML 返回内容,然后再提供给客户端解析展示,服务端的本质就是动态语言,如 PHP、Python、Ruby 等,通过将各种数据整合生成一个展示在客户端的HTML格式的数据。
后端开发语言 PHP、Java、Python 的本质即对数据进行处理整合,最终将结果数据按照 HTML 格式通过 HTTP(S)传递给客户端,从这个意义上来讲,所有能进行数据处理的语言皆可成为Web后端开发语言,比如C语言。
在服务端数据处理中还会用到通用网关接口(Common Gateway Interface,CGI)技术, CGI 是外部扩展应用程序与 Web 服务器交互的一个通用标准接口,CGI 本质上是一种数据标准,可用多种语言实现,一般位于Web服务软件(如Nginx)和Web应用之间。对于一个 CGI 程序,主要的工作是从环境变量和标准输入中读取、处理数据,然后向标准输出中输出数据,是一种动态生成网页的技术标准。
小贴士: CGI 是一个翻译层,它的功能不是直接将页面数据结果提供给浏览器,而是翻译来自 Web服务软件(如Nginx)的请求并转给后台的应用程序,并且把程序执行结果翻译成静态网页返回给Web服务软件(如Nginx)。
(2)协议层
Web 中用来在网络中传输数据的协议主要是 HTTP(S),HTTP(S)主要用来在网络传输HTML内容,目前已经发展到2.0版本。
(3)客户端
Web中的客户端主要用来解析通过HTTP(S)传递的服务端返回的HTML内容,一般通过浏览器来实现,浏览器本质上是一个二进制程序,内置了页面渲染引擎,对网页语法进行解释(如HTML、JavaScript),并对解析结果进行渲染显示。
通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页上的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同内核的浏览器里的渲染效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原因,也是浏览器漏洞挖掘的一个方面。
主流的浏览器内核(引擎)及其应用如表3-1所示。
表3-1 浏览器内核(引擎)及其应用
此外,网页中一般会内置JavaScript脚本来动态生成页面,用户看到的漂亮的动态页面一般都是用JavaScript开发的,但是对于浏览器而言,最终显示的都是标准的HTML页面,这就需要使用JavaScript引擎来对JavaScript脚本进行动态解析,并动态生成网页。浏览器中一般都会内置JavaScript引擎,常见的JavaScript 擎有Google Chrome的V8引擎、Firefox的Gecko排版引擎、SpiderMonkey和Rhino、IE的Chakra引擎等。
小贴士: 网络安全领域一直都适用于半桶理论,安全要关注Web的每一个方面,要从整体上了解Web、Web运行的整体架构、Web每一部分的运行原理,从而更好地理解和分析Web安全的相关内容。
读者经常会听到HTTP 1.0、HTTP 2.0、Web 1.0、Web 2.0、Web 3.0等说法,前两者代表HTTP的两个版本,那后三者又是什么呢?
Web 1.0、Web 2.0和Web 3.0代表的是Web发展所经历的3个阶段,其对应内容如表3-2所示。目前正处在Web 2.0与Web 3.0交替的时代。
表3-2 Web不同发展阶段对应内容
根据不同的攻防手段,大致可以将网络攻防发展划分为以下4个阶段。
阶段1:操作系统、软件应用攻防阶段。这一阶段将服务器、软件应用直接暴露在互联网上,网络攻防直接针对网络主机进行。典型代表有直连木马、系统漏洞、杀毒软件漏洞、基于Office的病毒、钓鱼邮件等。
阶段2:Web攻防阶段。这一阶段由于运营商、防火墙对于网络的封锁,暴露在互联网上的非Web服务越来越少,而Web服务则越来越成熟、普及,使得Web服务成为网络攻防中重要的攻击面,大量网络攻击都瞄准Web服务来进行。近年来,随着云技术的发展,Web服务逐渐虚拟化、云平台化,使得 Web 服务脱离目标网络,安全性提高,更难以被攻击。然而,作为暴露在互联网上的、与网络目标直接相关的入口,至少到目前为止,Web服务仍然是网络攻防中最重要的攻击面之一。
阶段3:网络设备攻防阶段。随着杀毒软件、防火墙、访问控制列表(ACL)等网络防护技术的兴起及民众安全意识的提高,暴露在互联网上的网络节点越来越少,必须暴露在互联网上的网络设备成为重点攻击对象。典型代表有各类路由器、VPN 网关、邮件网关、防火墙等。
阶段4:下一代网络攻击面——物联网(IoT)。目前,物联网设备的数量日益增多,但防护还比较薄弱,在互联网目标节点越来越少的背景下将成为一个重点发展的网络攻防方向。
网络攻防有以下特点。
① 网络攻击:寻找攻击面,漏洞利用,寻找防护薄弱的环节入手。
② 网络防御:隐藏自己,进行访问控制,减少暴露在互联网上的节点。
在网络攻防中,漏洞是网络攻击的一个重要方面,所有的攻击行为都可以看作是对一些漏洞的利用,本章也会重点对Web相关漏洞的原理及应用进行讲解。
Web 安全是主要针对提供 Web 服务所涉及的各个层面内容进行的安全研究,包括服务端安全、客户端安全、开发语言安全、传输协议安全等内容,即涉及 Web 服务的内容都是进行Web安全研究的方向。
在对Web安全进行深入分析的基础上,可以对Web安全进行分层及分类。本章节根据Web服务的位置及架构将Web安全分为3层,共12个类别,如图3-2所示。
图3-2 Web安全分层及分类
4.OWASP
开放式Web应用程序安全项目(Open Web Application Security Project,OWASP)是对每年度Web领域受到10种最大的威胁的报告,该报告由全球资深的Web安全专家测试和分析后给出,包括10种对当前 Web 应用威胁最大、影响最广的漏洞及对它们的详细分析。OWASP(2017)的漏洞及说明如表3-3所示。
表3-3 OWASP(2017)的漏洞及说明
本章对这些漏洞均有详细原理讲解。
在进行Web安全内容学习之前,有必要熟悉关于Web的关键技术,这些技术是互联网上广泛使用的Web服务的基础,也是我们进行Web渗透测试和Web安全研究所必须要了解的内容。下面根据Web安全的分层及分类进行Web相关关键技术的介绍。
服务层即Web中的服务端,主要为Web服务提供服务接口、进行后台数据处理、接收及响应处理HTTP请求等功能,可以将涉及的关键技术从整体上分为服务端开发技术、容器中间件技术、CGI、数据库技术等。
① 后端开发技术:服务端开发主要指开发实现服务端应用程序及数据接口等内容的后端编程语言技术,常见的后端开发技术有PHP、Java、Python、C#等。
② 容器中间件技术:用来实现在服务器应用和各组件之间进行交互的接口,常作为运行Web服务组件的容器或者中间件。
③ CGI技术:用来提供在Web服务和后台应用之间进行交互的接口技术标准,常见的POST、GET 请求响应的实现都是在此定义,属于Web服务的核心部分。
④ 数据库技术:数据库技术是信息系统的一种核心技术,用计算机来辅助管理数据,主要研究如何组织和存储数据、如何高效地获取和处理数据等。
⑤ 其他技术:包括一些提供网络服务的关键技术,如负载均衡、WAF防火墙、云服务、CDN加速等。
除了HTTP(S)、DNS等常见的Web服务底层基础协议外,在Web服务发展的过程中也出现了一些用来进行Web信息交互的新协议,常见的新协议有WebSocket、SOAP等。
(1)WebSocket
WebSocket 是一种前端与后端通信协议。早期的前端技术只是用来加载渲染后端传送过来的页面数据,无法与后端进行交互,也无法及时更新某些关键数据,每一次的页面更新均需要获取整个页面的内容数据,无形中加重了网络和浏览器的负担,因此诞生了WebSocket。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
一个典型的WebSocket握手请求如下所示。
客户端请求如下所示。
GET /chat HTTP/1.1 Host: server.×××.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://×××.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13
服务端响应如下所示。
HTTP/1.1 101 Switching Protocols Upgrade:websocket Connection:Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
字段说明如下。
① 必须将Connection设为Upgrade,表示客户端希望连接升级。
② 状态代码101表示协议切换。
③ 必须将Upgrade字段设为websocket,表示希望升级到WebSocket。
④ Sec-WebSocket-Key是随机的字符串,服务器端会用这些数据来构造一个SHA-1的信息摘要。为 Sec-WebSocket-Key 加上一个特殊字符串258EAFA5-E914-47DA-95CAC5AB0DC85B11,然后计算 SHA-1摘要,之后进行 Base64编码,将结果作为Sec-WebSocket-Accept头的值返回给客户端。这样操作可以尽量避免普通HTTP请求被误认为WebSocket。
⑤ Sec-WebSocket-Version表示支持的WebSocket版本,RFC6455要求使用的版本是13。
⑥ Origin字段是必须的,如果缺少,WebSocket服务器会回复HTTP 403状态码(禁止访问)。
⑦ 其他一些定义在HTTP中的字段,如Cookie等,也可以在WebSocket中使用。
(2)SOAP
SOAP 是交换数据的一种协议规范,是一种轻量的、简单的、基于 XML(标准通用标记语言下的一个子集)的协议,它被设计成在Web上交换结构化的和固化的信息。
SOAP 的优点是可以传递结构化的数据,客户生成的 SOAP 请求会被嵌入一个 HTTP POST请求中发送到Web服务器。Web服务器把这些请求转发给Web Service请求处理器,处理器解析接收到的SOAP请求,调用Web Service处理后再生成相应的SOAP应答。Web服务器得到SOAP应答后会再通过HTTP应答的方式把它送回到客户端。从HTTP的角度看,最基本的4种操作是 GET(查)、POST(改)、PUT(增)、DELETE(删),我们用得比较多的操作是POST和GET方式,而SOAP可以被视为POST的一个专用版本,遵循一种特殊的XML消息格式。
SOAP一般使用HTTP POST进行请求和响应。其标准格式如下。
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.×××.com/soap-envelope" soap:encodingStyle=" soap-encoding"> <soap:Header> <!--示例--> </soap:Header> <soap:Body> <!--示例--> <soap:Fault> <!--示例--> </soap:Fault> </soap:Body> </soap:Envelope>
在下面的例子中,一个 GetStockPrice 请求被发送到服务器。该请求有一个 StockName参数,而在响应中则会返回一个Price参数,该功能的命名空间被定义在地址http://www.×××. org/stock中。
SOAP请求如下。
POST /InStock HTTP/1.1 Host: www.×××.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.×××.org/soap-envelope" soap:encodingStyle= "http: //www. ×××.org/soap-encoding"> <soap:Body xmlns:m="http://www.×××.org/stock"> <m:GetStockPrice> <m:StockName>Apple</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
SOAP 响应如下。
HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.×××.org/soap-envelope" soap:encodingStyle= "http: //www.×××.org/soap-encoding"> <soap:Body xmlns:m="http://www.×××.org/stock"> <m:GetStockPriceResponse> <m:Price>14.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
客户层技术主要包括与用户交互的客户端(如浏览器)和用来进行客户端页面渲染展示的前端相关技术。
(1)客户端关键技术
主要有浏览器沙箱技术、网页渲染引擎等关键技术。
浏览器沙箱技术与操作系统层面的沙盒思想类似,为了防止浏览器漏洞等恶意攻击,在浏览器中设计了沙箱机制。在浏览器中根据浏览器环境,针对一些脚本和程序限制其执行范围,来规避一些恶意操作。比如在浏览器中限制脚本操作本页面之外的其他页面的 DOM,限制访问非同源文档,限制向非同源服务器发送Ajax等,目的依然是保证安全。
浏览器渲染引擎技术可以参考3.1.1小节中的有关介绍。
(2)前端关键技术
前端主要用来渲染显示服务端返回的页面代码,同时可实现与用户进行数据交互,其中的关键技术包括JavaScript、CSS、DOM、H5等。