网络安全 网络应用程序


Web 应用程序几乎是我们所做的一切工作中不可或缺的一部分,无论是访问互联网还是远程控制割草机。在本介绍课程中,我们将介绍 Web 应用程序安全性的基础知识。


HTTP 协议

HTTP 是承载协议,允许我们的浏览器和应用程序接收 HTML ("Hyper Text Markup Language")、CSS ("Cascading Style Sheets")、图片和视频等内容。


URL、查询参数和方案

要访问网络应用程序,我们使用 URL ("Uniform Resource Locator"),例如:https://www.google.com/search?q=91xjr+cyber+security&ie=UTF-8

google.com 的 URL 包含域、正在访问的脚本和查询参数。

我们正在访问的脚本称为/search。 / 表示它包含在提供文件的服务器的顶级目录中。这 ?表示脚本的输入参数,& 分隔不同的输入参数。在我们的 URL 中,输入参数是:

  • q 值为 91xjr 网络安全
  • 即值为 UTF-8

这些输入的含义由网络服务器应用程序确定。

有时你会看到只是 / 或 /?表明已设置脚本来响应该地址。通常,此脚本类似于索引用件,除非指定特定脚本,否则它会捕获所有请求。

方案定义了要使用的协议。在我们的例子中,它是 URL 的第一部分:https。当 URL 中未定义方案时,它允许应用程序决定使用什么。方案可以包括一整套协议,例如:

  • HTTP协议
  • HTTPS
  • 文件传输协议
  • SSH
  • 中小企业

HTTP 标头

HTTP 协议使用许多标头,其中一些标头是应用程序自定义的,其他标头已被技术明确定义和接受。

对 http://google.com 的请求示例

GET /search?q=91xjr+cyber+security&ie=UTF-8 HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8
Referer: https://91xjr.com/
Accept-Encoding: gzip, deflate
Cookie: cookie1=value1;cookie2=value2

请求标头指定客户端想要在目标 Web 服务器上执行的操作。它还包含有关是否接受压缩、正在访问哪种类型的客户端以及服务器告诉客户端提供的任何 cookie 的信息。 HTTP 请求头的解释如下:

Header Explanation
GET /search... HTTP/1.1 GET is the verb we are using to access the application. Explained in detail in the section HTTP Verbs. We also see the path and query parameters and HTTP version
Host: google.com This header indicates the target service we want to use. A server can have multiple services as explained in the section on VHOSTS.
User-Agent A client application, that is the browser in most cases, can identify itself with the version, engine and operating system
Accept Defines which content the client can accept
Referer: https://91xjr.com/ If the client clicked a link from a different website the Referer header is used to say from where the client came from
Accept-Encoding: gzip, deflate Can the content be compressed or encoded? This defines what we can accept
Cookie Cookies are values sent by the server in previous requests which the client sends back in every subsequent request. Explained in detail in the section State

通过此请求,服务器将回复标头和内容。示例标头如下所示:

HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: <cookie value>
<website content>

响应标头和内容决定了我们将在浏览器中看到的内容。 HTTP响应头的解释如下:

Header Explanation
HTTP/1.1 200 OK The HTTP Response code. Explained in detail in the HTTP Response Codes section
Content-Type: text/html Specifies the type of content being returned, e.g. HTML, JSON or XML
Set-Cookie: Any special values the client should remember and return in the next request

HTTP 动词

当访问 Web 应用程序时,客户端会被指示如何将数据发送到 Web 应用程序。应用程序可以接受许多动词。

!Verb Used for
GET Typically used to retrieve values via Query Parameters
POST Used to send data to a script via values in the body of the Request sent to the webserver. Typically it involves creating, uploading or sending large quantities of data
PUT Often use to upload or write data to the webserver
DELETE Indicate a resource which should be deleted
PATCH Can be used to update a resource with a new value

这些是根据 Web 应用程序的需要使用的。 Restful (REST) Web 服务特别擅长使用完整的 HTTP 动词数组来定义后端应执行的操作。


HTTP 响应代码

在网络服务器上运行的应用程序可以根据服务器端发生的情况使用不同的代码进行响应。列出了网络服务器将向客户端发出的常见响应代码,安全专业人员应了解这些响应代码:

Code Explanation
200 Application returned normally
301 Server asks client to permanently remember a redirect to a new location where the client should access
302 Redirect temporarily. Client doesn't need to save this reply
400 The client made an invalid request
403 The client is not allowed to access this resource. Authorization is required
404 The client tried to access a resource which does not exist
500 The server errored in trying to fulfill the request

