# SQL Injections 101
## Write-up. Часть первая. Код и Зубы.
Здарова солнышки. Файнали, я решил написать райт-ап по инъекциям. Весь материал основывается на PortSwigger Academy, таски брал оттуда(плюс, пара с root me), так что, если хотите прорешать их - читайте теор.часть, не заглядывая в решения.
## Прежде чем начнем
Ссыл о4ка на все таски: https://portswigger.net/web-security/sql-injection
Чек-лист по поиску sql-injection: https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
Шпора от portswigger: https://portswigger.net/web-security/sql-injection/cheat-sheet
## Что такое SQL injection?
Не секрет, что большая часть современных веб-приложений использует базы данных. Учет товара, авторизации, куки: в общем, задач много. Любая база данных использует для обращений свой собственный язык, иначе - SQL (structured querry language). На самом деле он - не единственный, однако, общая логика схожа(особенно, в контексте тех уязвимостей, о которых мы говорим).
### Атенитоин, мусье. Далее рассматривается таск с root.me, так что, будь осторожен, и не наткинсь на решение, а попробуй решить сам. В дальнейшем, такие предупреждения будут висеть перед каждым такском :*
Собственно, SQL легко интегрируется с другими языками программирования, а потому, уже давно исопльзуется в написании сайтов. Рассмотрим небольшой пример: простенькая страничка с авторизацией. У нее одна задача: брать креды, которые вводит пользователь, сравнивать их с информацией в БД, и в зависимости от того совпадают ли введеные креды с существующими, пропускает или не пропускает пользователя на требуемую страницу. Ниже представленны: сама страничка и вид запроса, который формирует наш браузер к этой странице.


Мы, как пользователь, вводим креды, которые на сервере обрабатываются запросом такого типа( SELECT * FROM 'users' WHERE 'login'= '$$login_var' AND 'password' = '$$password_var'). Такой запрос проверяет, есть ли в таблице users в столбцах login и password введенные нами креды, и если оба существуют( логический оператора "и", привет), то авторизация считается успешной, т.к. сервер получает в ответ логическую единицу( запрос к БД выполнено корректно),и уже на этой авторизует нас(пользователя) на странице.
Теперь, ненадолго переключимся на то, что происходит с пользовательсикм вводом. Все просто: вокруг него появляются кавычки такого типа: 'admin'. Именно здесь мы и начнем творить наши злодейства. Теперь, если в ввод добавить следующие символы(кавычку и комментарий): admin'-- , тогда и запрос преобразуется в SELECT * FROM 'users' WHERE 'login'= 'admin' ~~--~~ ~~' AND 'password' = '$$password_var')~~
Таким образом, что перечеркнутая часть окажется закомментированной, а следовательно, не учавствующей в проверке. Следовательно, проверка кредов свелась к тому, что мы проверяем ИСКЛЮЧИТЕЛЬНО наличие логина.
Так и решактеся наш первый таск:

В целом, этого примера достаточно, чтобы показать суть sql-инъекций: мы видоизменяем запрос тем, что внедряем(как содержимое при инъекции) в проверяемый запрос (креды, например) таким образом, что его результат начинает устривать нас. О чем я конкретно? Чтобы понять, это, перейдем к следующему заданию.
## Атенсьион, снова таск.
На этот раз, рассмотрим таск с portswigger Academy.

Что нам говорит задание? При помощи изменения запроса, достать из базы данных некую непредставленную инфу.

Тут все достаточно просто. Вид запроса нам уже вежливо подсказывает сао описание таска : SELECT * FROM products WHERE category = 'Gifts' AND released = 1, где пункт released отвечает за то, чтобы выводился исключительно "выпущенный" товар(видимо, на сайте есть уже добавленный, но официально не выпущенный товар). Тепрь посмотрим, как выглядит наш запрос к сайту.

Тут вполне четко видим, что пользователь имеет доступ только к одному полю - полю категорий, а следовательно, просто поменять версии на не-релизные не получится. А это значит, что мы снова отбросим ненужную часть, как уже делали до этого.
Однако, этого еще не достаточно.Теперь, если бы мы просто добавили кавычку и комментарий, ничего бы не произошло: он бы просто вывел нам все содержимое в данной категории.
SELECT * FROM products WHERE categoty = 'Gifts' - явно не достаточный запрос, чтобы вывести ВСЕ содержимое. Для этого, мы изменим запрос до следующего вида:
SELECT * FROM products WHERE categoty = 'Gifts' or 1=1.
OR 1=1 - заранее истинное высказывание, которое здесь, чтобы стриггерить работу WHERE таким образом, чтобы вывелисб ВСЕ товары. ПОчему так происходит? Все просто, из запроса "Достань мне все из таблицы 'продукты', ГДЕ категория - 'подарок'", мы делаем запрос "Достань мне все из таблицы 'продукты', ГДЕ категория - 'подарок' или ИСТИНА". Это заставит запрос вытащить все товары из ВСЕХ категорий. ЧТо и произошло ниже.

И вот, результат:

Это только первая часть, где объяснена лишь самая простая. базовая часть. Еще вас ждут Union-based атаки и Blind sql.
Stay Tuned.
*Wired Brain.*