Burp Suite JSON美化扩展

Body Only (Pretty JSON) - Burp Suite扩展

项目描述

这是一个专为Burp Suite设计的扩展插件,主要功能是提取HTTP响应中的JSON数据并进行美化展示。它能够自动识别响应体中的JSON内容,移除常见的防护前缀(如)]}'等),并以格式化的方式呈现JSON数据,同时强制设置Content-Type为application/json以便于查看。

功能特性

  • 自动JSON识别:智能检测响应体中的JSON内容
  • 数据美化:自动格式化JSON数据,提高可读性
  • 防护前缀移除:自动清除常见的JSON防护前缀
  • 内容类型强制设置:统一设置Content-Type为application/json
  • 响应头处理:自动提取HTTP响应体,忽略响应头
  • 错误处理:完善的异常捕获和错误提示机制

安装指南

  1. 确保已安装Java运行环境和Burp Suite
  2. 将Python脚本保存为body_only_json.py
  3. 在Burp Suite中通过Extender > Extensions > Add加载该脚本
  4. 选择Python作为扩展类型并指定保存的文件

使用说明

安装完成后,该扩展会自动生效。当查看HTTP响应时:

  1. 在Burp Suite的消息编辑器中将显示"Body Only"标签页
  2. 该标签页会自动提取响应体中的JSON内容
  3. JSON数据会被格式化显示,并移除防护前缀
  4. 内容类型会被强制设置为application/json

示例效果

原始响应:

HTTP/1.1 200 OK
Content-Type: text/plain

)]}'
{"name":"John","age":30,"city":"New York"}

扩展处理后:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

核心代码

class BodyOnlyTab(IMessageEditorTab):
    def setMessage(self, content, isRequest):
        if content is None or isRequest:
            self._editor.setMessage(None, False)
            return

        try:
            response_str = self._helpers.bytesToString(content)
            header_end = self._findHeaderEnd(response_str)
            if header_end == -1:
                self._editor.setMessage(None, False)
                return

            body = response_str[header_end:]
            body = self._removeJsonGuards(body).strip()

            if self._isJson(body):
                try:
                    json_obj = json.loads(body)
                    pretty_json = json.dumps(json_obj, indent=2, ensure_ascii=False)
                except ValueError as e:
                    self._callbacks.printError("JSON parsing error: " + str(e))
                    pretty_json = body
            else:
                pretty_json = body

            # Force Content-Type to application/json always
            fake_response = (
                "HTTP/1.1 200 OK\r\n"
                "Content-Type: application/json\r\n"
                "Content-Length: {}\r\n\r\n"
                "{}"
            ).format(len(pretty_json.encode('utf-8')), pretty_json)

            self._editor.setMessage(self._helpers.stringToBytes(fake_response), False)
def _removeJsonGuards(self, body):
    guards = [
        r'^\s*for\s*\(\s*;\s*;\s*\)\s*;\s*',
        r'^\s*while\s*\(\s*1\s*\)\s*;\s*',
        r'^\s*\)\]\}\'\s*',
        r'^\s*/\*\*/\s*'
    ]
    for guard in guards:
        body = re.sub(guard, '', body)
    return body

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-07-13 08:01  qife  阅读(40)  评论(0)    收藏  举报