---
# System prepended metadata

title: SQL Injections 101

---

# 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 легко интегрируется с другими языками программирования, а потому, уже давно исопльзуется в написании сайтов. Рассмотрим небольшой пример: простенькая страничка с авторизацией. У нее одна задача: брать креды, которые вводит пользователь, сравнивать их с информацией в БД, и в зависимости от того совпадают ли введеные креды с существующими, пропускает или не пропускает пользователя на требуемую страницу. Ниже представленны: сама страничка и вид запроса, который формирует наш браузер к этой странице.
![](https://i.imgur.com/uRJYmcY.png)
![](https://i.imgur.com/fSeC3S1.png)


Мы, как пользователь, вводим креды, которые на сервере обрабатываются запросом такого типа( 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')~~
Таким образом, что перечеркнутая часть окажется закомментированной, а следовательно, не учавствующей в проверке. Следовательно, проверка кредов свелась к тому, что мы проверяем ИСКЛЮЧИТЕЛЬНО наличие логина.

Так и решактеся наш первый таск:

![](https://i.imgur.com/b5bQBeD.png)

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

## Атенсьион, снова таск.

На этот раз, рассмотрим таск с portswigger Academy. 
![](https://i.imgur.com/b5b8gwl.png)

Что нам говорит задание? При помощи изменения запроса, достать из базы данных некую непредставленную инфу. 
![](https://i.imgur.com/x3VLNub.png)


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

Тут вполне четко видим, что пользователь имеет доступ только к одному полю - полю категорий, а следовательно, просто поменять версии на не-релизные не получится. А это значит, что мы снова отбросим ненужную часть, как уже делали до этого.

 Однако, этого еще не достаточно.Теперь, если бы мы просто добавили кавычку и комментарий, ничего бы не произошло: он бы просто вывел нам  все содержимое в данной категории. 

SELECT * FROM products WHERE categoty = 'Gifts' - явно не достаточный запрос, чтобы вывести ВСЕ содержимое. Для этого, мы изменим запрос до следующего вида:

SELECT * FROM products WHERE categoty = 'Gifts' or 1=1.

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

![](https://i.imgur.com/D4Sc5Pe.png)

И вот, результат:
![](https://i.imgur.com/ZRRGkxS.png)




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

Stay Tuned.
*Wired Brain.* 