详解 CTF Web 中的快速反弹 POST 请求鹏越·学霸专区

温馨提示:文中部分图片可点击放大后查看

前言

在 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 —— 天下武功唯快不破

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180105B0K9L800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券