Authentication Algorithm Prior to 3.23.11 : Trong Mysql version prior to 3.23.11 tồn tại một lỗi nghiêm trọng trong cơ chế xác thực mà qua đó kẻ tấn công có thể xác thực đơn giản chỉ việc sử dụng 1 kí tự đơn trong password "scrambled". Nó gọi ra chuỗi gồm có các kí tự từ một tập hợp 32 (from a set of 32). Vì vậy kẻ tấn công chỉ cần 1 chút phỏng đoán là có thể đăng nhập thành công. Để tham khảo thêm, bạn có thể xem tại : http://icat.nist.gov/icat.cfm?cvename=CVE-2000-0148 CHANGE_USER Prior to 3.23.54 and 4.x prior to 4.0.6 Trong phiên bản Mysql trước 3.23.54, nếu người dùng được xác thực, họ có thể đưa ra câu lệnh 'CHANGE_USER' với các chuổi khá dài (để gây tràn bộ đệm) hoặc một chuỗi đợn nhằm cho phép leo thang đặc quyền một cách dễ dàng. <http://icat.nist.gov/icat.cfm?cvename=CAN-2002-1374> <http://icat.nist.gov/icat.cfm?cvename=CAN-2002-1375> Việc cấu hình vững chắc nhằm nâng cao tính bảo mật là triển khai Mysql trên một host mà chỉ hiện diện các network daemon là SSH. Điều này có thể thực hiện được với một script IPtables có chức năng block tất cả các IP truy cập ngoại trừ cổng 22 (hoặc bất cứ cổng nào mà SSH đang lắng nghe ). Lý do đằng sau vấn đề này là (cũng được xem như 1 bài tập tốt) SSH có thể bắt buộc điều kiện mã hóa mooth layer, quyền xác thực và sửa chữa điều kiện trong cơ chế chính của Mysql. Other Historical Bugs: MySQL có khá nhiều lỗ hổng đã được thông báo.Phần này sẽ tổng kết các lỗi bảo mật này.Dĩ nhiên có một điều cần nói với bạn là:Cách sữa lỗi tốt nhất cho các lõ hổng này là tải các bản Patch từ người bán.Điều này thực sự hữu ích cho việc phòng chống các lỗ hổng nghiêm trọng,trong quá khứ khi MySQl được phát hiện có các lỗi bảo mật,đó cũng là một ngụ ý tốt cho các lỗi sẽ được phát hiện trong tương lai. Ngoài điều này,nó còn thực sự hữu ích,coi như là một bài tập để ta giải quyết các lỗi bảo mật nghiêm trọng theo một cách khác và áp dụng chúng vào hoàn cảnh hiện tại.Do đó kĩ năng bảo mật của bạn được cải thiện từ đó có thể phòng tránh các attack mà chưa được phát hiện ra. Sau đây là tổng hợp các lỗi mà bạn cần phải tham khảo thêm: CVE ID Description: CAN-2004-0388 Script mysqld_multi cho phép local users viết đè lên các file tùy ý thông qua 1 cuộc tấn công symlink Workaround – revoke access to the script. CAN-2004-0381 MySQL cho phép local user ( người dùng cục bộ) viết đè lên các file tùy ý qua 1 cuộc tấn công symlink failed-mysql-bugreport trong 1 file nhất thời Workaround – revoke access to the script. CAN-2003-0708 Tràn bộ đệm trong get_salt_from_password ở sql_acl.cc với Mysql 4.0.14 và trước đó, và 3.23.x, cho phép kẻ tấn công thực hiện mã tùy ý qua trường password dài. (note - một kẻ tấn công có thể sửa một pass của người dùng cốt để thực hiện đợt tấn công này, đó là kết quả của việc thực thi mã tùy ý.) CAN-2003-0150 mySSql 3.23.55 và trước đó tạo trường world-writeable và cho phép người dùng mysql có thể chiếm đặc quyền root bằng việc dùng câu lệnh " SELECT * INTO OUTFILE" để ghi đè lên file cấu hình và khiến mysql chạy như root vào lúc restart. CAN-2003-0073 2 chỗ yếu trong trong mysqld với Mysql trước .3.23.55 cho phép kẻ tấn công từ xa thực hiện cuộc tấn công " từ chối dich vụ" qua mysql_change_user. CAN-2002-1376 thư viện khách libmysqlclient trong mysql 3.x đến 3.23.54 và 4.x đến 4.0.6, ko thẩm định đúng độ dài fields cho những sự đáp ứng nào đó trong (1) read_rows hay (2) read_one_row của các tệp tin thi hành, chúng cho phép kẻ tấn công từ xa thực hiện 1 cuộc 'từ chối dịch vụ" và có thể thực hiện các mã lệnh tùy ý. (note- trong trường hợp này, kẻ tấn công có thể tạo một Mysql server hiểm độc và tấn công các clients kết nối tới chúng. Đó có thể là 1 cách làm tổn thương tới web server.) CAN-2002-1375 Lệnh COM_CHANGE_USER trong Mysql 3.x trước 3.23.53 và 4.x đến 4.0.6 cho phép kẻ tấn công từ xa thực hiện mã lệnh tùy ý thông qua một đáp ứng dài. Lỗ hổng này (cùng với CAN-2002-1374 bên dưới ) là một lí do hoàn hảo để rename tài khoản 'root' mặc định. Kẻ tấn công phải biết tên của một người dùng mysql để tiến hành cuộc tấn công này CAN-2002-1374 Lệnh COM_CHANGE_USER trong Mysql 3.x trước 3.23.54 và 4.x trước 4.0.6 cho phép kẻ tấn công từ xa chiếm quyền đặc lợi qua một một cuộc tấn công brute force (dùng một kí tự password ), nguyên nhân là do mysql chỉ so sánh password nhập vào với kí tự đầu tiên của password thật.Kẻ tấn công phải biết tên của một người dùng Mysql để thực hiện đợt tấn công này. CAN-2002-1373 chỗ bị tôn thương signed integer trong gói COM_TABLE_DUMP của mysql 3.23.x và trước 3.23.54, cho phép kẻ tấn công từ xa thực hiện một cuộc tấn công ' từ chối dịch vụ' trong mysqld bởi số nguyên âm lớn được nhập vào một memcpy call. CAN-2002-0969 Tràn bộ đệm trong Mysql trước 3.23.50 và 4.0 beta trước 4.0.2 cho phép local users thực hiện mã lệnhj tùy ý qua một tham số "datadir" dài trong file khởi tạo my.ini, file mà trong win có được cho phép Full Control đối với Everyone group . CAN-2001-1255 WinMySQLadmin 1.1 giữ MySQL password trong một văn bản thuần túy trong file my.ini, cho phép local user có thể giành được quyền truy nhập Mysql database. (note - lỗi này chưa được fix trong thời gian bài viết ) CVE-2001-0407 lỗi vượt qua thư mục trong Mysql trước 3.23.36 cho phép local user thay đổi file tùy ysvaf chiếm đặc quyền bằng việc tạo 1 DB có tên bắt đầu bằng ( 2 dấu chấm ) CAN-2001-1274 tràn bộ đệm trong Mysql trước 3.23.31 cho phép kẻ tấn công thực hiện cuộc tấn công "từ chối dịch vụ" và có thể chiếm đặc quyền. CAN-2001-1275 Mysql trước 3.23.31 cho phép người dùng với 1 tài khoản Mysql sử dụng lệnh SHOW GRANTS để giành được password đã được mã hóa của admin từ bảng mysql.user và có thể chiếm đặc quyền qua việc crack password. CVE-2000-0981 Mysql Database Engine sử dụng một phương thức xác nhận yếu có thể làm rò ra những thông tin mà kẻ tấn công từ xa có thể lợi dụng để sửa lại password. CVE-2000-0148 Mysql 3.22 cho phép kẻ tấn công từ xa có thể bypass và truy nhập vào DB qua kiểm tra chuỗi kí tự ngắn ( tương tự như CAN-2002-1374) CVE-2000-0045 Mysql cho phép local user sửa password cho một người dùng Mysql tùy ý qua đặc quyền GRANT CVE-1999-1188 mysqld trong Mysql 3.21 tạo caca log file với quyền đọc cho tất cả mọi người ( world -readable permissions ), cho phép local user có thể giành được password của nhưng người dùng mà được add vào user database. Mysql as a web back-end : Nếu có thể nói một cấu hình đơn giản cho Mysql nó có thể là chương trình phụ trợ cho ứng dụng web Apache/PHP. Có rất nhiều các bài chỉ dẫn trong việc triển khai sự phối hợp của scripting language và DB server với các nền móng khác nhau nhưng ở đây chúng ta sẽ ko nói lại chúng ở đây, tuy nhiên kinh nghiêm trong kiểm toán mạng máy tính đã chỉ cho chúng ta rằng có một vài lỗi mà con người hay mắc phải khi thiếu lập cấu hình Mysql: 1) Sự giới hạn ko tương xứng của sự kết nối mạng từ các web server hay Mysql server. 2) Các miếng vá của Mysql server ko đầy đủ. 3) Sử dụng tài khoản "root" hay một số tài khoản đặc quyền khác để connect vào DB. 4) Ko hạn chế host-based của các tài khoản Mysql. 5)MySQL deamon thường được cấu hình để chạy với unix 'root' acc, Windows LocaSystem acc, hay một số tài khoản đặc quyền khác 6)Sự thiếu hạn chế trong Mysql file access, và sự lỏng lẻo trong file permission trong host mà Mysql đang chạy trên đó. 7)LOAD DATA LOCAL INFILE được cho phép. Đấy rõ ràng là một lỗi hiển nhiên, nhưng theo kinh nghiệm của chúng tôi nó lại khá phổ biến. Một list tham khảo đã mô tả các fix chúng được cung cấp vào cuối bài này. SQL injection in MySQL: Dù sau một vài năm được công bố bởi security community, SQL injection dường như vẫn là một vấn đền lớn. Vấn đề ở đây chính là sự thiếu phê chuẩn đầu vào trong ứng dụng web, nhưng sự cấu hình của chương trình phụ trợ (back-end) DB cũng góp phần rất lớn trong sự thành công của kẻ tấn công. Nếu bạn khóa được Mysql box tốt, việc phá hoại bởi chỗ hổng của ứng ụng có thể được giảm nhẹ. Trước khi ta để cập cụ thể tới SQL injection trong Mysql, hãy coi như đây là 1 cách tấn công phổ biến. Bài này cho là bạn đã có sự hiểu biết về SQL injection. Nếu ko quen thuộc với SQL injection, hãy xem : http://www.ngssoftware.com/papers/ad _injection.pdf và http://www.ngssoftware.com/papers/mo _injection.pdf Trong PHP, thiết lập kiểm soát 'magic_quotes_gpc', sẽ tự động loại bỏ single quotes, double quotes, backslashes và NULLs. Trong 'magic_quotes_gpc', 'gpc' thay thế cho GET/POST/COOOKIE. Sự thiết lập này trong các version hiên tại được mặc định là enable, vì thế nên nếu giá trị được nhập vào được đặt trong 1 biên chuỗi : $query = "SELECT * FROM user where user = '" . $_REQUEST['user'] . "'"; Sql injection là ko thể. Tuy nhiên nếu giá trị nhaap vào được đặt trong 1 phần ko định danh của câu lệnh như giá trị số, tên bảng, tên cột : $query = "SELECT * FROM user order by " . $_REQUEST['user']; hay $query = "SELECT * FROM user where max_connections = " . $_REQUEST ['user']; Sql injection có thể được. Một đường có thể với numeric problem trong PHP/MySql là định danh tất cả nhưng gì mà người dùng nhập vào trong single quotes, gồm cả số. Sự so sanh vẫn làm việc, nhưng 'magic_quotes_gpc' sẽ chống lại việc kẻ tấn công thoát khỏi chuỗi. Rõ ràng nếu 'magic quotes' tắt đi, SQL injection sẽ luôn luôn là có thể, tùy thuộc vào giá trj người dùng nhập vào như thế nào. Cứ cho rằng kẻ tấn công mở một cuộc tấn công SQL injection, câu hỏi sẽ là : chúng có thể làm gì ? Dưới đây cung cấp 1 list thực sự nguy hiểm : UNION SELECT LOAD_FILE function LOAD DATA INFILE statement SELECT INTO OUTFILE statement BENCHMARK function User Defined Functions (UDFs) . injection, hãy xem : http://www.ngssoftware.com/papers/ad _injection .pdf và http://www.ngssoftware.com/papers/mo _injection .pdf Trong PHP, thiết lập kiểm soát 'magic_quotes_gpc',