OIer 的 CTF Web 基础知识学习笔记

由于某些原因某 OIer 零基础学习 CTF 被打爆了 QWQ

本文一切例题均可在 CTFHub 找到。

HTTP 请求方式

HTTP 是一种协议,定义了客户端和服务端的请求规范。HTTP 默认使用 80 端口指向服务,而 HTTPS 协议的默认端口为 443。

HTTP 有下表中的八种方法:

方法 描述
GET 请求获取指定页面的实体数据
HEAD 请求获取指定页面的头信息
POST 向指定资源提交数据进行数据请求
PUT 传输数据取代指定文档的内容
DELETE 请求删除指定页面
OPTIONS 允许查看服务器性能
TRACE 返回服务器收到的请求

例题

题目地址:CTFHub -> 技能树 -> Web -> Web 前置技能 -> HTTP 协议 -> 请求方式

翻译一下题意。这道题指定了新的 HTTP 方法 CTFHUB,要求我们使用 CTFHUB 方法获得 flag。

curl 介绍

该题可在终端中使用 curl 指令获取 flag。curl 是一个终端中请求 Web 服务器的工具。常用方法如下表(无参数时直接返回网页源码):

参数 描述
-i 额外获取头信息
-I 仅获取头信息
-v 获取更为详细的信息
-X <command> 指定 <command> 命令
-L HTTP 请求跟随重定向(curl 默认不重定向)

这道题使用 curl 情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
xenonwzh@XenonWZH-Surface:~$ curl -v -X CTFHUB http://challenge-XXX.sandbox.ctfhub.com:XXXXX/index.php
* Trying XXX.XXX.XXX.XXX:XXXXX...
* TCP_NODELAY set
* Connected to challenge-XXX.sandbox.ctfhub.com (XXX.XXX.XXX.XXX) port XXXXX (#0)
> CTFHUB /index.php HTTP/1.1
> Host: challenge-XXX.sandbox.ctfhub.com:XXXXX
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: openresty/1.19.3.2
< Date: Sat, 21 Jan 2023 14:05:43 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: PHP/5.6.40
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Headers: X-Requested-With
< Access-Control-Allow-Methods: *
<
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>CTFHub HTTP Method</title>
</head>
<body>

good job! ctfhub{XXXXXX}

</body>
</html>
* Connection #0 to host challenge-XXX.sandbox.ctfhub.com left intact

于是我们就可以获取 flag 了。

HTTP 302 跳转(临时重定向)

当服务器无法处理收到的请求时,服务器会告诉浏览器跳转到一个可以处理该请求的 URL 上。重定向的返回码为 3XX。Location 相应首部包含了内容新地址或者优先地址的 URL。

返回码的意义如下表:

返回码 意义
301 请求的 URL 已被移除时使用,Location 首部包含所在资源的 URL(永久性转移)
302 该请求 URL 转移,将来的请求仍使用老的 URL,Location 首部给出 URL 临时定位资源(暂时性转移)

例题

题目地址:CTFHub -> 技能树 -> Web -> Web 前置技能 -> HTTP 协议 -> 302 跳转

我们可以通过开发工具 -> 网络中找到状态为 302 的链接。

使用 curl 可以看到这个链接中因重定向而没看到的内容(curl 默认不跟随重定向)。

于是我们可以得到下列信息:

1
2
xenonwzh@XenonWZH-Surface:~$ curl http://challenge-XXX.sandbox.ctfhub.com:XXXXX/index.php
ctfhub{XXXXXX}

于是就获得了 flag。

Cookie

Cookie 是浏览器存储在本地的一种数据,可让服务器确定当前请求的用户的身份。Cookie 数据量一般不超过 4KB,所以 Cookie 只能存储少量数据。

例题

题目地址:CTFHub -> 技能树 -> Web -> Web 前置技能 -> HTTP 协议 -> Cookie

题意翻译一下即使用 admin 登录获取 flag。

brupsuite

brupsuite 是一个渗透测试工具,且 Kali Linux 自带。这个工具可以抓包改包。使用这个工具,我们首先需要在浏览器中设置 HTTP 代理为 127.0.0.1:8080,开启工具后我们点击 Proxy -> Intercept -> Intercept is on 即可拦截请求。该题网站的请求如下:

于是我们只需要修改 admin=1,然后点击 Forward 完成改包,就修改了 Cookie 中的 admin 项了。于是我们就可以在网站上看到 flag 了(看不到刷新即可)。

HTTP 基本认证

在 HTTP 中,HTTP 基本认证是允许 HTTP 用户代理(如浏览器)在请求时,提供用户和密码的一种方式。

在认证时,请求的 HTTP 头字段会包含 Authorization: Basic <凭证> 的信息。凭证为用户名和密码组合的 base64 编码。

例题

题目地址:CTFHub -> 技能树 -> Web -> Web 前置技能 -> HTTP 协议 -> 基本认证

本题要求登录 admin 账户以获取 flag,且提供了可能的多种密码。

我们可以先用 brupsuit 抓个包,抓包方法同上一题。输入密码后我们可以看到 Authorization :Basic XXX 数据,且 XXX 为 base64 编码。我们将其解码可发现 admin:<密码> 的字样,这正是我们需要爆破的地方。我们可以点击 Action -> Send to Intruder 将数据传至测试器。

于是我们可在测试器中选择要爆破的数据,选择数据后点击 Add,方法如下图:

接着我们点 Payloads 选择需要爆破的内容。在 Payload Options 可以添加爆破的字符串的字典,例如这里可能的密码。在 Paylod Processing 可添加爆破的过程,例如这里我们可以选择添加 admin: 前缀,将整个字符串使用 base64 加密。操作效果如下图:

最后点击 Start attack 即可爆破。爆破完成后状态码为 200 的请求即使用了正确的密码。于是我们选择状态 200 的请求,提取出其中被 base64 加密的密码,解密输入网站中即可获得 flag。获得的请求如下图:

HTTP 响应包源代码

没啥好讲的,浏览器直接按 F12 或右键 -> 查看网页源代码即可看到源代码。

例题

题目地址:CTFHub -> 技能树 -> Web -> Web 前置技能 -> HTTP 协议 -> 响应包源代码

直接在浏览器中按 F12 即可看到 flag。情况如下图: