代碼執行最早被稱為指令注入攻擊,是指由于web應用程式對使用者送出的資料過濾不嚴格,導緻黑客可以通過構造特殊指令字元串的方式,将資料送出至web應用程式,并利用該方式執行外部程式或系統指令實施攻擊非法擷取資料或網絡資源等。
PHP代碼執行:
PHP代碼執行是PHP應用程式中常見的腳本漏洞之一,國内著名的web應用程式Discuz、DedeCMS等都曾存在過該類型漏洞。
指令執行漏洞是直接作業系統的指令,代碼執行漏洞是通過代碼執行來執行計算機語言代碼,比如eval(system('set');)。
代碼執行概念:
代碼執行通常指将可執行代碼注入到目前頁面中,比如PHP的eval函數,可以将字元串代表的代碼作為PHP代碼執行,目前使用者能夠控制這段字元串時,将産生代碼執行漏洞。廣義上的代碼注入,可以覆寫大半安全漏洞的分類。
指令執行和代碼執行:
相同點:
- 都是用了相關函數、卻存在可控制的變量;
- 都可以通過代碼審計發現漏洞;
- 都可以拼接惡意指令對伺服器造成攻擊等。
不同點:
- 指令執行漏洞是直接作業系統指令,如:PHP中的system(),exec(),shell_exec()等,當使用者能夠控制這些函數中的參數時,就可以将惡意系統指令拼接到正常的指令中,進而造成指令執行攻擊,這就是指令執行漏洞;
- 代碼執行漏洞是通過代碼來執行計算機語言,比如:eval(system('set');).。
代碼執行原理:
PHP中代碼執行情況非常靈活,究其原因仍然離不開兩個關鍵條件:
- 使用者能夠控制的函數輸入;
- 存在可以執行代碼的危險函數。
是以,代碼執行的原理其實就是當應用在調用一些能夠将字元串轉換成代碼的函數時,沒有考慮到使用者是否能控制這個字元串,然後将字元串代表的代碼作為PHP代碼執行,造成代碼執行漏洞。
代碼執行危害:
- 暴露伺服器資訊;
- 木馬植入;
- 敏感檔案暴露;
- 還可能更新為指令執行。
PHP動态函數調用:
在PHP中可以把函數名通過字元串的方式傳遞給一個變量,然後通過此變量動态調用函數;
在PHP語言中,可以通過動态函數用來調用來對代碼進行執行。
PHP函數代碼執行漏洞:
PHP有不少可以直接執行代碼的函數,比如:eval()、assert()、system()、exec()、shell_exec()、passthru()、esapeshellcmd()、pcntl_exec()等。
一般最好在PHP中禁用這些函數。審計代碼實則可以檢查代碼中是否存在這些函數,然後回溯危險函數的調用過程,看使用者是否可以輸入。