文章

Http基础

超文本传输协议 (HTTP)

今天,我们使用的大多数应用程序(包括 Web 和移动应用程序)都不断与 Internet 交互。大多数 Internet 通信都是通过 HTTP 协议通过 Web 请求进行的。HTTP 是用于访问万维网资源的应用程序级协议。该术语代表包含指向其他资源的链接的文本和读者可以轻松解释的文本。hypertext

HTTP 通信由客户端和服务器组成,其中客户端向服务器请求资源。服务器处理请求并返回请求的资源。HTTP 通信的默认端口是 port ,但可以根据 Web 服务器配置将其更改为任何其他端口。当我们使用互联网访问不同的网站时,会使用相同的请求。我们输入 () 作为 () 以访问所需的网站,例如 www.hackthebox.com80Fully Qualified Domain NameFQDNUniform Resource LocatorURL


网址

通过 HTTP 上的资源是通过 访问的,它提供了更多的规范,而不仅仅是指定我们想要访问的网站。让我们看看 URL 的结构:

1
URL

!https://academy.hackthebox.com/storage/modules/35/url_structure.png

以下是每个组件的含义:

元件描述
Schemehttp:// https://这用于标识客户端正在访问的协议,并以冒号和双斜杠 (://)
User Infoadmin:password@这是一个可选组件,其中包含用于向主机进行身份验证的凭据(用冒号分隔),并通过 at 符号 (:@)
Hostinlanefreight.comhost 表示资源位置。这可以是主机名或 IP 地址
Port:80the 与 the 之间用冒号 () 分隔。如果未指定 port,则 schemes 默认为 port,默认为 portPortHost:http80https443
Path/dashboard.php这指向正在访问的资源,可以是文件或文件夹。如果未指定 path,则服务器返回默认索引(例如 )。index.html
Query String?login=true查询字符串以问号 () 开头,由参数(例如 )和值(例如 )组成。多个参数可以用 & 符号 () 分隔。?logintrue&
Fragments#status客户端上的浏览器会处理片段,以查找主资源中的部分(例如,页面上的标题或部分)。

并非所有组件都需要访问资源。主要的必填字段是 scheme 和 host,没有它们,请求将没有可请求的资源。


HTTP 流

!https://academy.hackthebox.com/storage/modules/35/HTTP_Flow.png

上图在非常高的级别上展示了 HTTP 请求的剖析。用户第一次在浏览器中输入 URL () 时,它会向 DNS(域名解析)服务器发送请求以解析域并获取其 IP。DNS 服务器查找 IP 地址并返回该地址。所有域名都需要以这种方式解析,因为服务器在没有 IP 地址的情况下无法通信。inlanefreight.cominlanefreight.com

注意:我们的浏览器通常首先在本地 ‘’ 文件中查找记录,如果其中不存在请求的域,那么它们会联系其他 DNS 服务器。我们可以使用 ‘’ 手动添加记录以进行 DNS 解析,方法是添加 IP 后跟域名。/etc/hosts/etc/hosts

一旦浏览器获得链接到所请求域的 IP 地址,它就会向默认 HTTP 端口(例如 )发送 GET 请求,询问根路径。然后,Web 服务器接收请求并对其进行处理。默认情况下,服务器配置为在收到请求时返回索引文件。80//

在这种情况下,Web 服务器将读取 的内容并将其作为 HTTP 响应返回。响应还包含状态代码(例如 ),表示请求已成功处理。然后,Web 浏览器呈现内容并将其呈现给用户。index.html200 OKindex.html

注意:本模块主要关注 HTTP Web 请求。有关 HTML 和 Web 应用程序的更多信息,您可以参考 Web 应用程序简介模块。


卷曲

在本模块中,我们将通过任何 Web 渗透测试人员的两个最重要的工具发送 Web 请求,即 Web 浏览器(如 Chrome 或 Firefox)和命令行工具。cURL

cURL(客户端 URL)是一个命令行工具和库,主要支持 HTTP 以及许多其他协议。这使它成为脚本和自动化的良好候选者,因此对于从命令行发送各种类型的 Web 请求至关重要,这对于许多类型的 Web 渗透测试都是必需的。

我们可以将基本 HTTP 请求用作 cURL 的参数,将其发送到任何 URL,如下所示:

超文本传输协议 (HTTP)

1
2
3
4
DeviLeo@htb[/htb]$ curl inlanefreight.com<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...SNIP...

我们看到,与 Web 浏览器不同,cURL 不会呈现 HTML/JavaScript/CSS 代码,而是以原始格式打印它。但是,作为渗透测试人员,我们主要对请求和响应上下文感兴趣,它通常比 Web 浏览器更快、更方便。

我们还可以使用 cURL 下载页面或文件,并使用标志将内容输出到文件中。如果我们想指定输出文件名,我们可以使用 flag 并指定名称。否则,我们可以使用 cURL 将使用远程文件名,如下所示:-O-o-O

超文本传输协议 (HTTP)

1
2
DeviLeo@htb[/htb]$ curl -O inlanefreight.com/index.htmlDeviLeo@htb[/htb]$ lsindex.html

正如我们所看到的,这次输出没有打印出来,而是保存到 中。我们注意到 cURL 在处理请求时仍然打印了一些状态。我们可以使用 flag 将状态静音,如下所示:index.html-s

超文本传输协议 (HTTP)

1
DeviLeo@htb[/htb]$ curl -s -O inlanefreight.com/index.html

这一次,cURL 没有打印任何内容,因为输出已保存到文件中。最后,我们可以使用该标志来查看我们可以对 cURL 使用哪些其他选项:index.html-h

超文本传输协议 (HTTP)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DeviLeo@htb[/htb]$ curl -hUsage: curl [options...] <url>
 -d, --data <data>   HTTP POST data
 -h, --help <category> Get help for commands
 -i, --include       Include protocol response headers in the output
 -o, --output <file> Write to file instead of stdout
 -O, --remote-name   Write output to a file named as the remote file
 -s, --silent        Silent mode
 -u, --user <user:password> Server user and password
 -A, --user-agent <name> Send User-Agent <name> to server
 -v, --verbose       Make the operation more talkative

This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.
Use the user manual `man curl` or the "--help all" flag for all options.
本文由作者按照 CC BY 4.0 进行授权