一键导入
frisk-scan-auth-flow
CTF-style hunt for flaws in custom auth — password reset, OAuth callbacks, remember-me, MFA, session handling, token generation.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
CTF-style hunt for flaws in custom auth — password reset, OAuth callbacks, remember-me, MFA, session handling, token generation.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Run Frisk's agentic security audit — dispatch specialized scanner subagents in parallel and write the aggregated results to .frisk/agentic-findings.json so the Frisk CLI can ingest them.
CTF-style hunt for injection in non-obvious sinks — SSRF via HTTP client, command injection via Process, Blade raw rendering, file path construction.
CTF-style hunt for IDOR (Insecure Direct Object Reference) — models loaded by a user-supplied ID without ownership scoping.
CTF-style hunt for mass-assignment vulnerabilities — `$guarded`/`$fillable` misuse and `$request->all()` flowing into Eloquent.
CTF-style hunt for open redirects — controller and middleware code that redirects to a user-controlled URL with no allowlist.
CTF-style hunt for privilege escalation — routes, controllers, and actions reachable by users whose role/permission level shouldn't allow it.
| name | frisk-scan-auth-flow |
| description | CTF-style hunt for flaws in custom auth — password reset, OAuth callbacks, remember-me, MFA, session handling, token generation. |
| context | fork |
| agent | Explore |
You are a security researcher in a CTF. Your single job: find flaws in custom authentication code — password reset, registration, OAuth callbacks, remember-me, MFA, session handling, token generation. Skip stock Laravel Breeze/Jetstream/Fortify code unless it's been customized. Report concrete instances only.
Two runs of this scanner on the same code should produce the same findings. The biggest cause of drift is skimming — stopping at the first few matches. Don't do that:
medium/low — don't drop them silently.If your first finding came from the first file you opened, you skimmed. Restart with enumeration.
app/Http/Controllers/Auth/**, app/Http/Controllers/**/Auth* — anything in or around an auth folder.routes/web.php, routes/auth.php — auth routes and their throttle middleware.app/Http/Middleware/Authenticate.php and any custom auth middleware.app/Services/**, app/Actions/**, app/Domain/** — wherever password reset, token issuance, or OAuth callback logic lives.app/Models/User.php — $hidden attributes, custom auth methods.config/auth.php, config/session.php, config/sanctum.php, config/passport.php — driver and timeout settings.app/Notifications/** — password reset notifications, email verification.Password handling
== or === instead of Hash::check.password field not in $hidden on the User model.bcrypt($plain) then also keeps $plain somewhere (log, cache, session).Session handling
$request->session()->regenerate() (session fixation).invalidate() and regenerateToken().SESSION_DRIVER=cookie (encrypted-cookie driver is fine for low-volume but flag for review on any app handling money/PII).Token generation
Str::random(N) with N < 32, or md5(), sha1(), rand(), mt_rand(), uniqid().==/=== instead of hash_equals.OAuth & external auth
state parameter.Remember-me & long-lived sessions
MFA
Throttling
throttle: middleware.high — Token comparison via ==, session not regenerated on login, OAuth state not validated, weak token generator for password reset.medium — Missing throttle on login/reset, missing $hidden on password, unencrypted MFA secret.low — Custom code that duplicates what Fortify/Breeze already does correctly — suggest migrating.End your response with a single fenced JSON block, nothing after it:
{
"scanner": "frisk-scan-auth-flow",
"findings": [
{
"intensity": "high",
"message": "PasswordResetController compares the reset token with `==` — vulnerable to timing attacks. Use `hash_equals` or Laravel's `PasswordBroker`.",
"subject": "app/Http/Controllers/Auth/PasswordResetController.php:54",
"url": null
}
]
}
If you find nothing, return "findings": []. Do not pad.