REFACTOR : findings를index가 아닌 모듈애서 만들도록 수정

This commit is contained in:
KMINGON 2025-05-31 12:37:54 +09:00
commit f1b5ef5f9b
2 changed files with 40 additions and 12 deletions

View file

@ -1,22 +1,46 @@
import type { Request, Response } from "caido:utils"; import type { Request, Response } from "caido:utils";
import type { SDK, DefineAPI } from "caido:plugin";
// 토큰 누출 검사 결과를 담는 구조 // 토큰 누출 검사 결과를 담는 구조
export interface TokenLeakResult { export interface TokenLeakResult {
found: boolean; // 토큰이 발견되었는지 여부 (true/false) found: boolean; // 토큰이 발견되었는지 여부 (true/false)
location: 'url' | 'body' | 'header'; // 토큰이 발견된 위치 (url, body, header 중 하나) location: 'url' | 'body' | 'header'; // 토큰이 발견된 위치 (url, body, header 중 하나)
title: string; // 경고 제목 title: string; // 경고 제목
description: string; // 상세 설명 description: string; // 상세 설명
value?: string; // 실제 발견된 값 (선택적) value?: string; // 실제 발견된 값 (선택적)
} }
// 액세스 토큰 누출 검사 클래스 // 액세스 토큰 누출 검사 클래스
export class AccessTokenLeakController { export class AccessTokenLeakController {
async testReq(sdk: SDK<DefineAPI<{}>>, request: Request): Promise<void> {
/** const result = await this._scanRequest(request);
* @param request - HTTP if (result) {
* @returns , null await sdk.findings.create({
*/ title: result.title,
async testReq(request: Request): Promise<TokenLeakResult | null> { description: result.description,
request,
reporter: "",
});
}
}
async testResp(sdk: SDK<DefineAPI<{}>>, response: Response, request: Request): Promise<void> {
const result = await this._scanResponse(response);
if (result) {
await sdk.findings.create({
title: result.title,
description: result.description,
request,
reporter: "",
});
}
}
/**
* @param request - HTTP
* @returns , null
*/
async _scanRequest(request: Request): Promise<TokenLeakResult | null> {
// === 1. URL에서 토큰 검사 === // === 1. URL에서 토큰 검사 ===
const url = request.getUrl(); const url = request.getUrl();
@ -60,7 +84,7 @@ export class AccessTokenLeakController {
* @param response - HTTP * @param response - HTTP
* @returns , null * @returns , null
*/ */
async testResp(response: Response): Promise<TokenLeakResult | null> { async _scanResponse(response: Response): Promise<TokenLeakResult | null> {
// === 1. Location 헤더에서 토큰 검사 === // === 1. Location 헤더에서 토큰 검사 ===
const locationHeader = response.getHeader("Location"); const locationHeader = response.getHeader("Location");

View file

@ -4,6 +4,7 @@ import type { Request, Response } from "caido:utils";
// import { AuthZCodeGrantController } from "./controller/authZCodeGrant"; // import { AuthZCodeGrantController } from "./controller/authZCodeGrant";
import { CsrfCheck } from "./controller/csrfCheck"; import { CsrfCheck } from "./controller/csrfCheck";
import { PKCECheck } from "./controller/PKCECheck"; import { PKCECheck } from "./controller/PKCECheck";
import { AccessTokenLeakController } from "./controller/accessTokenDetector";
export type API = DefineAPI<{}>; export type API = DefineAPI<{}>;
@ -11,6 +12,7 @@ const csrfCheck = new CsrfCheck();
// const implicitGrantController = new ImplicitGrantController(); // const implicitGrantController = new ImplicitGrantController();
// const authZCodeGrantController = new AuthZCodeGrantController(); // const authZCodeGrantController = new AuthZCodeGrantController();
const pkceCheckController = new PKCECheck(); const pkceCheckController = new PKCECheck();
const tokenCheck = new AccessTokenLeakController();
export function init(sdk: SDK<API>) { export function init(sdk: SDK<API>) {
// sdk.events.onInterceptRequest(async (sdk, req: Request) => { // sdk.events.onInterceptRequest(async (sdk, req: Request) => {
@ -30,6 +32,8 @@ export function init(sdk: SDK<API>) {
async (sdk: SDK<DefineAPI<{}>, {}>, req: Request, resp: Response) => { async (sdk: SDK<DefineAPI<{}>, {}>, req: Request, resp: Response) => {
await csrfCheck.checker(sdk, req, resp); await csrfCheck.checker(sdk, req, resp);
await pkceCheckController.test(sdk, req); await pkceCheckController.test(sdk, req);
await tokenCheck.testReq(sdk, req);
await tokenCheck.testResp(sdk, resp, req);
// sdk.events.onInterceptRequest(async (sdk, req: Request) => { // sdk.events.onInterceptRequest(async (sdk, req: Request) => {
// const result = // const result =
// authZCodeGrantController.testReq(req) || // authZCodeGrantController.testReq(req) ||