0x01 起因及想法
起因:剩下這假期這十幾天,沒人玩了,所以想學點東西並記錄到自己的博客里。前陣子在烏雲社區看到一篇代碼審計的整體學習思想如下:
學習代碼審計目標:能獨立完成對一個CMS代碼安全的監測
思路:
A、通讀全文代碼,從功能函數代碼開始閱讀,例如include文件夾下的comm_fun.php,或者類似關鍵字的文件。
B、看配置文件,帶有config關鍵字的文件,找到mysql.class.php文件的connect()函數,查看在數據庫連接時是否出現漏洞。
C、跟讀首頁文件,了解程序運行時調用那些函數和文件,以首頁為基線,一層層去擴展閱讀所包含的文件。
0x02 命令注入學習
形成原因:對一些危險函數沒有做過濾。
相關函數:system()、exec()、passthru()、‘‘反引號、shell_exec()、popen()、proc_open()等等。
0x03 利用演示
由於用法差不多,這里以system()為例進行演示。
演示代碼:
查看權限:
添加用戶:
寫入一句話菜刀連接:
其他利用在自行摸索。
0x04 防護
PHP中命令注入攻擊漏洞帶來的危害和影響很嚴重。防范命令注入攻擊漏洞的存在可以通過以下幾種方法。
1.、盡量不要執行外部的應用程序或命令。
2.、使用自定義函數或函數庫實現外部應用程序或命令的功能。
3、 在執行system、eval等命令執行功能的函數前,確定參數內容。
4、escapeshellcmd()函數會轉義命令中的所有shell元字符來完成工作。這些元字符包括:#&;`,|*?~<>^()[]{}$\\。例如寫入一句話可被過濾 ,所以命令無法執行成功,無法生成一句話文件。
5、使用escapeshellarg函數處理相關參數。Escapeshellarg函數會將任何引起參數或命令結束的字符進行轉義,如單引號“’”會被轉義為“\’”,雙引號“””會被轉義為“\””,分號“;”會被轉義為“\;”,這樣escapeshellarg會將參數內容限制在一對單引號或雙引號里面,轉義參數中所包含的單引號或雙引號,使其無法對當前執行進行截斷,實現防范命令注入攻擊的目的。
6、使用safe_mode_exec_dir執行可執行的文件路徑。將php.ini文件中的safe_mode設置為On,然后將允許執行的文件放入一個目錄中,並使用safe_mode_exec_dir指定這個可執行的文件路徑。這樣,在需要執行相應的外部程序時,程序必須在safe_mode_exec_dir指定的目錄中才會允許執行,否則執行將失敗。
0x05 聲明
本文僅供學習參考,由於本人水平有限,如發現錯誤歡迎指出,謝謝!
第一天