Data Extraction

Overview

Full database enumeration using time-based blind SQLi:

  1. Enumerate database name

  2. Enumerate table names

  3. Enumerate column names

  4. Extract data


Helper Functions

Dump Number (SQL-Anding)

def dumpNumber(q):
    """Extract a number (0-255) using bitwise operations"""
    length = 0
    for p in range(7):
        if oracle(f"({q})&{2**p}>0"):
            length |= 2**p
    return length

Dump String


Step 1: Enumerate Database Name

Get Length

Output: 8

Get Name

Output: digcraft


Step 2: Enumerate Table Names

Get Table Count

Output: 2

Get Table Names

MSSQL Pagination (no LIMIT/OFFSET like MySQL):

Output:


Step 3: Enumerate Column Names

Get Column Count

Output: 1

Get Column Names

Output:


Step 4: Extract Data

Enumerated So Far

Item
Value

Database

digcraft

Tables

flag, userAgents

Columns (flag)

flag

Get Row Count

Output: 1

Get Data Length

Output: 37

Extract Data


Complete Extraction Script


MSSQL Pagination Reference

MySQL Style (NOT available in MSSQL)

MSSQL Style


Performance Notes

Why SQL-Anding?

With time-based injection, optimization is critical:

Algorithm
Requests/Char
Time/Char (3s delay)

Linear

~64 avg

~192 seconds

SQL-Anding

7

~21 seconds

Bisection

7

~21 seconds

For a 32-character string:

  • Linear: ~102 minutes

  • Optimized: ~11 minutes


Extraction Summary


Quick Reference

Key Queries

Last updated