网络安全Web 应用程序
Web 应用程序对于我们所做的几乎所有事情都是不可或缺的,无论是访问 Internet 还是远程控制您的割草机。 在本入门课程中,我们将介绍 Web 应用程序安全的基础知识。
HTTP 协议
HTTP 是一种载体协议,它允许我们的浏览器和应用程序接收 HTML("超文本标记语言")、CSS("级联样式表")、图像和视频等内容。
URL、查询参数和方案
要访问 Web 应用程序,我们使用 URL("统一资源定位器"),例如: https://www.google.com/search?q=w3schools+cyber+security&ie=UTF-8
google.com 的 URL 包含域、正在访问的脚本和查询参数。
我们正在访问的脚本称为 /search。 / 表示它包含在服务器上提供文件的顶级目录中。 这 ? 表示脚本的输入参数和 & 分隔不同的输入参数。 在我们的 URL 中,输入参数是:
- q 值为 w3schools cyber security
- ie 值为 UTF-8
这些输入的含义由网络服务器应用程序来确定。
有时您只会看到 / 或 /? 表示已经设置了一个脚本来响应这个地址。 通常,此脚本类似于索引文件,它会捕获所有请求,除非指定了特定脚本。
Scheme 定义了要使用的协议。 在我们的例子中,它是 URL 的第一部分:https。 当方案未在 URL 中定义时,它允许应用程序决定使用什么。 方案可以包括一整套协议,例如:
- HTTP
- HTTPS
- FTP
- SSH
- SMB
HTTP 标头
HTTP 协议使用许多标头,其中一些为应用程序自定义,而另一些则为该技术明确定义和接受。
对 http://google.com 的请求示例
GET /search?q=w3schools+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://w3schools.com/
Accept-Encoding: gzip, deflate
Cookie: cookie1=value1;cookie2=value2
请求标头指定客户端想要在目标网络服务器上执行的操作。 它还包含有关是否接受压缩、正在访问的客户端类型以及服务器告诉客户端呈现的任何 cookie 的信息。 HTTP 请求标头在此处解释:
标头 | 解释 |
---|---|
GET /search... HTTP/1.1 | GET 是我们用来访问应用程序的动词。 在 HTTP Verbs 一节中有详细解释。 我们还看到了路径和查询参数以及 HTTP 版本 |
Host: google.com | 此标头指示我们要使用的目标服务。 一个服务器可以有多个服务,如 VHOSTS 部分所述。 |
User-Agent | 客户端应用程序,在大多数情况下是浏览器,可以通过版本、引擎和操作系统来识别自己 |
Accept | 定义客户端可以接受的内容 |
Referer: https://w3schools.com/ | 如果客户端点击了来自不同网站的链接,Referer 标头用于说明客户端来自哪里 |
Accept-Encoding: gzip, deflate | 内容可以压缩或编码吗? 这定义了我们可以接受的内容 |
Cookie | Cookie 是服务器在先前请求中发送的值,客户端在每个后续请求中发回这些值。 状态部分有详细解释 |
通过此请求,服务器将回复标头和内容。 示例标题如下所示:
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: <cookie value>
<website content>
响应标头和内容决定了我们将在浏览器中看到的内容。 HTTP响应头解释如下:
标头 | 解释 |
---|---|
HTTP/1.1 200 OK | HTTP 响应代码。 HTTP 响应代码部分有详细解释 |
Content-Type: text/html | 指定要返回的内容的类型,例如 HTML、JSON 或 XML |
Set-Cookie: | 客户端应该记住并在下一个请求中返回的任何特殊值 |
HTTP 动词
在访问 Web 应用程序时,会指示客户端如何向 Web 应用程序发送数据。 应用程序可以接受的动词有很多。
动词 | 用于 |
---|---|
GET | 通常用于通过查询参数检索值 |
POST | 用于通过发送到网络服务器的请求正文中的值将数据发送到脚本。 通常它涉及创建、上传或发送大量数据 |
PUT | 常用于上传或写入数据到网络服务器 |
DELETE | 指明应该删除的资源 |
PATCH | 可用于使用新值更新资源 |
这些用于 Web 应用程序的需要。 Restful (REST) 网络服务特别擅长使用完整的 HTTP 动词数组来定义后端应该做什么。
HTTP 响应代码
在网络服务器上运行的应用程序可以根据服务器端发生的情况使用不同的代码进行响应。 列出了网络服务器将向客户端发出的常见响应代码,安全专业人员应了解这些代码:
代码 | 解释 |
---|---|
200 | 应用程序正常返回 |
301 | 服务器要求客户端永久记住重定向到客户端应该访问的新位置 |
302 | 临时重定向。 客户无需保存此回复 |
400 | 客户端发出了无效请求 |
403 | 不允许客户端访问此资源。 需要授权 |
404 | 客户端试图访问一个不存在的资源 |
500 | 服务器在尝试完成请求时出错 |
REST
Rest 服务,有时称为 RESTful 服务,利用 HTTP 动词和 HTTP 响应代码的全部力量来促进 Web 应用程序的使用。 RESTful 服务通常使用部分 URL 作为查询参数来确定 Web 应用程序上发生的情况。 REST 通常由 API("应用程序编程接口")使用。
REST URL 将根据 URL 的不同元素调用功能。
一个 REST URL 示例:http://example.com/users/search/w3schools
此 URL 将调用功能作为 URL 的一部分,而不是查询参数。 我们可以将 URL 解读为:
参数 | Comment |
---|---|
users | 访问用户部分功能 |
search | 访问搜索功能 |
w3schools | 要搜索的用户 |
会话 与 状态
服务器没有内置的方式来识别 HTTP 中的回访者。 为了让网络服务器识别用户,必须在每个请求中与客户端通信一个秘密值。 这通常通过标头中的 Cookie 完成,但其他方式也很常见,例如通过 GET 和 POST 参数或其他标头。 不建议通过 GET 参数传递状态,因为此类参数通常记录在服务器或代理等中介中。
以下是一些常见的 Cookie 示例,它们允许网络服务器上的应用程序控制会话和状态:
- PHPSESSID
- JSESSIONID
- ASP.NET_SessionID
这些值表示服务器上的某个状态,通常称为会话。 这种状态表示如下:
- 您以什么用户身份登录
- 特权和授权
重要的是,发送给客户端的会话值不能被其他人轻易猜到或以其他方式识别。 如果可以,攻击者就可以在 Web 应用程序上将自己呈现为其他用户。
状态也可以保存在客户端。 这涉及服务器将所有状态发送给客户端,并依赖于客户端发回所有项目。 这样的实现依赖于加密来检查客户端声明的状态的完整性。 下面列出了使用它的实现示例:
- JWT("JSON 网络令牌")
- ASP.Net 视图状态
您可以通过打开开发者工具在您的网络浏览器中检查这些 cookie。 这是通过在浏览器中点击 F12
来完成的,打开开发者工具窗口。 在此窗口中,您应该能够找到存储 cookie 的正确位置。
在 Google Chrome 中,cookie 在上面的"应用程序"选项卡中识别。
虚拟主机
一个网络服务器可以通过虚拟主机处理许多应用程序,通常缩写为虚拟主机。 为了方便访问其他虚拟主机,Web 服务器通常会读取客户端请求的 Host 标头,并根据此值将请求发送到正确的应用程序。
网址编码
为了让应用程序在服务器和客户端之间安全地传输内容,必须对某些字符进行编码以确保它们不会影响协议。 为了保持通信的完整性,使用了 URL 编码。
URL 编码用一个 % 和两个十六进制数字替换不安全的字符。 例如:
- 百分比替换为 %25
- 空格替换为 %20
- 引号被替换为 %22
CyberChef 是执行文本分析和运行 URL 解码等操作的绝佳工具。 您可以在浏览器中试用: https://gchq.github.io/CyberChef/
JavaScript
为支持动态内容,浏览器使用脚本语言 JavaScript。 这使开发人员能够编写将在客户端上运行的解决方案,从而实现更具交互性和"生动"的网络内容。
JavaScript 还涉及针对 Web 应用程序和客户端应用程序(例如浏览器)的许多攻击。
使用 TLS 加密
HTTP 协议不支持对传输中的数据进行加密,因此添加了围绕 HTTP 的包装器以支持加密。 这在 HTTP 后用 S 表示,即 HTTPS。
加密曾经是 SSL("安全套接层"),但后来被弃用了。 相反,TLS("传输层安全性")通常用于强制加密。