# 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.*