配置web服务端对https进行抓包

打印 上一主题 下一主题

主题 799|帖子 799|积分 2397

之前提到可以抓取欣赏器发起的 https 哀求包,有时候需要抓取服务器端发起的 https 哀求包
例如对于一个巨大的 web 项目,怎么抓取服务端中主动发起的 https 哀求呢?
检查版本支持

这里以 phpstudy 为例,当在 php 代码主动发起一个 https 哀求,那么其执行路径是
php代码 --> curl 组件(C代码) --> openssl(C代码)
在站点下增加一个 phpinfo.php 文件
  1. <?php
  2. phpinfo();
复制代码
访问 phpinfo 地址,检察使用的 openssl 版本支持环境

SSLKEYLOGFILE 在 OpenSSL 1.1.1 以及更高的版本中引入的,因此该版本是支持 https 报文抓包的
对 SSLKEYLOGFILE 的配置 ,可以参考 https://blog.csdn.net/weixin_53109623/article/details/145132550
测试抓包环境

通过进程列表可以知道,在 phpstudy 中是使用 php-cgi 执行 php 脚本的

新建一个 test_ssl.php 文件,输入以下内容,使用 php-cgi -f test_ssl.php 直接执行脚本
发现 SSLKEYLOGFILE 文件可以被正常写入 TLS 加密密钥信息的
但是将该文件放置于站点的目次下,使用欣赏器的方式进行访问,SSLKEYLOGFILE 文件并没有被写入加密密钥信息
  1. <?php
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, "https://www.baidu.com");
  4. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  5. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  // 禁用 SSL 验证(用于调试)
  6. curl_exec($ch);
  7. curl_close($ch);
复制代码
问题分析

由于出于安全考虑,apache 在启动子进程的时候,并没有将所有的环境变量传递给 php-cgi 子进程
通过 phpinfo.php 页面中,可以检察到,仅有有限的部分环境变量别传给了子进程
这里通过欣赏器访问 test_ssl.php 的哀求抓包,需要的 SSLKEYLOGFILE 环境变量就没有传给子进程

配置抓包

在 apache 的配置环境变量传递给子进程有两种方式,分别是 SetEnv/PassEnv 以及 FcgidInitialEnv
SetEnv/PassEnv 传递环境变量

在 apache 的配置文件 httpd.conf 中末了增加配置,然后重启 apache 见效
  1. SetEnv SSLKEYLOGFILE C:\\SSL\\KEY.LOG
复制代码
欣赏器哀求 phpinfo 页面,显示传递的环境变量出现在 PHP Variables 的 $_ENV 数组中

$_ENV 存储的值是 php 中的环境变量,可以被 php 代码的 getenv 函数辨认出来
但是这个是 php 中的环境变量,只在 php 环境中有用,并不能被底层 C 代码辨以为体系环境变量
底层 C 代码使用的是体系函数 GetEnvironmentVariable 获取到环境变量,因此该设置对 C 代码是无效的
FcgidInitialEnv 传递环境变量

在 apache 的配置文件 httpd.conf 中末了增加配置,然后重启 apache 见效
  1. FcgidInitialEnv SSLKEYLOGFILE "C:\\SSL\\KEY.LOG"
复制代码
欣赏器哀求 phpinfo 页面,显示传递的环境变量出现在 Environmnet 的记载中

这种方式配置传递的环境变量,可以被 C 代码正确辨认,因此哀求 test_ssl.php 页面时密钥信息被正确写入
子进程的环境变量

当一个进程启动的时候,main 方法的的署名有三个参数,envp 参数表现环境变量
如果不做特殊设置的话,envp 的值就是体系环境变量的集合
  1. int main(int argc, char *argv[], char *envp[]) {
  2.     ...
  3. }
复制代码
当父进程通过 CreateProcess 创建子进程的时候,可以通过第 7 个参数来控制环境变量
NULL 表现继承父进程的所有环境变量,否则就是指定有限的环境变量传递给子进程
  1.     // 调用CreateProcess来创建子进程
  2.     if (CreateProcess(
  3.             NULL,               // 应用程序路径
  4.             "child_program",     // 子进程的命令行
  5.             NULL,               // 进程安全属性
  6.             NULL,               // 线程安全属性
  7.             FALSE,              // 是否继承父进程的句柄
  8.             CREATE_NEW_CONSOLE, // 启动新控制台
  9.             NULL,               // 子进程的环境变量(NULL表示继承父进程的环境变量)
  10.             NULL,               // 当前工作目录
  11.             &si,                // 启动信息
  12.             &pi                 // 进程信息
  13.         )) {
  14.         printf("子进程创建成功\n");
  15.     } else {
  16.         printf("子进程创建失败: %d\n", GetLastError());
  17.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表