在最近的移动应用程序评估期间,MDSec的移动团队遇到了一个通过HTTP用于服务器通信的二进制协议。这个协议的分析表明它是Apache Thrift,它被用来轻松地构建RPC客户端和服务器,而不管在每一边使用哪种编程语言。MDSec中选择的Web截取工具是Burp Suite,因此我们希望在评估过程中继续使用Burp。不幸的是,在Thrift编码数据中没有Burp扩展(至少我们知道),所以我们决定创建自己的。
使用thrift python库和thrift工具,通过一些自定义修改,我们为Burp Suite创建了自己的ThriftDecoder扩展。你可以在MDSec的github页面找到代码。
要使用扩展名,请从GitHub克隆代码,然后通过选择ThriftDecoder.py文件将其添加到Burp安装中。我们正在努力在BApp商店添加扩展,以进一步将其整合到Burp中。
通常,在Burp中,具有节俭编码数据的请求看起来像这样:
正如你在上面的图片中看到的那样,数据不是完全无法识别的,可以很容易地识别出大量的字符串。不幸的是,如果你试图模糊上面的字符串之一,你会在服务器端遇到解码错误,因为字符串前面加了一个32位整数,表示它们的大小。
您可能注意到上图中新的“Thrift Decoder”选项卡。当检测到Thrift编码数据时,该选项卡由ThriftDecoder扩展创建。在查看此选项卡时,以更易读的格式对节俭数据进行解码:
通过这种伪JSON格式的数据,可以很容易地识别您通常会尝试模糊的字段。您可以直接在“Thrift Decoder”选项卡中进行编辑,当您在Repeater中提交请求时,所有更改都将自动重新编码。
将“Thrift Decoder”选项卡中的数据更改为无效格式时,扩展名将无法重新编码数据,“Raw”选项卡将包含与“Thrift Decoder”选项卡相同的数据。这使得在提交请求之前很容易识别任何错误的修改。
在Burp Suite中也可以使用强大的入侵者和扫描器。右键单击请求消息,上下文菜单将包含新的选项,以将Thrift请求发送给入侵者或启动主动扫描。
ThriftDecoder将自动设置入侵者和扫描器中的有效载荷位置:
这只适用于字符串字段,因为其他字段类型通常不能由Thrift协议的性质注入。大多数Burp有效载荷是与其他字段(如整数或双精度)不兼容的字符串。当然,如果您希望可以扫描任何字段类型,ThriftDecoder将尝试对有效负载进行编码。当试图枚举ID或检查整数溢出时,这可能证明是非常有用的。此外,还可以将字段类型从一个整数更改为字符串,而ThriftDecoder将最好对有效负载进行编码。然而,由于Thrift协议使用了接口定义,这可能是徒劳无益的,并且最终可能会有一个通用错误作为服务器响应,或者如果幸运的话,可能是堆栈跟踪。