918-接口测试DAY2-课程

今日授课安排

  1. 上午课前练习+上周postman知识回顾
  2. 上午学习charles的安装和使用
  3. 下午练习charles工具 mock的使用,抓取并改写Web请求和App请求

charles的安装和使用

charles 工具安装使用教程

安装

官方地址

在上述网页中,点击DOWNLOAD ->然后选择对应的系统(win,mac,linux)进行下载即可。

下载后安装程序后,不停点击next,该acceptaccept

,没有什么坑,注意更改一下安装路径即可。

激活(此处不方便公开展示)

劳烦各位自己努努力,找到激活法子。然后打开安装好的Charles,点击HELP->Registered to bobo->将激活密钥输入即可

配置charles(代理所需)

  1. 安装证书且信任
  2. HELP->SSL Proxying->Install Charles Root Certificate
  3. 点击后会自动下载证书文件,找到证书文件,双击进行安装,并且在安装过程中,注意将证书存储在所有的证书都放入下列存储->选择受信任的根证书颁发机构然后就完全导入了。
  4. 验证:重新打开Charles,然后Help->SSL Proxying->Install Charles Root Certificate查看证书结果,成功则在证书状态中显示:该证书没有问题
  5. 配置SSL,保证可以抓取https协议请求
  6. Proxy->SSL Proxying Settings选中后会出现一个框
  7. 选择SSL Proxying,勾选Enable SSL Proxying,在Include部分下方选中Add添加*:* 即点击add后会出现一个框,填写HOST:* 然后PORT:*,然后就点击OK,出现的效果就是*:*
  8. 配置代理端口:Proxy->Proxy Settings->选择Proxies 里面内容填写:Port:8889,可以勾选下面的Support HTTP/2和eNable transparent HTTP proxying
  9. 自此,Win端的charles的配置都没问题了,应该是可以正常抓取https请求了

配置charles(mac系统)

  1. 安装证书:Proxy->macOS Proxy,然后后续操作和win类似,需要注意一下证书的安装和导入

Charles的使用

各功能按钮的介绍

工具栏

  1. 类似扫把:清空请求
  2. 第二个:类似一个开关:record:开始抓包
  3. 第三个:类似一个锁:开始或停止SSL代理
  4. 第四个:类似一朵黑云:模拟弱网环境
  5. 第五个:类似一个多边形:debug,允许打断点的开关
  6. 第六个:类似一支笔:修改请求
  7. 第七个:类似一个刷新图标:重新请求
  8. 第八个:一个:heavy_check_mark::看名称像是检验响应response
  9. 第九个:工具:tool
  10. 第十个:类似齿轮:setting

Charles 下设置SSL代理

位置Proxy->Proxy Settings

作用: 设置监听的端口,端口号可随意设置,尽量选择无冲突端口

位置: Proxy->SSL Proxying Settings

作用: 启用SSL代理,添加监听规则,其中[.]代表监听所有IP地址的所有端口

位置: Help->SSL Proxying->install Charles Root Certificate

作用: 本地charles下载证书,这里注意导入的时候选择受信任的证书机构

位置Help->SSL Proxying->install Charles Root Certificate on a Mobile Device or Remote Browser

作用: 配置手机的charles证书,首先将手机的网络设置,添加手工代理,IP和端口号分别指向下图箭头。

web页面请求抓取

百度首页https://www.baidu.com

状况

  1. 点击工具栏第二个按钮和第三个按钮(开启抓包,开启代理,前者获取请求,后者进行中间人攻击)

  2. 没有出现乱码(CA证书无误)

  3. Filter里输入baidu.com用以筛选请求

Overview层:

  • 展示请求的服务器地址:hosthttps://www.baidu.com
  • 路由路径:path/
  • Notes:SSL Proxying enabled for this host 笔记
  • 协议:ProtocolsHTTP/1.1
  • Requests:请求数量:4 下面是请求状态数量:Completed:4 ,Incomplete:0
  • Timing:时间 :Start: 2024-9-11 14:34:26End:2024-09-11 14:34:28Duration:408ms
  • Size:请求大小:Requests:7.52KB

总结

总览请求的一些基本信息,有用的信息不多,比如host,path。

Summary层

  • 可以看到往这个地址访问时,触发了4个请求
  • 有路由/,有请求资源的,也有请求文档的。
  • 他们的mime Type分别是text/html text/plain image/gif application/xml

总结: 简述这个地址请求时触发的行动

