книги хакеры / журнал хакер / специальные выпуски / Специальный выпуск 52_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
m |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
Закладка Options окна восстановления данных |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
котором хранится информация о последних изменениях |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
данных. Только после этого можно приступать к восстанов- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
лению работы сервера на новом винчестере, и данные бу- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
дут восстановлены полностью. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ОРИГИНАЛЬНОСТЬ - СЕСТРА ХАКЕРА |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
Недавно я открыл для себя решение, отличное с точки |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
зрения резервирования. Хотя это не совсем резервное ко- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
пирование, но оно решает задачу именно резервирования |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
данных. В современных базах данных есть возможность |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
репликации данных - мощная штука, принцип работы кото- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
рой продемонстрирую на примере. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Допустим, у нас есть два удаленных офиса, в каждом из |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
которых происходит массовая нагрузка на сервер данных. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Можно расположить один сервер в главном офисе, а вто- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
рой будет обращаться к базе через интернет. Но это доста- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
точно большая нагрузка на сеть с точки зрения трафика, и |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
скорость доступа не высока. Намного эффективнее распо- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ложить два сервера в каждом из офисов, а потом серверы |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
данных будут синхронизироваться. Процесс синхрониза- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ции как раз и называется репликацией. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
А что если в эту систему поставить еще один сервер, кото- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
рый тоже будет участвовать в репликации, но не будет ис- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
пользоваться в работе? Получится реальный сервер, кото- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
рый будет железной резервной копией. Будут проблемы - |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
можно в считанные секунды превратить резервный сервер в |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
рабочий, и он будет содержать реально работающие данные. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Правда, свежатина этих данных зависит от настроек реплика- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ции (как восстановление от настроек резервирования). |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ИТОГО |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
От потери данных никто не застрахован, а они регуляр- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
но теряются и причин для этого много: выход из строя обо- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
рудования, воровство техники, стихийные бедствия, пожа- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ры, терроризм, алкоголизм, каннибализм и хакеризм. Как |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
видишь, причин очень много. Конечно же, вероятность |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
возникновения некоторых из них слишком мала, но она |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
есть. А если сложить все вместе, то общая вероятность по- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
тери данных становится высокой настолько, что можно |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
глубоко задуматься об этом. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Так почему же большинство из нас не задумывается о |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
возможных проблемах, пока сами не столкнутся с ними? |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Виновником, как всегда, является простая человеческая |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
лень, с которой надо бороться. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Необходимо делать все, чтобы данные ни в коем случае |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
не были утеряны бесследно и чтобы затраты на восстанов- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ление были минимальны. Мы постарались показать тебе |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
самое интересное из теории резервирования и восстанов- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ления. Практика и нюансы зависят от конкретной СУБД, но |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
это уже нюансы. E |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
m |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
Перебор числа столбцов |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Возможные последствия SI |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пробелы в запросе взломщик может |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
заменить на /**/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
СИТУАЦИЯ 1 |
не будет 0. Подобный способ был ис- |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Левый запрос возвращает лишь |
пользован в эксплойте для одной из |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
числовое значение. Что-то вроде |
версий phpBB. |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
SELECT code FROM artciles WHERE id = |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
$id. Что будет делать хакер? Средства |
СИТУАЦИЯ 2 |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
MySQL позволяют проводить различ- |
SQL Injection находится в середине |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ные действия над строками, к приме- |
SQL-запроса. Например: SELECT code |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ру, выделение подстроки, склеивание |
FROM artciles WHERE id = $id AND |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
нескольких строк в одну, перевод из |
blah='NO' AND active='Y' LIMIT 10. Äëÿ |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
CHAR в INT и т.п. Благодаря этим |
правильной эксплуатации хакер прос- |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
функциям хакер имеет возможность |
то откомментирует идущий следом за |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
выудить интересующую его информа- |
Injection код, то есть к вставляемому |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
цию по одному символу. К примеру, |
коду добавит /* или --. Пробелы в зап- |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
требуется достать пароль из таблицы |
росе взломщик может заменить на |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
admins, используя приведенный вы- |
/**/, что полезно в случае если |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ше запрос. Чтобы получить ASCII-код |
скрипт фильтрует пробелы. |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
первого символа пароля, сделаем |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
следующий запрос к скрипту: |
СИТУАЦИЯ 3 |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
http://127.0.0.1/read.php?cid=1+union+select+ASCII(SUBSTRING(pa |
Случается и такое, что в PHP-коде |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ssword,1,1))+from+admins. Функция SUB- |
подряд идет несколько SQL-запросов, |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
STRING(name,$a,$b) в MySQL выделя- |
подверженных Injection. И все они ис- |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ет $b символов из значения столбца |
пользуют переменную, в которую зло- |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
name начиная с символа под номером |
умышленник вставляет SQL-код. Нап- |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
$a. Функция ASCII($x) возвращает |
ример (опускаю PHP): |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ASCII-код символа $x. Для получения |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
последующих символов следует прос- |
$result=mysql_query("SELECT article_id, article_title |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
то менять второй параметр функции |
FROM articles where category_id=$cid"); |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
SUBSTRING до тех пор, пока ответом |
//php code here |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
» |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Часть SQL-запроса |
|
|
|
|
|
|
|
|
|
|
|
|
|

Теперь поговорим о том, когда и что резервировать. Если ты выбрал для себя простую модель, то при создании резервной копии сможешь выбрать создание полной резервной копии (Database complete) или дифференцированной (Database differential). Если выбрать Database complete, то
жалобы на вечные тормоза. В этом случае резервные
Восстановление данных зависит от метода резервирования. Если делали полную копию, то достаточно просто ее восстановить. Если производилось дифференцированное резервирование, то сна- чала нужно восстановить последнюю пол-
Все вышеописанные рекомендации относятся только к восстановлению данных в нормальной работе или при сбое и использовании модели Simple. Такое восстановление позволяет вернуть базу данных в ее состоянии на момент последнего резервирования. Все изменения, сделанные после этого, будут безвозвратно утеряны.
Служба SQL Server Agent предоставляет возможность контроля над выполнением всех заданий в среде MS SQL Server. С помощью данного инструмента можно определять многошаговые задания для их автомати- ческого выполнения в системе, при- чем управлять всеми процессами на сервере базы данных можно централизованно - из единого центра. Самое приятное заключается в том, что тебе самому в этом центре находиться совершенно не обязательно. Некоторые шаги по настройке задания можно сделать несколькими способами – с помощью ActiveX Script (написать код на языке сценариев), команд Transact SQL (встроенный язык запросов SQL Server), CmdExec (запустить какой-ни- будь exe’шник) или задания, связанного с репликацией данных.
Для успешного выполнения задач, связанных с администрированием MS SQL Server 2000, можно и нужно использовать электронную почту, но для этого потребуются службы SQL Server Agent (SQLAgentMail) и MS SQL Server (SQL Mail). После настройки они самостоятельно устанавливают соединение с почтовым сервером, например, с серверами MS Exchange, POP3 и Windows NT Mail.
Новые задания можно создавать не только средствами SQL Server Manager. На сервере баз данных существует специальная оснастка – мастер по созданию планов сопровождения (Database Maintenance Plan Wizard). Он поможет нам создать набор задач, которые будут выполняться регулярно, чтобы поддерживать базы данных в рабочем состоянии. Как и все мастера от Windows, он задаст нам несколько вопросов и предложит несколько вариантов ответа на каждый заданный вопрос.
Классический пример уязвимости типа SQL Injection - следующий запрос: SELECT * FROM admins WHERE login='$login' AND password=MD5('$password').
Правило ¹1. Фильтруй входные данные. Кавычку заменяй на слеш-кавычку(\'), слеш - на слеш-слеш. В PHP это делается или включением magic_quotes_gpc в php.ini, или функцией addslashes(). В Perl: $id=~s/(['\\])/\\$1/g;. И на всякий случай: $id=~s/[a-zA- z]//g; - для числовых параметров.
Правило ¹2. Не дай кому не надо внедрить SQL-код! Заключай в кавычки все переменные в запросе. Например, SELECT * FROM users WHERE id='$id'.
Правило ¹3. Отключи вывод сообщений об ошибках. Некоторые программисты, наоборот, делают так, что при ошибке скрипт выводит сообщение самого MySQL, или, еще ужасней, - ВЕСЬ SQL-зап- рос. Это предоставляет злодею дополнительную информацию о структуре базы и существенно облегчает эксплуатацию.
Правило ¹4. Никогда не разрешай скриптам работать с MySQL от root. Ничего хорошего не выйдет, если хакер получит доступ ко всей базе.
Правило ¹5. Запускай публичные скрипты от отдельного пользователя с отдельной базой. Неприятно будет, если какой-нибудь кидди, воспользовавшись 0day-дырой в форуме, получит доступ к базе с СС твоих клиентов.
Правило ¹6. Отключи MySQL-пользователю привилегию FILE - не дай хакеру записать в файл что-то вроде <?system($_GET[cmd])?> через MySQL.
Правило ¹7. Не называй таблицы и базы данных в соответствии с их назначением, чтоб утаить от чужих глаз настоящие названия. В публичных скриптах часто предоставляют возможность установить prefix для названия таблиц - устанавливай самый сложный. Если кто-нибудь и найдет SQL injection, то не сможет ее эксплуатировать.
Вернемся к скрипту получения заголовков статей. На самом деле он позволяет взломщику получить гораздо больше, чем список всех статей. Дело в том, что в MySQL версии 4 добавлен новый оператор - UNION, который используется для объединения результатов работы нескольких команд SELECT в один набор результатов. Например: SELECT article_id, article_title FROM articles UNION SELECT id, title FROM polls. В результате MySQL возвращает N записей, где N - количество записей из результата запроса слева плюс количество записей из результата запроса справа. И все это в том порядке, в каком идут запросы, отделяемые UNION.
Теперь рассмотрим некоторые ситуации, в которых использование UNION затруднено по тем или иным причинам.