休息

Rest 服务(有时称为 RESTful 服务)充分利用 HTTP 动词和 HTTP 响应代码来促进 Web 应用程序的使用。 RESTful 服务通常使用 URL 的一部分作为查询参数来确定 Web 应用程序上发生的情况。 REST 通常由 API ("Application Programming Interfaces") 使用。

REST URL 将根据 URL 的不同元素调用功能。

REST URL 示例:http://example.com/users/search/91xjr

此 URL 将调用作为 URL 一部分的功能,而不是查询参数。我们可以将 URL 解密为:

Parameter Comment
users Accessing the users part of the functionality
search Accessing the search feature
91xjr The user to search for

会话和状态

服务器没有内置方法来识别 HTTP 中的回访者。为了使网络服务器识别用户,必须在每个请求中与客户端传送秘密值。这通常是通过标头中的 Cookie 完成的,但其他方式也很常见,例如通过 GET 和 POST 参数或其他标头。不建议通过 GET 参数传递状态,因为此类参数通常记录在服务器或代理等中介中。

HTTP Sessions

以下是一些常见的 Cookie 示例,它们允许网络服务器上的应用程序控制会话和状态:

  • PHPSESSID
  • JS会话ID
  • ASP.NET_SessionID

这些值代表服务器上的某种状态,通常称为会话。该状态代表如下内容:

  • 您以什么用户身份登录
  • 权限和授权

重要的是,发送给客户端的会话值不能轻易被其他人猜测或识别。如果可以的话,攻击者就可以将自己伪装成 Web 应用程序上的其他用户。

状态也可以保存在客户端上。这涉及服务器将所有状态发送到客户端,并依赖于客户端发回所有项目。此类实现依赖于加密来检查客户端声明的状态的完整性。下面列出了使用此方法的实现示例:

  • 智威汤逊 ("JSON Web Tokens")
  • ASP.Net 视图状态

您正在使用 cookie 来参加这门课程!您可以通过打开开发人员工具在网络浏览器中检查这些 cookie。这是通过击中来完成的F12在浏览器中,打开开发人员工具窗口。在此窗口中,您应该能够找到存储 cookie 的正确位置。

Developer Console

在 Google Chrome 中,cookie 在上面的“应用程序”选项卡中被识别。

笔记:您能想到为什么屏幕截图中的 Cookie 被屏蔽掉,导致您无法读取它们吗?

虚拟主机

一台网络服务器可以通过虚拟主机(通常缩写为 Vhost)处理许多应用程序。为了方便访问其他虚拟主机,Web 服务器通常会读取客户端请求的主机标头,并根据该值将请求发送到正确的应用程序。

Virtual Hosts


网址编码

为了使应用程序在服务器和客户端之间安全地传输内容,必须对某些字符进行编码以确保它们不会影响协议。为了保持通信的完整性,使用了 URL 编码。

URL 编码用 % 和两个十六进制数字替换不安全字符。例如:

  • 百分比替换为 %25
  • 空格替换为%20
  • 报价被替换为 %22

Cyber​​Chef 是执行文本分析和运行 URL 解码等操作的出色工具。您可以在此处的浏览器中尝试一下:https://gchq.github.io/Cyber​​Chef/

笔记:尝试一下 Cyber​​ Chef,看看是否可以揭示 URL 编码字符中的以下消息所包含的内容: %48 %65 %6c %6c %6f %20 %64 %65 %61 %72 %20 %77 %33 %73 %63 %68 %6f %6f %6c %73 %20 %73 %74 %75 %64 %65 %6e %74 %2e %20 %48 %6f %70 %65 %20 %79 %6f %75 %20 %61 %72 %65 %20 %6c %65 %61 %72 %6e %69 %6e %67 %20 %73 %6f %6d %65 %74 %68 %69 %6e %67 %20 %74 %6f %64 %61 %79 %21

JavaScript

为了支持动态内容,浏览器使用脚本语言 JavaScript。这使得开发人员能够编写将在客户端上运行的解决方案,从而实现更具交互性和 "alive" 的网络内容。

JavaScript 还涉及许多针对 Web 应用程序和客户端应用程序(例如浏览器)的攻击。


使用 TLS 加密

HTTP 协议不支持传输中数据的加密,因此添加了 HTTP 的包装器来支持加密。这用 HTTP 后面的 S 来表示,即 HTTPS。

加密曾经是 SSL ("Secure Sockets Layer"),但现已弃用。相反,TLS ("Transport Layer Security") 通常用于强制加密。