Chart层

  • 下方出现筛选框:Timeline,Sizes,Duration,Type,Flow

  • Timeline:展示这个地址访问时触发的各个动作,并且展示动作的发生先后,时间占比

  • Sizes: 展示大小占比

  • Duration:持续时间

  • Types:展示的也是大小,只是不展示名称,而是以类型区分

  • Flow:一个奇怪的柱状图,展示各个请求,响应的耗时

选择Sequence板块

  • 筛选Filter:baidu.com
  • 勾选一个code200,host为www.baidu.com path为/ 的请求
  • 下面出现两重视图框:
  • 上层:
    • overview
    • 可抓到url,status,response code 状态码,协议protocol,请求方式method
    • 可抓到:媒体类型:Content-Type:text/html;chaset=utf-8``
    • Contents
    • Host
    • Connection
    • Cache-Control
    • sec-ch-ua-platform:Windows
    • User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0
    • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
    • Cookie:xxxxx
    • 上述是请求的Headers数据,还能看请求的cookies模块,Raw模块
    • 然后下面视图是响应体的视图,针对响应体也划分了几个模块:Headers,Set Cookie ,Text,Hex,Compressed,HTML,Raw

抓包京东商城,并且进行替换

  1. 打开京东商城:百度搜索京东
  2. 进入京东首页后,在搜索框中搜索电竞椅
  3. 进入搜索页面后,在charles中过滤:search,找到对应的请求
  4. 右键复制url
  5. 点击tool->Rewrite
  6. 勾选Enable Rewrite
  7. 点击下方的Add
  8. 填写Name,location 点击add
  9. 将刚刚复制到的url粘贴在Host里,然后点击一下空白处,就会将信息填写到其他地方。
  10. 注意这里的匹配规则估计不是全匹配,即有些url后缀是带有一些随机字符的查询参数,比如vd_source=123919n9a98e9128j9nziua,这种就不方便匹配,所以手动删除这部分的查询参数
  11. 查询参数中有中文,在框里会自动转为Unicode编码,这个无所谓的。
  12. 然后填写好location的匹配规则后,点击ok,下面的改写规则视图中,点击Add
  13. 选择Type 改写的范围:Body,Host,Path,URL,Add Query Param ,Modify Query Param,Response Status
  14. 选择where:来源范围:请求,响应都勾上吧
  15. Match:规则匹配区域:Regex是正则开关,勾上则可以写正则表达式,一般也用不上正则,因为这个匹配虽然是全匹配,但好像是局部全匹配,即规则为 你好 ->我好 那么内容里的 你好丫丫 就会变为 我好丫丫
  16. 然后一般来说如果配置了替换规则,但是不生效,肯定是location没有匹配到,就要研究一下了。
  17. 如果设置好规则后,刷新页面,页面没有变化,但是抓取的请求中的内容却变了,那么表示你抓取的这个请求并非影响页面内容的关键请求,可能是中间件请求。

maplocal用法

  • 百度搜索京东商城

  • 搜索框输入电竞椅

  • 然后charles过滤 jd.com

  • 找到和search有关的请求

  • 确定影响页面的请求:一般而言,如果返回的是html,一般都是影响页面的请求。

  • 当然也有些请求是返回json数据,也可以试试。

  • 具体操作,确定好请求后右键,save response 然后存储,注意添加后缀

  • 然后编辑这个文件,比如将ctrl+h 将所有电竞 ->静电

  • 然后再次右键这个请求,选择maplocal->其他信息会自动填好,选择下方的替换文件

  • 注意这里的自动填充的url定位是完整的,所以要看看查询参数有没有时间参数之类的,要手动砍掉

  • 然后确定,刷新页面

  • 先看看页面有没有变化成功

  • 如果没有,则先清空charles请求,然后再刷新页面,找一下那个请求,看看charles抓到的请求是否有变更,如果有变更,证明修改成功了,但是修改的请求是中间请求,并没有影响到页面,再继续找就行。就拿这个搜索为例,总共出现了三个jd.com/search=xxxx 有两个返回的json,有一个返回的是html,肯定是这三影响了页面,究竟是哪个,慢慢尝试就好。

抓取app-mumu模拟器请求

因为现在Android系统都是7+,而Android6以后,对于CA证书的录入,变得非常严格。所以我们要想抓包到Android12系统的数据,就必须搞定这个证书导入

