网络安全 Web 应用
Web 应用几乎是我们所有行为的基础,无论是访问互联网还是远程控制你的割草机。在本入门课程中,我们将介绍 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
这些输入的含义由 Web 服务器应用程序来确定。
有时你会看到 / 或 /?,表明已经设置了一个脚本来响应此地址。通常,这个脚本类似于一个索引文件,它会捕获所有请求,除非指定了特定的脚本。
方案定义了要使用的协议。在本例中,它是 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
请求头指定了客户端希望在目标 Web 服务器上执行的操作。它还包含有关是否接受压缩、访问客户端的类型以及服务器告知客户端提供的任何 Cookie 的信息。HTTP 请求头在此处进行了解释
头 | 解释 |
---|---|
GET /search... HTTP/1.1 | GET 是我们用来访问应用程序的动词。在 HTTP 动词部分进行了详细解释。我们还看到了路径和查询参数以及 HTTP 版本 |
Host: google.com | 此头指示我们想要使用的目标服务。服务器可以拥有多个服务,如 VHOSTS 部分所述。 |
User-Agent | 客户端应用程序,大多数情况下是浏览器,可以使用版本、引擎和操作系统进行识别 |
Accept | 定义了客户端可以接受的内容 |
Referer: https://w3schools.com/ | Referer |
Accept-Encoding: gzip, deflate | 如果客户端单击了来自不同网站的链接,则 Referer 头用于表明客户端来自哪里 |
Accept-Encoding | 内容是否可以压缩或编码?这定义了我们能接受什么 |
Cookie
Cookie 是服务器在先前的请求中发送的值,客户端会在每个后续请求中将其发送回来。在状态部分进行了详细解释
使用此请求,服务器将使用头和内容进行回复。以下是一些示例头
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: <cookie value>
头 | 解释 |
---|---|
Cookie 是服务器在先前的请求中发送的值,客户端会在每个后续请求中将其发送回来。在状态部分进行了详细解释 | <website content> |
使用此请求,服务器将使用头和内容进行回复。以下是一些示例头 | 响应头和内容决定了我们在浏览器中看到的内容。HTTP 响应头解释如下 |
HTTP 响应代码。在 HTTP 响应代码部分进行了详细解释 | 指定了返回的内容类型,例如 HTML、JSON 或 XML |
Set-Cookie
客户端应记住并在下次请求中返回的任何特殊值
HTTP 动词 | 当访问 Web 应用时,客户端会收到有关如何将数据发送到 Web 应用的说明。应用程序可以接受许多动词。 |
---|---|
!动词 | 用途 |
GET | 通常用于通过查询参数检索值 |
POST | 用于通过发送到 Web 服务器的请求主体中的值将数据发送到脚本。通常,它涉及创建、上传或发送大量数据 |
PUT | 通常用于上传或将数据写入 Web 服务器 |
DELETE | 指示应删除的资源 |
PATCH
可用于使用新值更新资源
这些动词根据 Web 应用的要求使用。RESTful(REST)Web 服务特别善于使用所有 HTTP 动词来定义应在后端执行的操作。
HTTP 响应代码 | 解释 |
---|---|
200 | 运行在 Web 服务器上的应用程序可以根据服务器端发生的情况使用不同的代码进行响应。下面列出了 Web 服务器会向客户端发出的常见响应代码,安全专业人员应了解这些代码 |
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 解释为 |
---|---|
参数 | 注释 |
users | 访问功能的 users 部分 |
search | 访问搜索功能 |
w3schools
要搜索的用户
会话与状态
- HTTP 中没有内置的方法来识别返回的访问者。为了让 Web 服务器识别用户,必须在每个请求中将一个秘密值传递到客户端并从客户端返回。这通常通过头中的 Cookie 完成,但其他方法也很常见,例如通过 GET 和 POST 参数或其他头。不建议通过 GET 参数传递状态,因为这些参数通常会记录在服务器上或中间机构(如代理)中。
- 以下是一些常见的 Cookie 示例,它们允许 Web 服务器上的应用程序控制会话和状态
- PHPSESSID
JSESSIONID
- ASP.NET_SessionID
- 这些值代表服务器上的特定状态,通常称为会话。此状态表示诸如以下内容
您以哪个用户身份登录
权限和授权
- 重要的是,发送到客户端的会话值不能轻易被他人猜测或识别。如果他们可以这样做,攻击者就可以冒充其他用户访问 Web 应用。
- 状态也可以保存在客户端上。这涉及服务器将所有状态发送到客户端,并依赖于客户端将所有项目发送回来。这种实现依赖于加密来检查客户端声称的状态的完整性。使用此方法的实现示例如下
JWT(“JSON Web 令牌”)
ASP.Net ViewState
F12
来完成,打开开发人员工具窗口。在此窗口中,您应该能够找到 Cookie 存储的正确位置。 在 Google Chrome 中,Cookie 在上面的应用程序选项卡中被识别出来。
注意:你能想到为什么屏幕截图中已将 Cookie 遮盖,因此您无法读取它们吗?
虚拟主机
一个 Web 服务器可以通过虚拟主机(通常缩写为 Vhosts)处理多个应用程序。为了方便访问其他虚拟主机,Web 服务器通常会从客户端请求的 Host 头读取信息,并根据此值将请求发送到正确的应用程序。
URL 编码
- 为了让应用程序能够安全地在服务器和客户端之间传输内容,必须对某些字符进行编码,以确保它们不会影响协议。为了保持通信的完整性,使用 URL 编码。
- URL 编码将不安全的字符替换为 % 和两个十六进制数字。例如
- 百分号替换为 %25
空格替换为 %20
JavaScript
为了支持动态内容,浏览器使用脚本语言 JavaScript。这使得开发人员能够编写在客户端运行的解决方案,从而实现更具交互性和“活力”的 Web 内容。
JavaScript 也参与了许多针对 Web 应用程序和客户端应用程序(如浏览器)的攻击。
使用 TLS 加密
HTTP 协议本身不支持传输中的数据加密,因此需要在 HTTP 之上添加一层封装来提供加密支持。这在 HTTP 后面添加一个字母 "S" 来表示,即 HTTPS。
过去使用的加密协议是 SSL(“安全套接层”),但现在已弃用。取而代之的是通常使用 TLS(“传输层安全”)来强制加密。