← Back to posts

11 min read

Your Scanner Solved the Login. It Never Solved the Logic.

Filed under API Auth

Authenticated scanning is the most oversold line on a DAST feature checklist. It does real work, and it still leaves your most expensive bugs untouched. Buyers keep reading "the scanner can log in" as "the scanner covers what happens after the login." Those are two different claims, and the gap between them is where your next breach report lives.

I keep seeing the same pattern: a team upgrades to login-aware scanning, the authenticated crawl completes, the report comes back clean, and the next manual test finds a cross-tenant data read in the first hour. The scanner did its job. The job was smaller than the invoice suggested.

What login-aware scanning actually does under the hood

Strip the marketing off and authenticated DAST is plumbing. Good plumbing, but plumbing:

  • A recorded login sequence or script the scanner replays to obtain a session.
  • Session state handling: the cookie or bearer token gets captured, attached to later requests, and refreshed when the scanner detects it has been logged out.
  • MFA dealt with through test accounts, seeded TOTP secrets, or a staging environment with relaxed policies.
  • A crawler that can finally see routes, forms, and API calls that only exist for a logged-in user.

That list genuinely raises coverage. Surface area the scanner used to bounce off is now reachable. Here is what does not change: the detection engine. It still evaluates one request at a time, it still matches responses against signatures of attacks it has seen before, and it still acts as a single identity. BrightSec describes enterprise DAST as built on the assumption that a vulnerability can be identified by examining a single request or response for known indicators, and calls that a structural limitation rather than a vendor defect. Their phrasing is blunt: "DAST tests one request at a time. It sees patterns it has seen before."

Authentication changes what the scanner can reach. It does nothing for what the scanner can reason about.

The confidence trap

Green means "no signature matched"

A green unauthenticated scan is easy to dismiss. Of course it found nothing, it never got inside. A green authenticated scan feels like a verdict on the application, and it is not one. It is a verdict on a single class of bug: the technical flaws with known signatures, the SQL injection and cross-site scripting that BrightSec says enterprise DAST catches without much trouble.

Silence on that report means "no signature matched." Teams file it as "the workflows are safe." The report said no such thing, because the tool never looked at a workflow.

The flaws that only exist past the login

Skipped steps and broken sequences

Each step tests clean. The skip is the bug.

BrightSec's checkout example is the canonical one: one endpoint validates the cart, a second applies a discount, a third handles payment. Each tests clean in isolation. Call the payment endpoint directly, skip the steps you dislike, and the order may go through at the wrong price. As Dror puts it, "The flaw is in the sequence, not any one piece of it." Modern architecture makes this worse, because a single user action now commonly fans out into a chain of API and microservice calls, and every hop is a step an attacker can skip, replay, or reorder.

The two-user problem: roles and objects

The easy version of IDOR is a single-session object swap: change /orders/1001 to /orders/1002 as one logged-in user and see what comes back. Some scanners attempt this, and BrightSec even lists IDOR among DAST's strengths. The expensive version needs two valid identities: user A's session pointed at user B's objects, a support role doing admin work, a member of org one reading org two's invoices. Your scanner runs as one principal. It has no second identity and no written statement of who should see what, and detections that assume a single actor keep failing the same way elsewhere. MojoAuth's Victor Singh nails the stakes: "a missing post-authentication check is often the difference between a user viewing their own data and viewing anyone's".

Notice the tension in BrightSec's own taxonomy: IDOR sits in the "DAST is solid" list while loosely enforced role checks get classed as business logic. The difference between the two rows is whether the test requires a model of intent. That difference is the whole argument of this article.

Races and replays

Race conditions that let a transaction process twice. Coupons stacked or reused beyond their terms. A scanner fires requests serially and inspects what comes back, so a flaw that only appears when two requests land at the same instant, or the same request lands twice, never triggers. Every individual request is well-formed. There is no payload to signature.

Rules that live in someone's head

Dror's definition: "A business logic vulnerability is a mismatch between the intended purpose of an application and the way it can be manipulated." Approval steps skipped one at a time. A refund workflow that lets the requester also approve. These flaws are application-specific with no universal signature, which is exactly why signature matching cannot reach them. If you want proof that a sequence of individually benign inputs can break a system, look at how GPT-6 Astra fell in under 24 hours to a prompt with nothing malicious in it. Logic attacks work the same way: every step legal, the outcome wrong.

The login itself is only half-tested