参考帖子:[MuMu模拟器12如何安装证书?_MuMu模拟器_安卓模拟器 (163.com)](MuMu模拟器12如何安装证书?_MuMu模拟器_安卓模拟器 之后默认不信任用户添加到系统的CA证书),遇到这类问题的用户可参考以下方法步骤进行操作导入证书。 第一步,用Charles(点击下载Charles>>)导出证书,命名为 charles.pem 第二步,安装open,ssl (点击下载>>),安装默认安装, 最后的捐款取消勾选。 之后配置环境变量,将openssl安装路径bin的路径 (例如 C%3AOpenSSL-Win64bin)加入到操作系统的系统环境变量Path中)

这是官方的帖子

第一步:抓取到模拟器的请求

因为模拟器实际上可以当成手机,所以即使是使用真机,也参考一下这个操作

  1. 打开模拟器mumu12
  2. 点击模拟器内的手机设置-setting(注意不是模拟器外围边框的模拟器设置)
  3. 找到网络->wifi设置(这里一般来说的场景是,点进来后,连着一个wifi,然后点击这个正在使用的WiFi,长按,或者看看有没有齿轮图标:设置,目的是找到修改WiFi信息的地方,选择代理->手动代理->然后输入本地的IP(win+r->cmd->ipconfig->然后找到当前网络配置的ipv4信息:一般如果是WiFi连接就找无线局域网适配器WLAN),端口填写你charles中Proxy->Proxy Setting 中的端口信息)
  4. 当填好代理时,你的Charles会弹出有未知设备连接的提醒,选allow,让模拟器连接,不然到时会很麻烦:拒绝后再想连接就要手动指定设备来连接。(代理设置后,可能要等一会,你的charles就会弹出一个弹窗,一定要选allow
  5. 这时,设置网络,就让你的charles可以拦截到模拟器的请求,但是这时你打开模拟器的任一应用,能看到charles抓到的请求虽然状态码是200,但是图标却是爆红,报错的样子,这是因为没有在模拟器或者说手机端配置charles的CA证书,导致模拟器或手机端不信任,无法解密请求。
  6. 注意这个修改代理网络的IP,如果发现抓不到请求了,就查一下本地电脑的IP有没有发生变化,发生变化了就改一下模拟器上的代理IP地址

模拟器配置证书

我们上一步已经成功抓取到请求了,因为网络?但是还是无法解密请求,根据charles的工作原理,应该是中间人攻击失败了,那我们就将charles的CA证书添加到模拟器上(android7.0后无法正常安装导入证书,因为Android7.0后默认不信任用户添加到系统的CA证书),对于使用低版本安卓系统的模拟器比如mumu6而言,下载证书就不用那么复杂:https://www.charlesproxy.com/assets/legacy-ssl/charles.crt 打开模拟器/手机里的浏览器:输入上述网址,回车,应该会弹出证书下载提示框,然后正常下载,然后在 设置->通用->VPN与设备管理,点击Charles证书,安装即可。然后低版本的模拟器的请求就能被Charles正常抓取了

  1. 从charles中下载CA证书打开charles->Help->SSL Proxying->Save Charles Root Certificate 然后会弹出一个下载路径,随便选一个地方就行,然后注意默认不会给这个文件命名,所以需要手动命名:charles.pem

  2. 下载工具open ssl 用于签发证书: openssl下载,进入下载地址,选择对应的系统,win,linux,mac,该工具的安装没有啥坑,注意更改一下安装地址就好,走到最后一步会让你勾选捐款选项,全部不勾选,然后点击确定,就能完成安装,此外需要将该工具的bin目录添加到path环境变量里,即将xxx/bin 这个层级丢到path中

  3. 使用openSSL 签发证书: 打开终端:win+r->cmd->输入 openssl x509 -subject_hash_old -in <Certificate_File> 其中<Certificate_File>是你之前保存charles证书的绝对路径:D://xxx/charles.pem

  4. **可能出现的阻塞报错:Can’t open config file: /etc/ssl/openssl.cnf **执行以下命令:

  5. set OPENSSL_CONF=c:\[PATH TO YOUR OPENSSL DIRECTORY]\bin\openssl.cfg
    
  6. 至此上一步操作结束,无论是正常执行成功,还是出现报错后,执行解决方案后成功,都应该显示出一个结果:首先是生成一串字符串,然后下面是 xxxstart 一堆数据 xxxxend 之类的。复制这个字符串(比如:012x2asd8a) ,将本地刚刚下载的charles.pem,改名为生成的字符串,然后后缀改为.0(数字0) 即(012x2asd8a.0

  7. 然后到最关键的一步,将证书导入:使用前端根证书导入的方法导入:

    1. 首先打开mumu12模拟器:点击外围边框的模拟器设置:->其他->找到Root权限开启(一般模拟器都是默认开启的)

    2. 继续在设置中找到磁盘->从只读改为可写

    3. 保存完毕后,应该会让你重启模拟器

    4. 重新打开一个终端:win+r->cmd,终端输入:

    5. adb connect 127.0.0.1:16384  
      adb shell
      adb root
      mount -o remount,rw /system
      exit
      adb push <Certificate_File> /etc/security/cacerts/
      这时,这里的<Certificate_File>绝对路径的文件名改为前面改名后的名字即 D://xxx/012x2asd.0
      
    6. 可能遇到的问题

      1. 官方教程里是没有adb root 这步的,会在执行mount -0 xxx操作时报错:Permission Denied :解决:adb shell 然后输入 adb root 开启管理员模式
      2. 在执行后面的adb push时,报错系统read only,没有将mumu12模拟器的磁盘可写权限打开。
    7. 验证证书: win_r->cmd->adb shell ->cd /etc/security/cacerts/ -> ls ->就能看到列表中找到自己刚刚生成的字符串xxxx.0 在其中。便说明添加成功。

    8. 检验charles解密App数据: 这时清空charles旧请求,模拟器上点击雪球App,可以看到charles上已经能正常显示雪球App的请求,并且内容无误。


adb push E:\charles-certificate-root\charles.pem /etc/security/cacerts
E:\charles-certificate-root\charles.pem: 1 file pushed, 0 skipped. 1.9 MB/s (1912 bytes in 0.001s)
adb: error: failed to copy 'E:\charles-certificate-root\charles.pem' to '/etc/security/cacerts/charles.pem': remote couldn't create file: Permission denied

解决:

这个错误提示表明您尝试将 `charles.pem` 文件推送到Android设备的 `/etc/security/cacerts` 目录时出现了权限被拒绝的问题。这是因为很多Android设备的 `/etc/security/cacerts` 目录属于系统级目录,需要系统权限才能写入文件。

为了解决这个问题,您可以尝试以下几种方法:

1. **使用 adb root 权限**:在 adb 命令前加上 `su` 或者 `adb root`,以获取Root权限。例如:`adb root`,然后再进行文件传输操作。

2. **使用 adb remount 命令**:使用 `adb remount` 命令先将设备的 `/etc` 分区设置为可写,然后再进行文件传输操作。例如:`adb remount`

3. **通过其他路径传输文件**:尝试将文件保存到其他可写入的路径,例如 `/sdcard` 目录,然后再将文件移动到所需位置。例如:`adb push E:\charles-certificate-root\charles.pem /sdcard/charles.pem`

4. **使用 Android Debug Bridge (ADB) Shell**:通过 adb shell 命令连接到设备的 shell 终端,然后使用 root 权限手动复制文件到目标目录。例如:

                  
adb shell
   su
   cp /sdcard/charles.pem /etc/security/cacerts/
   

请注意,在执行这些操作时,确保您对设备具有足够的权限,并且操作文件谨慎,以免对系统造成不必要的影响。

adb root

charles抓取模拟器App请求,并且使用Rewrite修改

  • filter是用来筛选url之类的
  • 点击空白处,ctrl+F 是用来搜索内容里的text的
  • 正则表达式的使用:可以用于url匹配时的正则表达式,也可以是内容替换时的正则表达式
  • 举例:内容中存在"timeBefore":"41分钟前" 要想替换掉后面“”中的时间,就需要使用正则表达式:"timeBefore":"([^"]+)"
  • 解析正则:[]在正则表达式中代表字符类,表示匹配方括号中列举的任意一个字符,方括号中使用^表示取反,即匹配除了方括号中指定字符外的任意字符,^' 这个表示不取' ,+号表示前面匹配至少1个活多个前面指定的字符或范围
  • 并非所有数据都能修改,即使请求里修改了,但是页面上还是修改不了。不清楚这方面的数据是如何进行的,比如雪球App首页有xx已收盘的信息,然后下面的框框是实时显示上证指数,深证指数,创业版指的数值,我直接全局搜索上证字样,只抓到十余个json请求,这些都是随着实时更新而逐渐累积的请求。我抓取其中一个url去除特殊部分,替换其中的字样,发现页面上没有变化,但是charles抓取的请求已经发生了变化,然后还是在这个请求中,我替换已收盘为已盘收,倒是替换成功,貌似有些数据可以替换,有些数据替换了也不生效,而有些数据替换了会报错。。
  • 实际上,charles能抓到的内容是服务器和客户端的交互,是否存在一些数据是charles抓不到的?