Соревнование хакеров по SQL-инъекциям


💡 Обзор

Инъекция SQL (SQLi) — это тип атаки кибербезопасности, направленный на приложения, управляемые данными, путем вставки или "инъекции" вредоносных операторов SQL в поле ввода веб-страницы. Успешный SQLi может позволить злоумышленнику читать конфиденциальные данные из базы данных, изменять данные базы данных (Insert/Update/Delete), выполнять административные операции над базой данных или даже получить root доступ к самой системе. SQLi Hacker Challenge — это шанс провести SQLi атаку на макет базы данных, который был разработан для этого испытания. В случае успеха у вас будет еще одна возможность ответить на несколько забавных бонусных вопросов.

Прежде чем мы начнем, давайте рассмотрим пример SQLiатаки.

Пример SQLi

Посмотрите на следующий пример, который создает оператор SELECT, добавляя в его конец переменную (user_id). Переменная извлекается из функции input().

user_id = input("User ID: ")
SQL_statement = f"SELECT * FROM Users WHERE user_id = {user_id};"
Вход в полноэкранный режим Выход из полноэкранного режима

Цель кода — создать оператор SQL для выбора пользователя с заданным user_id. При отсутствии мер безопасности пользователь может ввести в поле ввода ошибочные данные, например:

User Id: 776 OR 1=1
Войти в полноэкранный режим Выйти из полноэкранного режима

Это создаст следующий SQL-запрос:

SELECT * FROM Users WHERE user_id = 776 OR 1=1;
Ввести полноэкранный режим Выйти из полноэкранного режима

Приведенный выше оператор SQL является корректным и вернет ВСЕ строки из таблицы "Users", поскольку OR 1=1 всегда TRUE. Если таблица "Users" содержит имена пользователей и пароли, то хакер получит доступ ко всем именам пользователей и паролям в базе данных, просто вставив 776 OR 1=1 в поле ввода.

Задача хакера SQLi

Теперь, когда у вас есть базовое понимание того, как работает SQLi, давайте попробуем решить задачу SQLi Hacker Challenge.

Задание

Ваша задача — выполнить успешную SQLi атаку на макет базы данных, который был разработан для этой задачи, и просмотреть все ее содержимое.

Дизайн базы данных

База данных состоит из одной таблицы, и следующих трех столбцов:

  • id
  • username
  • password

Инструкции

Запустите следующий скрипт Python на вашей локальной машине, и вам будет предложено "Ввести SQL-инъекцию.". Продолжайте вводить данные, пока не добьетесь успеха в SQLi атаке!

#!/usr/bin/env python3
import sqlite3
import requests

# SQL statements:
CREATE_USERS_TABLE = "CREATE TABLE IF NOT EXISTS usernames (id INTEGER PRIMARY KEY, username TEXT, password TEXT);"
INSERT_USER_DATA = "INSERT INTO usernames (username, password) VALUES (?, ?)"


def get_userdata() -> list:
    """Returns username, and password in tuple from online username.dat file."""
    # url to username and password file
    URL = "https://pastebin.com/raw/ih7szSSv"
    raw = [i.strip() for i in requests.get(URL).text.split('n')]
    output = []
    for i in raw:
        users = i.split(', ')[0].split(',')[0]
        passwords = i.split(', ')[0].split(',')[1]
        output.append((users, passwords))
    return output


# Create database in memory
conn = sqlite3.connect(":memory:")
# Get usernames and passwords
user_data = get_userdata()

# Create table
conn.execute(CREATE_USERS_TABLE)
# Insert username, passwords into database
conn.executemany(INSERT_USER_DATA, user_data)


while True:
    INJECTION = input("Enter your SQL Injection:n>  ")
    sql = f"SELECT * FROM usernames WHERE id = 776 {INJECTION}"
    try:
        results = conn.execute(sql).fetchall()
        if results:
            print(f"n33[92m" + "Good job, you did it!" + "33[0m")
            with conn:
                for row in results:
                    print(row)
            conn.close()
            break
    except sqlite3.OperationalError as e:
        print("n33[91m" + "Nope, try again!" + "33[0m")
        pass
Вход в полноэкранный режим Выход из полноэкранного режима

Бонусные вопросы

После создания дампа базы данных попробуйте решить следующие бонусные вопросы.

  1. Расшифруйте пароль администратора. Подсказка: MD(101)
  2. В каком фильме 1995 года "crime/action/romance" сыграли эти пользователи? Подсказка: решите первый бонусный вопрос.

Заключение

Основной целью данного руководства было обучение основным приемам проведения SQLiатаки. Надеюсь, вы смогли успешно выполнить атаку SQLi и решить все бонусные вопросы. Если вы хотите получить лучший графический пользовательский интерфейс SQLi, загляните в лабораторию SQL Injection Lab, расположенную на Hacksplaining. Пожалуйста, оставляйте свои вопросы, опасения или комментарии ниже. Спасибо, что прочитали этот пост ~ удачи и приятного времяпровождения!


Код доступен на GitHub

Оцените статью
devanswers.ru
Добавить комментарий