升级改造
因为用插件自带的js脚本难以实现请求一个url返回数据,所以直接用python脚本去替换 这个js代码,直接用这个python脚本去链接这个burp插件。
使用方法就是 --host burp插件的对应的ip地址一般默认为 127.0.0.1 --port 默认为 1664。
python ganjsrpc.py --host 127.0.0.1 --port 1664
这里基本上不需要做什么修改,就需要修改这里的接口鉴权的东西。下面这里面的参数
params = {
'group': 'xiaodi',
'name': 'xiaodisec',
'action': 'pass',
'param': payload
}
完整代码
import json import logging import argparse from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler from urllib.parse import urlparse, parse_qs import requests ASCII_ART = ''' ,-.----. ,---, .--. __ ,-. / ,----._,. ,-+-. / |.--,`| .--.--. ,' ,'/ /|| : | / / ' / ,--.--. ,--.'| || |. / / ' ' | |' || | . : ,---. | : | / | | ," |'--`_ | : /`./ | | ,'. : |: | / | | . . .--. .-. | | | / | |,--,'|| : ;_ ' : / | | : / / ' ' . . | ," .--.; | | | | |/ : | ' `. | | ' | : . |. ' / ' . . | ," .--.; | | | | |/ : | ' `. | | ' | : . |. ' / | : : | , .-./'---' | : : `--'---' `---'.| / `----' / `--`---' / `---` `----' `--`-' `--`-' -- Author 嵩艺 ''' # 配置日志 logging.basicConfig( level=logging.INFO, format='[%(asctime)s] %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 加密请求函数 def encrypt_payload(payload: str) -> str: """向加密服务发送请求并返回加密结果""" try: base_url = "http://127.0.0.1:12080/go" params = { 'group': 'xiaodi', 'name': 'xiaodisec', 'action': 'pass', 'param': payload } response = requests.get(base_url, params=params) response.raise_for_status() json_data = response.json() return json_data.get('data', '') except requests.exceptions.RequestException as e: logging.error(f"请求加密服务失败: {e}") return '' except (json.JSONDecodeError, KeyError) as e: logging.error(f"解析响应失败: {e}") return '' # HTTP请求处理类 class EncryptHandler(BaseHTTPRequestHandler): """处理HTTP请求的类""" # 禁用默认的日志 def log_message(self, format, *args): return def do_POST(self): """处理POST请求""" try: content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length).decode('utf-8') form_data = parse_qs(post_data) payload = form_data.get('payload', [''])[0] if payload: encrypted_payload = encrypt_payload(payload) logging.info(f"加密请求: {payload} -> {encrypted_payload}") self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() self.wfile.write(encrypted_payload.encode('utf-8')) else: self.send_error(400, 'Missing payload parameter') except Exception as e: logging.error(f"处理请求时出错: {e}") self.send_error(500, 'Internal Server Error') def do_GET(self): """处理GET请求""" self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() self.wfile.write("^_^nrhello jsEncrypter!".encode('utf-8')) def run_server(host: str, port: int): """启动HTTP服务器""" server_address = (host, port) httpd = ThreadingHTTPServer(server_address, EncryptHandler) logging.info(f"[*] jsEncrypterPython start!") logging.info(f"[+] address: http://{host}:{port}") try: httpd.serve_forever() except KeyboardInterrupt: logging.info("[*] 接收到中断信号,服务器正在关闭...") httpd.server_close() if __name__ == "__main__": print(ASCII_ART) parser = argparse.ArgumentParser(description='Python实现的JS加密服务') parser.add_argument('--host', default='127.0.0.1', help='服务器监听地址') parser.add_argument('--port', type=int, default=1664, help='服务器监听端口') args = parser.parse_args() run_server(args.host, args.port)
然后爆破
由于burp没有对password对应值遍历然后再对整体爆破的模块只能选择这种方式
最终效果
原文始发于微信公众号(嵩艺):jsrpc联动jsEncrypte插件
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论