
1. 项目概述为什么我们需要联动工具在移动应用测试尤其是安全测试和接口测试的深水区测试工程师们常常会陷入一种“工具切换疲劳”。你刚在Charles里抓到一个HTTPS请求发现应用启用了SSL Pinning证书绑定请求直接失败你费尽心思绕过Pinning把流量导到Burp Suite准备做深入的安全扫描或篡改测试时又发现请求体是一串看不懂的加密乱码可能是AES也可能是自定义的算法。于是你不得不在Charles、Burp、反编译工具、Hook脚本之间来回切换测试流程被割裂效率低下心智负担极重。“移动端测试效率翻倍CharlesBurp联动一站式解决SSL Pinning与加密报文处理”这个标题精准地戳中了这个痛点。它指向的不是某个单一工具的炫技而是一套高效的组合工作流。其核心价值在于通过合理的配置与桥接让Charles和Burp这两款在各自领域抓包调试与安全测试的王者工具协同工作形成一个无缝的测试管道。Charles凭借其对移动端友好的代理设置和直观的界面负责初始的流量拦截、SSL Pinning绕过通常需配合移动设备设置或插件以及对加密报文进行“解密预览”而Burp Suite则作为后端的深度分析引擎接收来自Charles的、已解密的明文流量进行重放、扫描、篡改等安全测试操作。这套方案适合谁首先是移动应用安全测试人员安服、渗透测试工程师他们需要深度测试接口安全性其次是高级测试开发或质量保障工程师在对复杂业务逻辑、加密接口进行功能测试或自动化测试数据构造时需要清晰地看到请求与响应内容甚至对于开发者在联调加密接口时这也是一套极佳的调试方案。它的目标很明确让你在一个统一的视图里看到从客户端发出到服务器返回的、可读的完整通信过程从而将精力聚焦于测试与分析本身而非与工具搏斗。2. 核心思路与架构设计打造流量处理流水线要实现Charles与Burp的顺畅联动并解决SSL Pinning和报文加密两大拦路虎我们需要设计一个清晰的流量转发与处理链。其核心思路可以概括为“设备代理 - Charles解密/解Pinning - Burp深度测试 - 目标服务器”。2.1 工具角色定位与流量走向在这个架构中每个工具扮演着不可替代的角色Charles (作为一级代理/SSL Pinning终结者)配置在移动设备上的代理服务器地址直接指向Charles。Charles的首要任务是完成与客户端的TLS握手。对于启用了SSL Pinning的应用我们需要在设备上安装并信任Charles的根证书同时可能需要借助其他手段如使用已Patch的App、Objection等Hook工具来绕过Pinning验证。一旦握手成功Charles就能以中间人身份解密HTTPS流量。此外如果应用层还有自定义加密我们可以利用Charles的Map Local或Rewrite功能注入解密脚本或直接替换为解密后的报文实现“明文预览”。Burp Suite (作为二级代理/安全测试平台)将Charles配置为向上游转发流量到Burp。这样经过Charles初步处理的已解密的HTTPS和/或已解密的业务报文流量会被透明地转发给Burp。在Burp中你可以看到清晰的明文请求从而可以轻松地使用Repeater进行重放测试使用Intruder进行爆破使用Scanner进行主动扫描或者手动修改任何参数。为什么是Charles在前Burp在后这是由工具特性决定的。Charles在移动端的证书安装、会话管理、流量录制和回放方面体验更流畅其Map Local/Rewrite功能对处理自定义加密非常直观。而Burp在漏洞探测、攻击Payload生成、会话管理Comparer, Sequencer等方面更强大。让Charles做“预处理”Burp做“深度分析”物尽其用。2.2 联动架构的两种模式在实际操作中联动通常有两种模式适用于不同场景模式流量走向优点缺点适用场景串联模式上游代理设备 - Charles - Burp - 互联网Burp能获取最原始的、经Charles解密后的流量便于进行完整的安全测试。Charles的SSL和加密处理对Burp透明。配置稍复杂需要确保两者端口不冲突。所有流量经过两层代理理论上延迟略有增加。最常用、最推荐的模式。适用于全面的安全审计、需要对所有API进行漏洞扫描的场景。并联模式外部代理设备 - Charles (处理部分域名)设备 - Burp (处理其他域名)配置灵活可以按域名分流。部分流量可直接进入Burp。需要手动在设备上切换或配置分流规则管理不便。无法一站式查看所有流量。我们主要阐述和推荐串联模式因为它真正实现了“一站式”处理的目标。3. 环境准备与基础配置工欲善其事必先利其器。在开始联动之前需要确保Charles和Burp Suite都已正确安装并完成基础配置。这里以macOS/Windows桌面环境为例移动端以Android/iOS真机为例。3.1 Charles基础配置与SSL抓包准备首先启动Charles我们需要进行几项关键配置开启HTTP代理并记录端口进入Proxy - Proxy Settings...。确保Enable transparent HTTP proxying被勾选并记住HTTP Proxy的端口默认8888。这个端口将是移动设备连接Charles的入口。安装Charles根证书到本地计算机这是解密HTTPS流量的第一步。点击Help - SSL Proxying - Install Charles Root Certificate将证书安装到系统的受信任根证书颁发机构存储中。对于macOS你可能还需要在钥匙串访问中手动信任该证书。启用SSL代理点击Proxy - SSL Proxying Settings...。在SSL Proxying标签页勾选Enable SSL Proxying。然后点击Add在Host和Port中分别填入*和*表示代理所有主机和端口的所有SSL连接。这是一个通配配置方便初期使用。允许外部设备连接同样在Proxy Settings中勾选Allowlist中的Enable transparent HTTP proxying通常已足够。为了安全你也可以在External Proxy Settings中指定允许连接的IP段但在测试环境通常不需要。注意Charles的根证书安装到电脑是第一步但要让移动设备上的HTTPS流量被解密还必须将同一个根证书安装到移动设备并信任它。我们稍后在设备配置环节完成。3.2 Burp Suite基础配置启动Burp Suite这里以Community/Professional版为例默认会监听本地的8080端口。我们需要确认并可能调整这个设置确认代理监听器进入Proxy - Options标签页。在Proxy Listeners部分确保有一个运行中的监听器通常是127.0.0.1:8080。记住这个地址和端口默认127.0.0.1:8080。安装Burp的CA证书可选但建议如果你计划直接让设备连接Burp或者在某些复杂场景下需要可以导出Burp的CA证书。在Burp中进入Proxy - Options在Proxy Listeners部分选中你的监听器点击Import / export CA certificate导出证书文件。不过在我们的串联模式中设备直接连接Charles所以主要使用Charles的证书。3.3 移动设备代理与证书安装这是打通抓包链路的关键一步也是最容易出错的环节。对于Android设备配置Wi-Fi代理确保手机和电脑在同一局域网。在手机的Wi-Fi设置中长按当前连接的网络 - 修改网络 - 显示高级选项。将代理设置为手动代理服务器主机名填写运行Charles的电脑的IP地址代理服务器端口填写Charles的端口默认8888。安装Charles证书在手机浏览器中访问chls.pro/sslCharles提供的固定地址下载并安装证书文件通常是一个.pem或.crt文件。系统会要求你为证书命名并确认安装。完全信任证书关键在Android 7.0及以上版本系统不再信任用户安装的CA证书用于安全连接这就是为什么App自带证书绑定能生效。你需要将证书移动到系统证书存储。这通常需要Root权限。对于测试更实用的方法是使用模拟器如Android Studio的AVD可以在创建时选择带Google APIs的系统镜像并直接拖拽证书文件到模拟器界面进行安装且更容易配置为系统证书。使用已破解Pinning的App寻找或自己编译一个不校验SSL证书的测试版本App。使用Frida/Objection等Hook工具在Root或已越狱的设备上运行objection android sslpinning disable可以动态禁用许多常见框架的证书绑定。对于iOS设备配置Wi-Fi代理进入设置 - Wi-Fi点击当前连接Wi-Fi右侧的i图标。滑到最底部配置HTTP代理为手动填入电脑IP和Charles端口8888。安装并信任Charles证书在Safari浏览器中访问chls.pro/ssl下载描述文件进入设置 - 已下载描述文件安装它。然后进入设置 - 通用 - 关于本机 - 证书信任设置找到Charles Proxy的证书并开启完全信任。完成以上步骤后在Charles界面你应该能看到手机发出的HTTP请求。对于HTTPS请求可能会弹出授权框点击Allow即可。此时常规的HTTPS流量应该已经被Charles解密并显示。4. 核心环节一配置Charles与Burp联动串联模式现在我们让Charles和Burp“牵手”。目标是让所有到达Charles的流量自动转发给Burp。在Charles中配置上游代理这是核心步骤。在Charles中进入Proxy - External Proxy Settings...。启用并填写Burp代理信息勾选Use external proxy servers。在Web Proxy (HTTP)部分勾选Enable在Server中填入127.0.0.1在Port中填入Burp的监听端口默认8080。同样地在Secure Web Proxy (HTTPS)部分也勾选Enable填写相同的127.0.0.1和8080。重要不要勾选Use external proxy for DNS lookup除非你有特殊需求否则可能导致DNS解析问题。验证联动配置完成后清空Charles的会话记录。在手机上操作App产生网络请求。此时你应该在Charles的会话列表Sequence中看到抓取到的请求。同时打开Burp Suite进入Proxy - Intercept标签页如果Intercept is on是开启状态你会看到请求被Burp截获如果Intercept is off你可以进入Proxy - HTTP history标签页这里应该同步出现了所有从Charles转发过来的请求历史并且内容是明文的已由Charles完成HTTPS解密。实操心得有时候配置后Burp收不到流量请按以下顺序排查① 确认Burp的代理监听器127.0.0.1:8080正在运行。② 确认Charles的上游代理配置中IP和端口无误。③ 暂时关闭Burp的拦截功能Intercept is off查看HTTP history。④ 检查电脑防火墙是否阻止了Charles和Burp之间的本地回环通信。5. 核心环节二攻克SSL Pinning即使设备安装了Charles证书许多应用仍会使用SSL Pinning证书绑定来防止中间人攻击。表现为在Charles中看到SSL Handshake Failed或直接连接失败。我们需要“绕过”它。策略一修改或使用已修改的App这是最根本的方法。如果拥有App源码可以直接注释掉证书校验的代码例如OkHttp的CertificatePinner。如果没有源码可以尝试寻找该App的“证书已解除绑定”的测试版或修改版。对于Android也可以使用Apktool等工具反编译APK搜索pin、CertificatePinner、TrustManager等关键词进行修改后重打包。但此法涉及逆向复杂度较高。策略二使用Hook工具动态绕过推荐用于测试这是测试过程中最灵活高效的方式无需修改App本身。Frida Objection这是移动安全测试的黄金组合。确保你的设备环境已准备好Root/越狱或使用模拟器。在电脑上安装Frida和Objection (pip install frida-tools objection)。然后# 启动Objection附加到目标App进程 objection -g com.example.app explore # 在Objection的REPL环境中运行以下命令尝试绕过 android sslpinning disableObjection会尝试Hook常见的证书绑定实现如OkHttp3, Android证书校验等。成功后之前因Pinning失败的请求在Charles中就能正常解密了。针对特定框架有些App使用Xposed模块或特定的Pinning库可能需要寻找对应的Hook脚本。策略三利用系统或模拟器特性Android模拟器AVD在创建模拟器时选择Google APIs而非Google Play的系统镜像可以将用户证书轻松安装为系统证书这能绕过一部分基于系统证书库的Pinning检查。iOS越狱设备可以安装SSL Kill Switch 2等越狱插件来全局禁用证书验证。注意事项绕过SSL Pinning仅用于授权的安全测试和调试。在实际测试中需要明确测试范围和授权协议。对于使用了双向证书绑定mTLS的应用情况更为复杂可能需要同时Hook客户端证书的发送逻辑。6. 核心环节三处理自定义加密报文解决了传输层的TLS加密HTTPS后我们可能还会遇到应用层的业务数据加密。你在Charles或Burp中看到的请求体Request Body可能是一串Base64编码的字符串解码后仍是乱码如AES加密结果或者根本就是二进制数据。响应体亦然。我们的目标是在Charles这一层将这些加密报文“解密”成可读的明文再转发给Burp。这样在Burp中操作的就是明文数据了。这里主要依赖Charles强大的Rewrite和Map Local功能。方法一使用Rewrite功能注入解密逻辑适用于简单算法或已知密钥假设你知道加密算法是AES-ECB-PKCS5Padding密钥是固定的test_key_123456。你可以写一个简单的本地脚本如Python并让Charles调用它。编写解密脚本(decrypt.py)import sys import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import unpad # 注意这里使用pycryptodome库 def decrypt_data(encrypted_b64): key btest_key_123456 # AES-ECB模式密钥需要是16, 24, 32字节 # 如果密钥长度不够需要补齐这里简单示例实际请根据情况处理 if len(key) 16: key key.ljust(16, b\0) elif len(key) 24: key key.ljust(24, b\0) elif len(key) 32: key key.ljust(32, b\0) else: key key[:32] cipher AES.new(key, AES.MODE_ECB) encrypted_bytes base64.b64decode(encrypted_b64) decrypted_bytes unpad(cipher.decrypt(encrypted_bytes), AES.block_size) return decrypted_bytes.decode(utf-8) if __name__ __main__: # Charles会通过标准输入传递数据 input_data sys.stdin.read().strip() try: output_data decrypt_data(input_data) print(output_data) except Exception as e: # 如果解密失败原样返回避免破坏非加密数据 print(input_data)在Charles中配置Rewrite规则进入Tools - Rewrite...。创建一个新的Rewrite Set并启用它。点击Add添加一条规则。在Location部分选择需要解密的请求可以按Host、Path等细化。在Rules部分点击Add选择Body类型。在Match框你可以留空或使用正则匹配加密数据的特征如^[A-Za-z0-9/]*$匹配Base64。在Replace框选择External Process。在Command中填写你的Python解释器路径和脚本路径例如/usr/bin/python3 /path/to/decrypt.py。勾选Process response body这样响应体也会被尝试解密。选择Replace matched text with process output。配置完成后匹配的请求/响应体在Charles视图里就会显示为解密后的明文并且转发给Burp的也是这个明文。方法二使用Map Local功能替换为解密后的文件适用于复杂或动态加密如果加密逻辑复杂或者需要与客户端代码交互用外部进程处理不便可以采用“录制-解密-映射”的方式。正常操作App在Charles中抓取到一个加密的请求和响应。将加密的请求体Request Body和响应体Response Body分别保存为文件如encrypted_req.bin和encrypted_resp.bin。通过逆向分析或已知方法在外部解密这两个文件得到明文文件decrypted_req.txt和decrypted_resp.txt。在Charles中对目标请求URL右键选择Map Local...。在设置中将Local Path指向你解密后的响应文件decrypted_resp.txt。这样当App再次发起相同请求时Charles会直接返回这个解密后的明文文件内容。对于请求你可以结合Rewrite功能将发出的加密请求体替换为decrypted_req.txt中的内容需要编写规则匹配并替换Body。这种方法虽然手动但在分析复杂协议时非常直观和可控。实操心得处理自定义加密是移动端测试的深水区。首先需要确定加密算法和密钥。常见方法包括静态分析反编译的代码搜索encrypt、AES、RSA等关键词、使用Frida Hook加密函数获取输入输出和密钥、或者通过协议分析寻找规律。一旦在Charles层实现了解密可视化后续在Burp中的安全测试就变得和测试普通HTTP接口一样简单。7. 高效测试工作流与Burp深度利用当Charles成功将解密的明文流量转发到Burp后你就拥有了一个功能强大的安全测试环境。以下是一些提升效率的工作流1. 主动扫描与被动扫描被动扫描 (Passive Scan)Burp会自动分析经过代理的所有请求和响应识别潜在的安全问题如敏感信息泄露、不安全的Cookie属性等。确保Proxy - Options - Intercept Client Requests和Intercept Server Responses中的拦截规则不会阻止流量进入历史记录以便被动扫描器工作。主动扫描 (Active Scan)在Target - Site map中右键选中你的目标主机或分支选择Actively scan this branch。Burp会向已发现的端点发送大量测试Payload以发现SQL注入、XSS、命令注入等漏洞。注意主动扫描会产生大量测试流量务必在授权测试范围内进行避免对生产系统造成影响。2. 重放与篡改 (Repeater)Repeater是测试单个请求的利器。从Proxy history或Site map中直接将请求发送到Repeater。你可以随意修改任何参数、Header、Body。反复发送请求观察不同输入下的响应变化。结合Decoder模块对参数进行编码、解码、哈希操作。这对于测试业务逻辑漏洞如越权、状态篡改和输入验证绕过至关重要。3. 暴力破解与模糊测试 (Intruder)对于需要大量Payload测试的场景如验证码爆破、用户名枚举、SQL注入盲注Intruder是自动化利器。将请求发送到Intruder。在Positions标签页标记需要替换的变量如username和password参数。在Payloads标签页为每个位置设置Payload集合字典文件、数字序列等。选择合适的攻击类型Sniper, Battering ram等并开始攻击。通过响应长度、状态码、关键词等条件筛选结果。4. 对比与序列分析 (Comparer Sequencer)Comparer比较两个请求或响应的差异在分析加密算法或寻找敏感参数时非常有用。Sequencer分析会话令牌、CSRF Token等随机数的随机性质量。5. 利用Burp ExtenderBurp的扩展生态非常丰富。你可以安装Logger来增强日志记录安装Autorize来自动化越权测试安装Turbo Intruder进行高性能模糊测试等。这些扩展能极大丰富你的测试手段。8. 常见问题、排查技巧与优化实录在实际搭建和使用这套联动方案时你几乎一定会遇到各种问题。下面是我踩过坑后总结的排查清单和优化建议。问题1手机配置代理后无法上网/Charles看不到任何请求。排查① 确认电脑和手机在同一局域网且防火墙允许了Charles的端口8888。② 在手机浏览器访问http://电脑IP:8888应能看到Charles提供的下载证书页面。如果看不到检查网络连通性。③ 检查Charles的Access Control Settings是否限制了IP。问题2HTTPS请求在Charles中显示为unknown或SSL Handshake Failed。排查① 确认手机已成功安装并完全信任了Charles的CA证书iOS在证书信任设置中开启Android需尝试移动到系统证书或使用Hook。② 在Charles中确认SSL Proxying Settings已为对应域名或通配符(*:*)启用。③ 检查目标App是否启用了SSL Pinning需按第5节方法绕过。问题3Burp Suite的HTTP history中看不到任何流量。排查①首先检查Burp的拦截是否开启如果Intercept is on请求会被挂起需要你手动Forward才会进入历史记录。测试时建议先关闭拦截。② 确认Charles的上游代理配置正确127.0.0.1:8080。③ 重启Charles和Burp有时代理链需要重置。④ 在Burp的Proxy - Options - Proxy Listeners中确认监听器正在运行且绑定地址正确。问题4请求/响应体在Charles中是明文但到Burp里又变回加密的了。原因与解决这通常是因为Charles的Rewrite或Map Local规则只改变了Charles本地的显示视图但转发给Burp的原始流量并未被修改。确保你的解密规则在Rewrite设置中不仅作用于View更要作用于Forward即Replace操作。使用External Process替换时输出会替换原始内容进行转发。问题5使用Frida/Objection绕过SSL Pinning后App闪退或功能异常。排查① 可能是Frida脚本与App不兼容或触发了反调试。尝试使用objection的-N参数通过网络连接或者使用更稳定的Frida版本。② 有些App有多个校验点Objection的通用命令可能未能全部绕过。需要针对性地分析App使用的网络库如OkHttp, Alamofire, TrustKit编写自定义Frida脚本进行Hook。优化技巧1使用Scope作用域聚焦目标在Burp的Target - Scope中添加你的目标域名如*.example.com。这样Burp的代理历史、扫描器等都会自动过滤非目标流量界面更清晰操作更高效。优化技巧2保存和恢复项目状态Burp和Charles都支持将当前会话保存为项目文件。在开始一个大型测试任务前新建一个项目文件如测试项目A.burp。定期保存可以记录所有请求、标记、注释方便后续回溯和报告编写。Charles也可以将会话保存为.chls文件。优化技巧3区分测试环境与生产环境强烈建议在独立的测试网络或虚拟机环境中进行此类测试。避免因代理设置或Hook工具影响日常办公网络和其他应用。可以使用模拟器如Android AVD构建一个纯净的测试环境。优化技巧4处理WebSocket等非HTTP/S流量Charles和Burp对WebSocket的支持有限。如果App大量使用WebSocket你可能需要专门的WebSocket抓包工具如mitmproxy的WebSocket视图或Proxyman或者研究如何将WebSocket流量转换成可被代理链处理的格式这通常更具挑战性。移动端测试尤其是涉及安全与加密的测试是一个不断与防护措施“斗智斗勇”的过程。Charles与Burp的联动方案提供了一条从流量捕获、解密到深度测试的完整路径。它不能解决所有问题例如强混淆的Native代码加密、基于硬件的绑定等但能覆盖绝大多数场景。这套流程的价值在于将零散的工具操作整合成一条自动化或半自动化的流水线让你能更专注于测试逻辑和漏洞挖掘本身这才是“效率翻倍”的真正含义。记住工具是死的思路是活的。理解每个环节的原理才能灵活应对各种变数。在实际操作中耐心和细致的观察往往比盲目尝试更有效多看看日志多对比请求差异问题的答案往往就藏在细节里。