zoukankan      html  css  js  c++  java
  • Fiddler插件 --- 解密Elong Mapi请求参数及响应内容

    当前问题:

      在我们日常的Web/App测试过程中, Fiddler是一大辅助利器;在我们团队,也经常使用Fiddler进行App抓包测试。

      艺龙 App使用的REST(内部称为Mapi)接口,在使用过程中有如下特点:

        1、接口请求入参;不论是GET还是POST接口;为保证隐私及数据安全,其入参均会经过一次AES加密;然后做一次Encode处理;

          比如:

          

          好吧,不经过解密,我也不知道req参数中又臭又长的到底是什么鬼;

        2、接口响应,一般是经过Gzip或lzss压缩的;

      这就导致在使用Fiddler辅助测试的时候,无法查看请求参数以及响应内容;总是返回一堆乱码; 使用起来极为不便;

      按之前的做法,如要查看出入参,一般通过App端Debug工具查看,或通过Mapi的日志;

      而要在Fiddler中查看响应内容,按我们以前的做法需分三步:

        1、将Response Body保存到本地,并以 .gz作为文件后缀;

        2、解压该gz文件;

        3、用文本工具打开;

      操作繁琐,效率低下;

      为解决以上问题;提高测试效率,并充分利用Fiddler的强大功能;我们开发了一个Fiddler插件;使用该插件,则可在Fiddler中直接查看解密后的入参请求以及响应内容;相比上文中所述的一些测试方法要更加便捷。

      

      目前已实现功能为:

      1. 同时支持GET或POST类型Mapi请求入参及响应内容的查看;

      2. 出入参格式化输出;

      3. 文本查找、保存(Gzip、文本)功能

     

    一、先说一下使用方法:

      1、将2个Dll拷贝到Fiddler安装目录中的Inspectors文件夹下;

      2、重新打开Fiddler;设置手机代理

      3、然后按如下图方式查看即可(可以看出Inspectors标签下,多出两个子标签“查看Mapi入参”及“查看Mapi响应”,狠狠点击这2个标签,就能看到格式化之后的响应内容)    

      

    二、踩坑过程

      0)先来说下Fiddler中对Gzip自带的解压功能;

        对于普通HTTP请求,如果它的Response Header中,带有Content-Encoding: gzip 时,在Fiddler中是支持解压查看response内容的;这时Fiddler中一般会出现这样一个按钮 ;

        

        我们只需要点击它就可以查看解压后的响应内容;

        

    哟~,Niubility !!! So,既然Fiddler已经这么D炸天,而且大部分Mapi响应也是Gzip压缩的,为什么我们还要再搞个插件,多此一举?

    让我们回头看下Mapi,看看它的坑爹之处;

    以获取点评接口为例,我们先看一下它的Response的Header:

        

    细心的你可能已经看到了;它的header中没有 Content-Encoding: gzip 这一项!!!

    这样Fiddler就犯二了;它就不会给你自动解压Gzip流内容;我们在TextView或Raw面板中查看时仍就会看到一堆乱码;

        

        根据这个原理,让老夫先做如下尝试

      1)在Response的Header中,自动添加Content-Encoding: gzip

    如何在Response中添加Header呢,让开发来改,先醒醒吧;等开发改完,花儿都要谢了;

    是时候请出来我们的FiddlerScript了;对,又是它;上回测HTTPS替换任务时也是它;

    我们在OnBeforeResponse方法中,添加如下代码;然后用手机代理访问Elong App;

    ps:从该方法名也可知晓,它是在响应返回给Fiddler,被Fiddler截获,但还未返回给代理客户端时,进行一系列的篡改处理过程;

    从下图中我们可以看到,Response Header中已经添加了Content-Encoding: gzip 这一项;而且熟悉的Decode按钮也回来了;

      点击中间那条长长的Decode按钮;切换到TextView标签 ;果然,已经可以看到返回的响应内容了;

     

    So Easy ~~~ 鼓掌!撒花!

    But,我们回头瞧一眼手机,Whats the F*****K ;

    原来App端对于Header中加了Content-Encoding: gzip的响应在处理时发生了异常;别拦着我,让我先哭一会儿~~~

     

    2)插件开发;Fiddler扩展的瑞士军刀

    做为即将34岁,快要被淘汰劝退的老年人来讲;我们还得想想别的办法,尽量发挥一下余热;

    既然连FiddlerScript这个以前无往不胜的Geek功能都搞不定;只好再深一步;请出终极武器---Fiddler插件来了;

    先去官方的插件库里找了一下;没有针对该场景的插件,看来我们的需求也是有点奇葩的;

    在面对绝境时,人民币上的老爷子教导我们 - - - 自己动手,丰衣足食!

    先打开Fiddler二次开发官网,打开VSCode,回想一下三年没敲过的C#;

    然后飞速敲下一行惊天地泣鬼神的经典代码:

    Console.WriteLine("Hello World!");

     

    废话这么多,是时候给出来我们的解决方案了;

    入参查看实现方式:

      1. 对于GET类型,利用Fiddler Api 获取Get中URL;解析出Request参数;

      2. POST类型Api;截获Body数据;

      3. 从Header中获取clienttype和appversion;

      4. 对1和2 中获取的参数,做一次Decode处理;

      5. 调用内部Husky中http://192.168.14.206:8206/husky/system/aes中的AES解密接口; 利用1、2、3中获取的数据进行参数拼接;获取解密后的数据;

         主要代码如下:

      注:

    1、 查看Mapi入参功能,只能在内网使用;因为调用了内部Husky的AES解密 接口;

    2、 使用接口解密而不是算法解密的原因是:算法解密需要配置密钥,维护略有些麻烦;

    另外,内网的接口解密速度较快;且只有在查看入参这个Tab时,才会调用一次;不激活不调用;且对于非Mapi请求也不会调用。

      查看接口响应的实现方法:

      1. 获取Response Body数据;并实现Gzip流读取方法;使用到了.Net的GZipStream类,返回解压后的真实文本内容

      2. 实现Json格式化功能,使用到Newtonsoft.Json类库

      Fiddler插件的实现方法:

    1、实现该插件需要继承Inspector2基类和IRequestInspector2、IResponseInspector2接口;覆写或实现其中的一些关键方法;

    继承和实现IRequestInspector2接口,可在Fiddler处理请求过程中的一些入参、Header的修改及查看;

    而继承和实现IResponseInspector2接口,可在Fiddler处理响应过程中,对响应内容、响应Header的修改及查看;

    2、需要实现一个自定义控件;作为插件集成到Fiddler窗体中;用于展示解密后的请求入参,以及解压后Response内容;

     

    补充说明:

    Fiddler是支持4种扩展开发方式;本插件使用的是第2种;

    1 IFiddlerExtension,IAutoTamper,IAutoTamper2,IAutoTamper3

          1、这几个接口都是面向一个全局的插件,

          2、插件出现的位置和Log,TimeLine同级

          3、插件编译成dll只能放到 Scripts文件夹下

    2 Inspector2,IResponseInspector2,IRequestInspector2

          1、这几个接口是面向于单独一个连接

          2、插件会出现Inspector这个菜单下 和 Headers,TextView 同级

          3、插件编译成dll只能放到 Inspectors 文件夹下

    3 IHandleExecAction 这个接口可以让你的控件接收到命令行传来的命令,这个接口

    4 ISessionExporter,ISessionImporter

          1、顾名思义 批量对请求经行导入导出操作。例如批量导出为txt之类的

          2、位置出现在右键菜单Save-Selectd Session-中 和File-ImportSession 弹出的菜单中

          3、dll需要放到ImportExport中

      参考资料:

    官方文档:

    http://docs.telerik.com/fiddler/Extend-Fiddler/ExtendWithDotNet

    GitHub上一些插件源码:

    https://github.com/jessemcdowell/FiddlerMessagePackViewer

    https://github.com/waf/WCF-Binary-Message-Inspector

  • 相关阅读:
    线段树专辑—— pku 1436 Horizontally Visible Segments
    线段树专辑——pku 3667 Hotel
    线段树专辑——hdu 1540 Tunnel Warfare
    线段树专辑—— hdu 1828 Picture
    线段树专辑—— hdu 1542 Atlantis
    线段树专辑 —— pku 2482 Stars in Your Window
    线段树专辑 —— pku 3225 Help with Intervals
    线段树专辑—— hdu 1255 覆盖的面积
    线段树专辑—— hdu 3016 Man Down
    Ajax跨域访问
  • 原文地址:https://www.cnblogs.com/zhm450/p/6434664.html
Copyright © 2011-2022 走看看