温馨提示:文中部分图片可点击放大后查看
前言
在 CTF Web 的基础题中,经常出现一类题型:在 HTTP 响应头获取了一段有效期很短的 key 值后,需要将经过处理后的 key 值快速 POST 给服务器,若 key 值还在有效期内,则服务器返回最终的 flag,否则继续提示“请再加快速度!!!”
如果还执着于手动地获取 key 值,复制下来对其进行处理,最后用相应的工具把 key 值 POST 给服务器,那么对不起,因为 key 值的有效期一般都在 1 秒左右,除非有单身一百年的手速,否则不要轻易尝试。显然,这类题不是通过纯手工完成的,幸好 Python 提供了简单易用、功能强大的 HTTP 第三方开源库 Requests,帮助我们轻松解决关于 HTTP 的大部分问题。
1
Python Requests
关于 Requests 库的详细功能请见官方文档,本文只列出解题中需要用到的部分功能。安装并导入 requests 模块
在安装了 Python 的终端下输入以下命令安装 requests:
安装完使用以下命令导入 requests:
发送 GET 请求与 POST 请求
以 Github 官网为例,对其发起 GET 请求;
对其发起 POST 请求:
查看请求头
对 Github 官网发起请求,以查看 GET 请求的请求头为例,POST 请求同理:
查看请求头的某一属性:
查看响应头
对 Github 官网发起请求,以查看 GET 请求的响应头为例,POST 请求同理:
查看响应头的某一属性:
查看响应内容
对 Github 官网发起请求,查看服务器返回页面的内容,以查看 GET 请求的响应内容为例,POST 请求同理:
传递 GET 请求参数
GET 请求参数作为查询字符串附加在 URL 末尾,可以通过 方法中的 参数完成。例如,我要构建的 URL 为 ,则可以通过以下代码传递 GET 请求参数:
其中 参数是 类型变量。可以看到,带有请求参数的 URL 确实构造好了,不过注意,这里的 和 是为了说明问题任意构造的,传入 Github 官网后不起作用,下同。
传递 POST 请求参数
POST 请求参数以表单数据的形式传递,可以通过 方法中的 参数完成,具体代码如下:
其中 参数也是 类型变量。由于 POST 请求参数不以明文展现,在此省略验证步骤。
传递 Cookie 参数
如果想传递自定义 Cookie 到服务器,可以使用 参数。以 POST 请求为例向 Github 官网提交自定义 Cookie( 参数同样适用于 GET 请求):
其中 参数也是 类型变量。可以看到,POST 请求的请求头中确实包含了自定义 Cookie。
会话对象 Session()
Session 是存储在服务器上的相关用户信息,用于在有效期内保持客户端与服务器之间的状态。Session 与 Cookie 配合使用,当 Session 或 Cookie 失效时,客户端与服务器之间的状态也随之失效。
有关 Session 的原理可参见以下文章:
session的根本原理及安全性
Session原理
requests 模块中的 会话对象 Session() 能够在多次请求中保持某些参数,使得底层的 TCP 连接将被重用,提高了 HTTP 连接的性能。
Session() 的创建过程如下:
在有效期内,同一个会话对象发出的所有请求都保持着相同的 Cookie,可以看出,会话对象也可以通过 与 方法发送请求,以发送 GET 请求为例:
2
Writeups
介绍完 requests 模块的基本使用方法,下面借助几道题来分析讲解。另外,在 HTTP 响应头中获取的 key 值通常是经过 base64 编码的,所以还需要引入內建模块 base64 用于解码。以下代码均在 Python 3.6 环境下运行。
【实验吧 CTF】 Web —— 天下武功唯快不破
领取专属 10元无门槛券
私享最新 技术干货