命令執行漏洞
由於開發人員編寫源碼,沒有針對代碼中可執行的特殊函數入口做過濾,導致客戶端可以提交惡意構造語句提交,並交由服務器端執行。命令注入攻擊中WEB服務器沒有過濾類似system(),eval(),exec()等函數是該漏洞攻擊成功的最主要原因。
漏洞成因
應用在調用這些函數執行系統命令的時候,如果將用戶的輸入作為系統命令的參數拼接到命令行中,在沒有過濾用戶的輸入的情況下,就會造成命令執行漏洞。
php相關函數
- system(args) 有回顯
- passthru(args)(有回顯)
- exec(args) (回顯最后一行-必須echo輸出)
- shell_exec(args) (無回顯-必須輸出)
- 反引號:``
- popen(handle,mode)(無回顯)
- proc_open(‘cmd’,‘flag’,‘flag’)(無回顯)
- $process = proc_open(‘dir’,$des,$pipes);
- echo stream_get_contents($pipes[1]);
漏洞危害
- 繼承Web服務程序的權限去執行系統命令或讀寫文件
- 進一步內網滲透
- 反彈shell
- 控制整個網站
命令拼接符
windows
1
2
3
4
|
1. “|”:直接執行后面的語句。
2. “||”:如果前面的語句執行失敗,則執行后面的語句,前面的語句只能為假才行。
3. “&”:兩條命令都執行,如果前面的語句為假則直接執行后面的語句,前面的語句可真可假。
4. “&&”:如果前面的語句為假則直接出錯,也不執行后面的語句,前面的語句為真則兩條命令都執行,前面的語句只能為真。
|
linux
1
2
3
4
5
|
1. “;”:執行完前面的語句再執行后面的語句。
2. “|”:顯示后面語句的執行結果。
3. “||”:當前面的語句執行出錯時,執行后面的語句。
4. “&”:兩條命令都執行,如果前面的語句為假則執行執行后面的語句,前面的語句可真可假。
5. “&&”:如果前面的語句為假則直接出錯,也不執行后面的語句,前面的語句為真則兩條命令都執行,前面的語句只能為真。
|
代碼執行漏洞
PHP代碼執行漏洞可以將代碼注入到應用中,最終到webserver去執行。該漏洞主要存在於eval()、assert()、preg_replace()、call_user_func()、array_map()以及動態函數中。
漏洞成因
在Web應用中有時候程序員為了考慮靈活性、簡潔性,會在代碼調用eval函數(PHP函數)去處理。比如當應用在調用一些能將字符串轉化成代碼的函數時,沒有考慮用戶是否能控制這個字符串,將造成代碼執行漏洞。
相關函數
eval()
將輸入的字符串當做PHP代碼執行
assert()
會檢查指定的 assertion 並在結果為 FALSE 時采取適當的行動
call_user_func()
把第一參數作為回調函數
call_user_func_array()
調用回到函數,並把第一個數組參數作為回到函數的參數
array_map()
為數組的每個元素應用回調函數
還有一些危險函數
preg_replace()、str_replace()、call_user_func()這些函數跟eval、exec等函數地特性相同,都屬於危險函數
preg_replace(mixed pattern,mixed replacement,mixed subject [,int limit]):此函數可以用來執行一個正則表達式的搜索和替換
$pattern:正則表達式匹配的內容
$replacement:用於替換的字符串或字符串數組
$subject:要搜索替換的目標字符串或字符串數組
當$pattern存在/e模式修正符,允許代碼執行
漏洞危害
- 執行任意代碼
- 向網站寫WebShell
- 控制整個網站甚至服務器