【笔记】CSE 365 - Fall 2024之Talking Web(pwn.college)
【入门笔记】CSE 365 - Fall 2024之Talking Web(pwn.college)
level1 使用 curl 发送 HTTP 请求
curl
是一个用于在命令行中与网络进行交互的工具,支持多种协议,如 HTTP、HTTPS、FTP 等。它可以用来发送 GET、POST 等请求,下载文件,上传数据,甚至处理 API 调用。由于其灵活性和广泛的支持,curl
常用于开发和调试网络应用。
查看解析
curl 127.0.0.1
使用`curl`向本地服务器(即127.0.0.1)发送一个 HTTP GET 请求
level2 使用 nc 发送 HTTP 请求
nc
(Netcat)是一个功能强大的网络工具,用于进行网络连接和调试。它可以在 TCP 和 UDP 协议下进行数据传输,常用于以下用途:
- 网络调试:测试网络连接和服务是否可用。
- 数据传输:在两台计算机之间发送和接收数据。
- 端口扫描:检查目标主机上的开放端口。
- 简单的聊天:在两台计算机之间建立一个简单的聊天会话。
nc
通常被称为“瑞士军刀”的网络工具,因为它具有多种功能和灵活性。
查看解析
nc 127.0.0.1 80
GET / HTTP/1.1
使用`nc`尝试连接到本地计算机(127.0.0.1)的80端口
并构造HTTP GET请求包
level3 使用 python 发送 HTTP 请求
在 Python 中,可以使用 requests
库来发送 HTTP 请求
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1') # 发送 GET 请求到指定的地址
print(response.text) # 打印响应的文本内容
level4 使用 curl 在 HTTP 请求中设置主机标头
主机标头(Host Header)是 HTTP 请求中的一个重要字段,指定了请求的目标服务器的主机名和端口。其主要作用包括:
- 虚拟主机支持:许多 Web 服务器(如 Apache 和 Nginx)可以在同一 IP 地址上托管多个网站。主机标头帮助服务器识别并返回正确的网站内容。
- SEO 和流量分析:主机标头可以用于网站的搜索引擎优化(SEO)和流量分析,以确定请求是针对哪个域名。
- 路由请求:一些反向代理和负载均衡器使用主机标头来路由请求到适当的后端服务器。
主机标头的格式为:
Host: example.com
在 HTTP/1.1 规范中,主机标头是必需的,服务器必须能够处理并解析该标头。
查看解析
curl -H "Host:" 127.0.0.1
使用`-H`参数对127.0.0.1发送的 HTTP GET 请求添加提示给出的主机标头
level5 使用 nc 在 HTTP 请求中设置 host 标头
查看解析
nc 127.0.0.1 80
GET / HTTP/1.1
Host:
level6 使用 python 在 HTTP 请求中设置主机标头
查看解析
vim nihao.py
import requests # 导入 requests 库,用于发送 HTTP 请求
headers = {
'Host': 'your-custom-host.com'
} # 自定义主机标头
response = requests.get('http://127.0.0.1', headers=headers) # 发送 GET 请求,包含自定义主机标头
print(response.text) # 打印响应的文本内容
level7 使用 curl 在 HTTP 请求中设置路径
在 HTTP 请求中,设置路径指的是指定要访问的资源的 URL 路径。URL 通常由多个部分组成,包括协议、主机、端口和路径。例如:
http://www.example.com/path/to/resource
在这个 URL 中:
- 协议:
http
或https
,表示使用的传输协议。 - 主机:
www.example.com
,表示服务器的域名或 IP 地址。 - 路径:
/path/to/resource
,指向服务器上具体的资源或页面。
作用:
- 资源定位:路径帮助服务器确定客户端请求的是哪个资源,比如网页、图片、API 端点等。
- 动态内容:某些路径可能与参数相关,服务器可以根据路径生成动态内容。例如,
/users/123
可能表示获取用户 ID 为 123 的用户信息。 - RESTful API:在 RESTful API 中,路径通常代表特定的资源和操作,如
/products
表示产品集合,而/products/1
表示特定产品。
设置正确的路径对于确保请求返回所需数据至关重要。
查看解析
curl 127.0.0.1/flag
level8 使用 nc 在 HTTP 请求中设置路径
查看解析
nc 127.0.0.1 80
GET /flag HTTP/1.1
level9 使用 python 在 HTTP 请求中设置路径
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1/flag') # 发送 GET 请求,包含自定义主机标头
print(response.text) # 打印响应的文本内容
level10 使用 curl 对 HTTP 请求中的路径进行 URL 编码
URL 编码(也称为百分号编码)是一种将特定字符转换为在 URL 中安全可传输格式的过程。它确保 URL 只包含可识别的字符,因为某些字符在 URL 中具有特殊意义或不允许出现。以下是 URL 编码的一些关键点:
目的
- 安全传输:确保 URL 在传输过程中不会被误解或破坏,特别是包含特殊字符时。
- 避免冲突:处理空格、斜杠、问号、井号等特殊字符,避免与 URL 的结构冲突。
编码规则
-
在 URL 中,特殊字符会被替换为
%
后跟其 ASCII 码的十六进制表示。例如:
- 空格(
%20
- 斜杠(
/
)编码为%2F
- 问号(
?
)编码为%3F
- 和符号(
&
)编码为%26
- 空格(
常见情况
- 路径参数:在 URL 的路径中包含空格或其他特殊字符。
- 查询字符串:在 GET 请求中,URL 编码用于构建查询参数,例如
?key=value
。
使用
- 在构建 URL 时,确保路径和查询参数中的特殊字符进行适当编码。很多编程语言和库(如 Python 的
urllib.parse
)提供了自动编码的功能。
解码
- URL 解码是将编码后的 URL 恢复为原始形式的过程,通常用于解析接收到的 URL。
URL 编码是确保 Web 应用和 API 正常工作的基础,特别是在处理用户输入时。
查看解析
curl 127.0.0.1/flag%20
level11 使用 nc 对 HTTP 请求中的路径进行 URL 编码
查看解析
nc 127.0.0.1 80
GET /flag%20 HTTP/1.1
level12 使用 python 对 HTTP 请求中的路径进行 URL 编码
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1/flag%20') # 发送 GET 请求,包含自定义主机标头
print(response.text) # 打印响应的文本内容
level13 使用 curl 在 HTTP 请求中指定参数
在 HTTP 请求中,指定参数是指通过 URL 或请求体传递数据,以影响服务器对请求的响应。参数可以用于多种目的,如过滤数据、控制请求行为或传递用户输入。以下是一些关键点:
参数类型
- 查询参数:通常在 URL 中以键值对的形式出现,格式为
?key1=value1&key2=value2
。用于 GET 请求,传递附加信息给服务器。 - 路径参数:直接在 URL 的路径中指定,通常用于标识特定资源,如
/users/123
,这里123
是用户 ID。 - 请求体参数:在 POST、PUT 等请求中,数据包含在请求体中。可以以表单数据或 JSON 格式发送。
用途
- 过滤和排序:指定查询参数可以用来过滤结果或改变排序方式,例如
?sort=asc&filter=active
。 - 身份验证:传递令牌或 API 密钥以验证请求。
- 状态控制:向 API 发送参数来创建、更新或删除资源。
重要性
- 灵活性:参数允许客户端与服务器之间传递动态数据,使得 API 更加灵活。
- 安全性:通过参数可以限制用户访问特定资源,增强安全性。
编码
- 参数需要进行 URL 编码,以确保特殊字符(如空格、&、? 等)不会破坏 URL 的结构。
指定参数在 Web 开发和 API 设计中至关重要,使得客户端与服务器之间的交互更加有效和精确。
查看解析
curl 127.0.0.1/?flag=give
level14 使用 nc 在 HTTP 请求中指定参数
查看解析
nc 127.0.0.1 80
GET /?flag=give HTTP/1.1
level15 使用 python 在 HTTP 请求中指定参数
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1/?flag=give') # 发送 GET 请求,包含自定义主机标头
print(response.text) # 打印响应的文本内容
level16 使用 curl 在 HTTP 请求中指定多个参数
查看解析
curl "127.0.0.1/?flag=give&give=flag"
在没有引号的情况下,命令行会将 & 视为命令分隔符。导致命令被分成两部分,导致执行错误
level17 使用 nc 在 HTTP 请求中指定多个参数
查看解析
nc 127.0.0.1 80
GET /?flag=give&give=flag HTTP/1.1
level18 使用 python 在 HTTP 请求中指定多个参数
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1/?flag=give&give=flag') # 发送 GET 请求,包含自定义主机标头
print(response.text) # 打印响应的文本内容
level19 使用 curl 在 HTTP 请求中包含表单数据(POST请求)
表单数据是指在 Web 应用中通过 HTML 表单收集和提交的信息。这些数据通常用于用户输入,如注册、登录、搜索等。以下是表单数据的一些关键点:
表单的构成
- 输入字段:用户可以填写的数据字段,如文本框、下拉菜单、复选框等。
- 提交按钮:用于提交表单数据到服务器的按钮。
数据格式
- 表单编码类型:表单数据在提交时可以有不同的编码格式:
application/x-www-form-urlencoded
:默认格式,数据以key=value
的形式编码,多个字段用&
分隔。multipart/form-data
:用于上传文件时使用,允许发送文件和文本字段。application/json
:用于发送 JSON 数据。
请求方式
- 表单数据通常通过 HTTP 请求的 POST 或 GET 方法提交:
- GET:将数据附加在 URL 查询字符串中,适用于小量数据。
- POST:将数据放在请求体中,适用于较大或敏感数据。
使用场景
- 用户注册:收集用户信息,如姓名、电子邮件和密码。
- 搜索功能:收集用户搜索关键词。
- 设置配置:用户可通过表单提交设置或偏好。
安全性
- 处理表单数据时,需要注意数据验证和防止跨站请求伪造(CSRF)等安全问题。
表单数据是 Web 应用与用户交互的重要方式,理解其构成和用法有助于构建更好的用户体验。
查看解析
curl -X POST -d "flag=give" 127.0.0.1
使用`-X`修改对127.0.0.1发送的 HTTP 请求方式,使用`-d`设置表单数据
level20 使用 nc 在 HTTP 请求中包含表单数据
查看解析
nc 127.0.0.1 80
POST / HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded #一种常见的 MIME 类型,用于表示表单数据的编码格式
Content-Length: <数据长度>
`空行`
flag=give
level21 使用 python 在 HTTP 请求中包含表单数据
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.post('http://127.0.0.1',data={'flag':'give'}) # 发送 POST 请求,包含表单数据
print(response.text) # 打印响应的文本内容
level22 使用 curl 在 HTTP 请求中包含具有多个字段的表单数据
查看解析
curl -X POST -d "flag=give&give=flag" 127.0.0.1
使用`-X`修改对127.0.0.1发送的 HTTP 请求方式,使用`-d`设置表单数据
level23 使用 nc 在 HTTP 请求中包含具有多个字段的表单数据
查看解析
nc 127.0.0.1 80
POST / HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: <数据长度>
`空行`
flag=give&give=flag
level24 使用 python 在 HTTP 请求中包含具有多个字段的表单数据
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.post('http://127.0.0.1',data={'flag':'give'}) # 发送 POST 请求,包含表单数据
print(response.text) # 打印响应的文本内容
level25 使用 curl 在 HTTP 请求中包含 json 数据
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于客户端与服务器之间的数据传输。以下是 JSON 数据的一些关键点:
格式
- 结构:JSON 数据由键值对组成,键是字符串,值可以是字符串、数字、布尔值、数组、对象或
null
。 - 语法:
- 对象用大括号
{}
包裹,键值对用逗号,
分隔。 - 数组用方括号
[]
包裹,值用逗号,
分隔。
- 对象用大括号
示例
以下是一个典型的 JSON 数据示例:
json复制代码{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "New York"
},
"graduationYear": null
}
特点
- 易读性:JSON 格式清晰简洁,易于人类阅读和编写。
- 语言无关性:JSON 数据格式与编程语言无关,许多编程语言(如 Python、JavaScript、Java 等)都支持 JSON 的解析和生成。
- 轻量级:相比 XML,JSON 数据通常更小,减少了网络传输的开销。
用途
- API 数据交换:在 Web API 中,JSON 是最常用的数据格式之一,用于请求和响应数据。
- 配置文件:许多应用程序使用 JSON 格式的配置文件,因为它易于理解和编辑。
- 数据存储:一些 NoSQL 数据库(如 MongoDB)使用 JSON 格式存储数据。
安全性
- 在处理 JSON 数据时,需要注意数据验证和安全性,防止注入攻击和其他潜在风险。
JSON 数据因其简洁、灵活和易用性而广泛应用于现代 Web 开发中。
查看解析
curl -X POST -H "Content-Type: application/json" -d '{"flag":"give"}' 127.0.0.1
使用`-H`参数对127.0.0.1发送的 HTTP POST 请求添加Content-Type头
`Content-Type: application/json`用于表示传输的数据格式为 JSON
level26 使用 nc 在 HTTP 请求中包含 json 数据
查看解析
nc 127.0.0.1 80
POST / HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
Content-Length: <数据长度>
`空行`
{"flag":"give", "give":"flag", "pwn":"college"}
level27 使用 python 在 HTTP 请求中包含 json 数据
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.post('http://127.0.0.1',json={'flag':'give'}) # 发送 POST 请求,包含json数据
print(response.text) # 打印响应的文本内容
level28 使用 curl 在 HTTP 请求中包含复杂的 json 数据
查看解析
curl -X POST -H "Content-Type: application/json" -d '{
"flag": "give",
"give": "flag",
"pwn": "college",
"nihaoma": ["nihaoa", "wobuhao", "gun"],
"tianqibucuo": {
"ni": "jin wan yue se zhen mei",
"wo": "wo xi huan ni ni xi huan wo"
}
}' 127.0.0.1
按着这个格式来就行
level29 使用 nc 在 HTTP 请求中包含复杂的 json 数据
查看解析
nc 127.0.0.1 80
POST / HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
Content-Length: <数据长度>
`空行`
{
"flag": "give",
"give": "flag",
"pwn": "college",
"nihaoma": ["nihaoa", "wobuhao", "gun"],
"tianqibucuo": {
"ni": "jin wan yue se zhen mei",
"wo": "wo xi huan ni ni xi huan wo"
}
}
level30 使用 python 在 HTTP 请求中包含复杂的 json 数据
查看解析
vim nihao.py
import requests # 导入 requests 库,用于发送 HTTP 请求
json={
"flag": "give",
"give": "flag",
"pwn": "college",
"nihaoma": ["nihaoa", "wobuhao", "gun"],
"tianqibucuo": {
"ni": "jin wan yue se zhen mei",
"wo": "wo xi huan ni ni xi huan wo"
}
} #定义json数据
response = requests.post('http://127.0.0.1',json=json) # 发送 POST 请求,包含json数据
print(response.text) # 打印响应的文本内容
level31 使用 curl 跟踪来自 HTTP 响应的 HTTP 重定向
HTTP 重定向是指服务器通过特定的 HTTP 响应状态码告知客户端(如浏览器或 API 客户端)请求的资源已被移动到另一个 URL。客户端接收到重定向响应后,会自动或手动向新的 URL 发起请求。
重定向状态码
常见的 HTTP 重定向状态码包括:
- 301 Moved Permanently:请求的资源已被永久移动到新 URL。
- 302 Found:请求的资源临时被移动到新 URL。
- 303 See Other:客户端应使用 GET 请求访问不同的 URL。
- 307 Temporary Redirect:临时重定向,客户端应使用相同的 HTTP 方法访问新 URL。
- 308 Permanent Redirect:永久重定向,客户端应使用相同的 HTTP 方法访问新 URL。
重定向的用途
- 网站结构变化:当网站重新组织内容或更改 URL 结构时,使用重定向保持访问的连续性。
- 域名更改:将旧域名的请求重定向到新域名。
- 资源迁移:将请求重定向到新的内容或页面,确保用户访问到最新的资源。
重定向的工作流程
- 客户端发起 HTTP 请求。
- 服务器返回重定向响应,包含新的 URL。
- 客户端根据响应中的 URL 发起新的请求。
- 服务器处理新的请求并返回最终资源。
注意事项
- SEO 影响:搜索引擎会处理重定向,但使用不当(如链式重定向)可能影响网站的 SEO 排名。
- 性能考虑:每次重定向都会增加延迟,因此应尽量减少重定向的数量。
HTTP 重定向是 Web 开发中常用的机制,帮助确保用户能够访问到所需的资源。
查看解析
curl -L 127.0.0.1
使用`-L`指示 curl 在遇到 HTTP 重定向(如 301、302 状态码)时自动跟随重定向并请求新地址
level32 使用 nc 跟踪 HTTP 响应的 HTTP 重定向
查看解析
nc 127.0.0.1 80
GET / HTTP/1.1
如果服务器返回重定向(如 301 或 302),响应中会包含 `Location` 头,指向新 URL
level33 使用 python 从 HTTP 响应跟踪 HTTP 重定向
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1') # 发送 GET 请求到指定的地址
print(response.text) # 打印响应的文本内容
level34 使用 curl 包含来自 HTTP 响应的 Cookie
Cookie 是由服务器发送并存储在客户端(通常是浏览器)上的小数据块,用于跟踪用户的会话和存储用户的偏好设置。以下是关于 Cookie 的一些关键点:
作用
- 会话管理:用于跟踪用户的登录状态和会话,例如识别已登录用户。
- 个性化:存储用户的偏好设置和个性化信息,例如语言选择和主题设置。
- 分析和跟踪:帮助网站分析用户行为,提供更好的用户体验。
结构
Cookie 通常包含以下信息:
- 名称:Cookie 的名称。
- 值:与名称相关的值。
- 过期时间:Cookie 的有效期,过期后将被删除。
- 路径:指定 Cookie 可以访问的 URL 路径。
- 域:指定 Cookie 的作用域,可以在该域下的所有子域中使用。
- 安全标志:指示 Cookie 是否仅通过 HTTPS 传输。
类型
- 会话 Cookie:临时存储,浏览器关闭时删除。
- 持久 Cookie:具有指定过期时间,存储在用户设备上,直到过期或手动删除。
- 第三方 Cookie:由不同于当前访问网站的域设置,常用于广告和追踪。
使用示例
当用户登录网站时,服务器可以发送一个 Cookie,例如:
Set-Cookie: sessionId=abc123; Expires=Wed, 21 Oct 2024 07:28:00 GMT; Path=/; HttpOnly
用户的浏览器会在后续请求中自动包含这个 Cookie:
Cookie: sessionId=abc123
隐私与安全
- 隐私问题:Cookie 可以用于跟踪用户行为,引发隐私担忧。
- 安全性:使用
Secure
和HttpOnly
标志可以增强 Cookie 的安全性,防止被跨站脚本(XSS)攻击。
Cookie 是 Web 开发中的重要组成部分,理解其工作原理有助于更好地管理用户会话和个性化体验。
查看解析
curl -c cookies.txt 127.0.0.1
curl -b cookies.txt 127.0.0.1
使用`-c`指示 curl 将服务器返回的 Cookie 保存到 cookies.txt 文件中
使用`-b`指示 curl 使用 cookies.txt 文件中的 Cookie
level35 使用 nc 包含来自 HTTP 响应的 Cookie
查看解析
nc 127.0.0.1
GET / HTTP/1.1
Cookie: cookie=flag
服务器响应中会包含 `Set-Cookie` 头中包含Cookie的值
level36 使用 python 从 HTTP 响应中包含 Cookie
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1') # 发送 GET 请求到指定的地址
print(response.text) # 打印响应的文本内容
cookies = response.cookies # 获取 Cookie
response_with_cookies = requests.get('http://127.0.0.1', cookies=cookies) # 使用获取的 Cookie 发送后续请求
print(response_with_cookies.text) # 打印后续请求的响应内容
level37 使用 curl 发出多个请求以响应有状态 HTTP 响应
查看解析
curl -L --cookie /tmp/cookie 127.0.0.1
`--cookie /tmp/cookie`指示 curl 使用位于 /tmp/cookie 文件中的 Cookie
`/tmp/cookie`这个文件应该包含之前从服务器获取并保存的 Cookie 数据
level38 使用 nc 发出多个请求以响应有状态 HTTP 响应
查看解析
nc 127.0.0.1
GET / HTTP/1.1
Cookie: cookie=flag
服务器响应中会包含 `Set-Cookie` 头中包含Cookie的值
level39 使用 python 发出多个请求以响应有状态 HTTP 响应
查看解析
python
import requests # 导入 requests 库,用于发送 HTTP 请求
response = requests.get('http://127.0.0.1') # 发送 GET 请求到指定的地址
print(response.text) # 打印响应的文本内容
cookies = response.cookies # 获取 Cookie
response_with_cookies = requests.get('http://127.0.0.1', cookies=cookies) # 使用获取的 Cookie 发送后续请求
print(response_with_cookies.text) # 打印后续请求的响应内容