Уязвимость в системе безопасности

Viktor S.

Новичок
Уязвимость в системе безопасности

Всем привет,

За помощь в решении моей проблемы обещаю вознаграждение в любой эл. валюте.

Cайт: PHP v5.2.5, MySQL v5.0.81-community, Apache v2.0.63.

Уязвимость в системе безопасности. Я не могу сказать точно, где или в скрипте или на сервере.

Суть проблемы:

1. Есть возможность изменять данные в MySQL таблицах. Злоумышленник получил имена таблиц, поля и т.д.

Защита:

1. Выделил права только на определенные операции для каждого скрипта т. е. я знаю потенциально небезопасные скрипты точно. В моем случае там, где есть права на UPDATE и INSERT.
2. В начале каждого скрипта разместил код, удаляющий во всех входящих переменных все кроме: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._@. Проверяются: $_REQUEST (все), $_SESSION (все). $_SERVER["QUERY_STRING"] режется до 8 символов.
3. Конечно, все данные перед передачей в SQL запрос проверяются еще раз. Учитывая п. 2 возможность инъекции практически = 0 или нет?
4. В начале каждого скрипта: error_reporting(0) и ini_set('display_errors', '0').

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

Я сообщил минимум информации и прошу помощи, готов выложить все, что необходимо еще.
 

440hz

php.ru
90% атак идет или через закачанные скрипты или через полученные пароли и прямой доступ через админки.

ищи левый код.

=)
 

Viktor S.

Новичок
Автор оригинала: 440hz
90% атак идет или через закачанные скрипты или через полученные пароли и прямой доступ через админки.

ищи левый код.

=)
Левого кода нет точно, я сидел и смотрел.

Какую админку имеешь ввиду? Там cPanel, но пароли я менял ежедневно. Админка сайта не имеет возможности делать вставки в те таблицы, куда они были сделаны.

-~{}~ 18.01.10 21:11:

Автор оригинала: baev
— сколько?
Какова квалификация?
 

fixxxer

К.О.
Партнер клуба
>>Проверяются: $_REQUEST (все), $_SESSION (все)

ага. а потом берутся _GET, _POST и _COOKIE ? =)

>> 4. В начале каждого скрипта: error_reporting(0) и ini_set('display_errors', '0').

WRONG

error_reporting(E_ALL)
dispay_errors => 0
log_errors => 1

и читать логи

>> никак не могу найти

1) аудит сервера. auth.log, lastlog хотя бы. аксес и еррор логи на странное. ps auxwww на странное (учитывая что proctitle легко подменить - проверять что реально запущено). посмотреть не влит ли уже шелл или еще что подобное. посмотреть нет ли доступа к mysql снаружи. посмотреть логи mysql на подозрительные запросы (по бинлогам например).

grep 'http:' access.log и искать странное

egrep -i '(UNION|SELECT)' access.log на то же

2) по коду
grep -Ri eval *
egrep -Ri '(include|require).*\$' *
и искать remote exec/remote include

включить safe mode либо отрубить все shell_exec-подобные функции, смотреть еррор лог на тему

пройтись по sql-запросам, убедиться в отсутствии инъекций (самое простое: все числа обязательно inval, все строки обязательно "'" . mysql_real_escape_string($s) . "'", остальное ничего не должно подставляться из пользовательского ввода ваще).

включить логирование всех sql-запросов на уровне либы, если используется

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

Viktor S.

Новичок
ага. а потом берутся _GET, _POST и _COOKIE ? =)
Мать ... поправил (в любом случае все данные проверялись в скрипте, это я добавил чтоб выловить инъекцию). Только я вел логи $_REQUEST т. е. все что не проходило проверку писалось в лог. См. лог там ничего не было …
error_reporting(E_ALL)
dispay_errors => 0
log_errors => 1