One more uncomfortable detail. Even the thing authenticated DAST is named after is partially outside its reach. MojoAuth's breakdown credits DAST with catching runtime session problems: improper expiration, invalidation, session reuse and fixation, plus MFA bypass and brute-force weaknesses. SAST picks up code-level issues like predictable token generation. But identity-provider configuration, SSO settings, OAuth and SAML wiring, and MFA policy all sit outside application code and observable runtime behavior, beyond both tool classes. So "the scanner authenticated successfully" tells you less about the login than you assumed, before you even get to everything after it.

The different pass: test the workflow, not the request

The fix is not a bigger scanner license. It is a small, separate pass built around intent.

Write abuse cases first

Before anyone touches a proxy, take your highest-stakes workflows and write statements of what must never happen:

  • The system must never let a payment complete for a cart that was not validated in this session.
  • The system must never let one account redeem the same discount code twice.
  • The system must never let a user approve a refund they requested.
  • The system must never let one org's member read another org's object, even with a valid ID.

Scope by blast radius. A workflow earns this pass if it moves money, grants or changes access, or alters records other people depend on. For most apps that is three to five workflows, not fifty. Everything else stays with the scanner, which handles it fine.

Run the role matrix with two live sessions

Write down expected behavior as a matrix. Example for an order and refund flow:

ActionCustomerSupport agentOrg admin
GET own order200200 with case link200
GET another tenant's order404404404
Request refund on own order202 pending202 pending202 pending
Approve a refund they requested403403403

Every cell the scanner cannot fill in without a second identity or a written rule is a cell your DAST report says nothing about. Then test the cells with two real sessions:

bash
# TOKEN_A belongs to user A (org 1). Order 10042 belongs to user B (org 2).

# Baseline: A reads A's own order. Expect 200.
curl -s -o /dev/null -w "%{http_code}\n" \
  -H "Authorization: Bearer $TOKEN_A" \
  https://api.example.com/orders/10007

# Cross-tenant read: A asks for B's order. Expect 403 or 404. A 200 is a finding.
curl -s -o /dev/null -w "%{http_code}\n" \
  -H "Authorization: Bearer $TOKEN_A" \
  https://api.example.com/orders/10042

# Replay: submit the same payment twice. One charge expected, two is a finding.
for i in 1 2; do
  curl -s -o /dev/null -w "%{http_code}\n" \
    -X POST -H "Authorization: Bearer $TOKEN_A" \
    -H "Content-Type: application/json" \
    -d '{"cart_id":"c-8812","amount":129.00}' \
    https://api.example.com/payments
done

For each workflow, run four moves minimum: skip a step, replay a step, swap the order of two steps, and execute a step as the wrong role. This takes hours, not weeks, and it is where the findings are.

Time-box the human pass or it will never happen

BrightSec notes features that took months now ship in weeks, with AI assistance compressing timelines further. You will never manually test everything at that cadence, so do not try. One or two focused days per release cycle on the top workflows beats a vague annual pentest. A tester who knows the intended rules of one workflow will outfind a scanner that knows every payload ever published.

The two objections worth answering

"My vendor says we do IDOR detection and multi-step scanning." Partly true, and mostly beside the point. The detectable IDOR is the degenerate single-session swap. The moment a test needs two identities, a concurrency window, or a statement of intended behavior, you are outside the engine, and BrightSec's own split of IDOR versus role-check flaws quietly admits it.

"Manual testing does not scale." Correct, and irrelevant. You are not retesting the whole application, you are testing the workflows where a miss costs money or access. Singh's line applies: "no single automated tool is likely to catch everything", and MojoAuth's own conclusion is the mix mature teams land on: SAST, DAST, IAST, plus manual testing. Your scanner keeps its job. It stops being the entire program.

If the role-matrix and object-level checks above sound like the work your team never quite gets to, that is the gap we built for. If you want the auth and object-level checks in this article run against a live app, start with Axeploit's API security checker. It will not do the workflow thinking for you, but it takes the two-session and auth-behavior checks off your plate.

Key takeaways

  • Authenticated DAST fixes access, not understanding. The engine still judges one request at a time, as one identity, against signatures of known attacks.
  • A clean authenticated report means the technical bug classes are quiet. It says nothing about your workflows, so stop treating it as a verdict on them.
  • The bugs buyers actually get burned by, skipped steps, cross-tenant reads, double charges, self-approved refunds, all require sequence awareness, a second principal, or a written rule. Scanners have none of those.
  • The different pass is small: abuse cases for your top three to five workflows, a role matrix exercised with two live sessions, four moves per workflow (skip, replay, reorder, wrong role), time-boxed per release.
  • Even the login is only half-covered. IdP configuration, SSO, and MFA policy sit outside SAST and DAST alike, so validate those separately.
Get started

Integrate Axeploit into your workflow today