A 48-hour web security audit (Laravel, Node.js, WordPress)

A 48-hour web security audit (Laravel, Node.js, WordPress)

Updated: 15 min read
  • Security
  • Audit
  • Laravel
  • WordPress
  • Node.js
  • OWASP

A useful audit is not an 80-page PDF or a theater of green tool dashboards. It means finding what can take down the application or leak data, proving it with evidence, and deciding what to fix first.

This 48-hour methodology applies to PHP/Laravel, Node.js, and WordPress applications (multisite, Elementor, stores with payments). When there is ecommerce or local gateways, it includes checkout and webhooks — the same surface that usually causes real incidents.

Why it matters (beyond “compliance”)

Think of security as the lock on a shop: it does not replace the business, but without it anyone can walk in. An early finding costs a sprint; an incident costs customers, reputation, and days of firefighting.

  • Money: manipulable payments or unsigned webhooks.
  • Data: orders or users visible via IDOR.
  • Operations: admin without MFA, abandoned plugins, public .env.
  • Priority: without P0/P1/P2, everything feels urgent and nothing ships closed.

Key concepts in plain language

  • Attack surface: everything a stranger can touch (forms, APIs, uploads, admin).
  • Authentication vs authorization: “who you are” vs “what you may do”. Different failures.
  • IDOR: changing /orders/100 to /orders/101 and seeing someone else’s order.
  • Injection: feeding data the system treats as instructions (SQL, XSS, path traversal).
  • Dependencies: third-party code with known bugs; updating is also security.

48-hour breakdown

Hours 0–4: attack surface map

  • Inventory of public routes (web + API).
  • Forms, uploads, payment webhooks, cron endpoints.
  • Current headers, cookies, redirects.
  • On WordPress: version, child theme, active plugins, administrator users.
  • On multisite: sites, super-admins, and network plugins.

Hours 4–16: authentication and session

  • Password reset, user enumeration, rate limiting.
  • Secure / HttpOnly / SameSite cookies.
  • CSRF on state-changing forms.
  • JWT: exp, rotation, insecure storage in localStorage.
  • WordPress admin or Filament/Horizon exposed without MFA.

Hours 16–32: injection and business logic

  • Misused SQL / ORM, stored XSS, path traversal.
  • Mass assignment in Laravel ($fillable / $guarded).
  • IDOR: can you view order #id+1?
  • On payments: confirm the amount is not trusted from the client.
  • Uploads: real file type, not just the extension.

Hours 32–48: dependencies and deliverable

  • composer / npm audit with judgment (noise vs real risk).
  • Abandoned WordPress plugins or those with known advisories.
  • Secrets in repo, exposed .env, public backups.
  • P0/P1/P2 report + remediation plan by sprint.

Laravel: review points

  • Validation with Form Requests on all API inputs.
  • Authorization: Policies/Gates on show/update/destroy.
  • Mass assignment: models with $guarded = [] or dangerous fillables.
  • Files: private Storage disk; signed URLs.
  • Queues with backoff and dead-letter; payloads without unnecessary PII.
  • APP_DEBUG=false in prod; Telescope/Horizon not public.

WordPress: review points

  • Remove generic admin user; review roles; 2FA on privileged accounts.
  • XML-RPC: disable if no legitimate app needs it.
  • REST: user endpoints that leak information.
  • Uploads: execution blocked in uploads.
  • WooCommerce: updated gateway plugins; webhooks with minimum permissions.

Common “audit” mistakes

  • Trusting only an automatic scanner without validating findings by hand.
  • Ignoring business logic (amounts, order IDs, role permissions).
  • Delivering a CVE list without prioritizing impact on this product.
  • Skipping deploy review: the same secret or old plugin returns in the next release.
  • Marking everything critical: the team saturates and does not fix what is exploitable today.

Practical checklist

  1. Are .env, .git, or backups accessible by URL?
  2. Do login, reset, and sensitive APIs have rate limiting?
  3. Do session cookies have correct flags on HTTPS?
  4. Is CSRF active on state-changing forms?
  5. Do policies/capabilities exist and get called on every route?
  6. Do uploads validate real MIME types?
  7. Do payment webhooks validate signature/origin and are idempotent?
  8. Do security headers (CSP, HSTS) exist without breaking the front end?
  9. Do critical dependencies have an update owner?
  10. Can deploy reintroduce the same secret or old plugin?

Deliverable format

PriorityCriteriaExample
P0Exploitable now / high impactRCE, SQLi, manipulable payment, public .env
P1High riskStored XSS, order IDOR, CSRF on sensitive actions
P2HardeningIncomplete headers, old plugins not yet exposed

Each finding includes: where, how to reproduce, risk, suggested fix, and relative effort. Connects with DevOps and Coolify, and cybersecurity .

Frequently asked questions

Does a 48-hour audit replace a long pentest?

No. It is a high-impact cut: public surface, auth, obvious injection, headers, plugins, and dependencies. A deep pentest can follow if the business requires it.

Does it work for WordPress or only Laravel?

Both. On WordPress we review themes, plugins, users, XML-RPC, uploads, and updates. On Laravel we review mass assignment, policies, validation, and queues.

What is delivered at the end?

Prioritized findings (P0/P1/P2) with evidence, risk, suggested remediation, and a sprint plan. Not a decorative PDF with no owner.

Is performance reviewed too?

When the brief asks for it, security is combined with bottlenecks (N+1, cache, TTFB). Often a misconfigured header and a slow query live in the same release.

Can fixes be implemented?

Yes. Scope can be limited to diagnosis or extended to remediation and ongoing hardening. That must be clear from the start.