и читать логи
Даже когда стоит: error_reporting(0) и ini_set('display_errors', '0') сообщения об ошибках (синтаксических например) все равно выводятся на экран + лог создается.
включить safe mode
Включен конечно.
пройтись по sql-запросам, убедиться в отсутствии инъекций (самое простое: все числа обязательно inval, все строки обязательно "'" . mysql_real_escape_string($s) . "'", остальное ничего не должно подставляться из пользовательского ввода ваще).
Режу все кроме: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._@
включить логирование всех sql-запросов на уровне либы, если используется
Уже сделано.
1) аудит сервера. auth.log, lastlog хотя бы. аксес и еррор логи на странное. ps auxwww на странное (учитывая что proctitle легко подменить - проверять что реально запущено). посмотреть не влит ли уже шелл или еще что подобное. посмотреть нет ли доступа к mysql снаружи. посмотреть логи mysql на подозрительные запросы (по бинлогам например).
2) по коду
grep -Ri eval *
egrep -Ri '(include|require).*$' *
и искать remote exec/remote include
Сторонний хостер. Я обращался к ним и получил ответ, что проблем с безопасностью нет и других жалоб не поступало по данному серверу.

-~{}~ 19.01.10 11:25:

fixxxer, спасибо за дельные советы. Посмотрим сегодня как оно будет.
 

phprus

Moderator
Команда форума
Viktor S.
Сторонний хостер.
Даже сторонние хостеры должны предоставлять хотя-бы логи вебсервера (access.log & error.log). А их уже можно проанализировать самому. В случае если атака была через веб, то в них что-то может быть (если их конечно не почистили).

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

Viktor S.

Новичок
Даже сторонние хостеры должны предоставлять хотя-бы логи вебсервера (access.log & error.log). А их уже можно проанализировать самому. В случае если атака была через веб, то в них что-то может быть (если их конечно не почистили).
Они есть, конечно буду см. более пристально.

А код все-же проверь. Вдруг в нем есть что-то лишнее. Для начала можно загрузить весь код с хостинга себе и сделать diff с оригинальными исходными кодами системы. Если это ничего не выявит, то можно поискать потенциально опасные места в коде.
Сделаю конечно. Только я много раз перезаписываю файлы (только от себя) + md5 сверяю. FTP account удалил вообще.

-~{}~ 19.01.10 12:04:

то можно поискать потенциально опасные места в коде
Что имеешь ввиду?
 

phprus

Moderator
Команда форума
Viktor S.
Что имеешь ввиду?
То-же, что и fixxxer. eval, все include, require, где имена файлов задаются не как константные строки, а как переменные или содержат в себе переменные и т.д.

Так-же если твой сайт дает твоим пользователям возможность загружать файлы, то обязательно надо проверить нельзя ли загрузить какой-либо файл, который может выполнится на сервере как php код, если открыть его напрямую из браузера.
 

fixxxer

К.О.
Партнер клуба
>>Я обращался к ним и получил ответ, что проблем с безопасностью нет и других жалоб не поступало по данному серверу.

ну как минимум last | grep ^твой_логин то они могут показать, если на твоем акке прав нету )

-~{}~ 19.01.10 12:12:

>>Даже когда стоит: error_reporting(0) и ini_set('display_errors', '0') сообщения об ошибках (синтаксических например) все равно выводятся на экран + лог создается.


не надо пренебрегать варнингами и нотисами. там может оказаться полезное
 

Viktor S.

Новичок
не надо пренебрегать варнингами и нотисами. там может оказаться полезное
Я понял о чем ты. Сделаю.

-~{}~ 19.01.10 14:50:

Добавил везде:

error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', ' ... ');
Посмотрим ...

-~{}~ 19.01.10 14:52:

ну как минимум last | grep ^твой_логин то они могут показать, если на твоем акке прав нету )
Что тут?

-~{}~ 19.01.10 14:57:

Так-же если твой сайт дает твоим пользователям возможность загружать файлы, то обязательно надо проверить нельзя ли загрузить какой-либо файл, который может выполнится на сервере как php код, если открыть его напрямую из браузера.
Не загружает.
То-же, что и fixxxer. eval, все include, require, где имена файлов задаются не как константные строки, а как переменные или содержат в себе переменные и т.д.
Есть только include. Есть переменные в путях, но они берутся только из PHP файлов и статичны. Может упускаю чего?
 

phprus

Moderator
Команда форума
Есть переменные в путях, но они берутся только из PHP файлов и статичны. Может упускаю чего?
register_global - off? Если нет, то потенциально возможно их и подменить (если есть ошибки в коде), а error_reporting(0) и display_error - off могут способствовать незаметности этого.
 

Активист

Активист
Команда форума
[сполер]
Ну если логи запросов ничего не показывают, можно предполагать что:
1. Где-то сохраняете пароли от MyAdmin.
2. Угнана учетка, позволяющая иметь доступ к твоей БД
3. Трояны, кейлогеры, бывшие работники и т.п.
 

Viktor S.

Новичок
register_global - off? Если нет, то потенциально возможно их и подменить (если есть ошибки в коде), а error_reporting(0) и display_error - off могут способствовать незаметности этого.
Off!
3. Трояны, кейлогеры, бывшие работники и т.п.
Нет точно.
1. Где-то сохраняете пароли от MyAdmin.
Хожу только со своего компьютера!
2. Угнана учетка, позволяющая иметь доступ к твоей БД
Поясни о чем речь?

-~{}~ 19.01.10 21:41:

fixxxer откликнись!

Ничего не помогло!

В логах запросов, которые делает процедура перед передачей его в MySQL (везде) ничего нет!

В логах сервера: Erroe log и Row access logs ничего подозрительного тоже нет.

Я вставил код вида:

foreach ($_POST as $key => $value) { …

if ((strpos(strtoupper($value), 'UPDATE') === FALSE) and
(strpos(strtoupper($value), 'SELECT') === FALSE) and
(strpos(strtoupper($value), 'INSERT') === FALSE) and
(strpos(strtoupper($value), 'UNION') === FALSE) and
(strpos(strtoupper($value), 'ORDER') === FALSE) and
(strpos(strtoupper($value), 'WHERE') === FALSE) and
(strpos(strtoupper($value), 'CHAR') === FALSE) and
(strpos(strtoupper($value), 'FROM') === FALSE) and
(strpos(strtoupper($value), 'JOIN') === FALSE)) {
}
else {
$_POST["$key"] = "";
Запись в лог.
}
До этого были опять манипуляции с базой, завтра буду смотреть опять!

-~{}~ 19.01.10 21:51:

Ответил на PM'ы ...
 

fixxxer

К.О.
Партнер клуба
В каком смысле "не помогло"? Опять кто-то влез? А как ты это определяешь?
 

Beavis

Banned
включаешь лог SQL-запросов в скриптах
если после очередного несанкц. изменения данных в этом логе ничего подозрительного нет, значит в базу лезут не через SQL-инъекции, а это уже совсем другая история, как говорится :)
А если лезут через скрипты - то просто надо проанализировать лог http запросов
 

Viktor S.

Новичок
В каком смысле "не помогло"? Опять кто-то влез? А как ты это определяешь?
Привет,

Таблицы имеют защиту от изменений. Я вижу сразу + бэкап.
если после очередного несанкц. изменения данных в этом логе ничего подозрительного нет, значит в базу лезут не через SQL-инъекции, а это уже совсем другая история, как говорится
Что может быть?
А если лезут через скрипты - то просто надо проанализировать лог http запросов
Пишу во всех скриптах, которые имеют права на UPDATE, INSERT. Нет ничего.
 

fixxxer

К.О.
Партнер клуба
Ну если все по списку сделал, то я не зная специфики конкретного проекта уже даже и не знаю что посоветовать :/
 
Сверху