php eval怎样执行系统命令?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php eval怎样执行系统命令?相关的知识,希望对你有一定的参考价值。

eval — 把字符串作为php代码执行

说明

mixedeval( string $code_str )

把字符串code_str作为PHP代码执行。 除了其他,该函数能够执行储存于数据库文本字段内的PHP代码。

使用eval()时需注意几个因素:注意字符必须是有效的PHP代码,包括结尾的分号,以不至于解释器在eval()之后退出。并且正确地转义code_str中的东西。你可以使用一个PHP闭合标签来混合输出html和PHP代码。

同时需注意eval中的变量会被保留在之后的主脚本中。

参数

code_str需要被执行的字符串code_str不能包含 PHP Opening tags。

return语句会立即中止当前字符串的执行。

返回值

eval()返回NULL,除非在执行的代码中return了一个值,函数返回该值。 如果在执行的代码中有一个解析错误,eval()返回FALSE,之后的代码将正常执行。无法使用 set_error_handler() 捕获eval()中的解析错误。

范例

Example #1eval()例子 - 简单的文本合并

<?php

$string = 'cup';

$name = 'coffee';

$str = 'This is a $string with my $name in it.';

echo $str. "\n";

eval("\$str = \"$str\";");

echo $str. "\n";

?>

以上例程会输出:

This is a $string with my $name in it.This is a cup with my coffee in it.

Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

Tip和直接将结果输出到浏览器一样,可使用输出控制函数来捕获当前函数的输出,然后(例如)保存到一个 string 中。

Note:

如果在执行的代码中产生了一个致命的错误(fatal error),整个脚本会退出。
Linux 中
shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。

例如

$:cat ext

count=3

cmd=echo

cmd="$cmd \$$count"

ext 11 22 33

此时cmd=" echo $3"

eval $cmd 等价于 "echo 33 "追问

在一些空间商上面,用php怎样进行虚拟机的重启,以及新建ftp账号之类的动作?也跟这个eval函数有关吗?

参考技术A php的 eval函数是执行php代码 eval(" echo time() ")
执行系统命令的用 exec或反引号 exec( ' dir ' ) `dir`

php代码审计小总结

php代码审计小总结

命令执行

php代码执行

  • eval()
  • assert()
  • preg_replace + ‘/e’
  • call_user_func()
  • call_user_func_array()
  • create_function
  • array_map()

系统命令执行

  • system()
  • passthru()
  • exec()
  • pcntl_exec()
  • shell_exec()
  • popen()
  • proc_open()
  • `(反单引号)
  • ob_start()
  • escapeshellcmd() // 该函数用于过滤

文件上传

  • move_uploaded_file()
  • getimagesize() //验证文件头只要为GIF89a,就会返回真

文件删除

  • unlink()
  • session_destroy()

文件包含

本地文件包含

  • require()
  • include()
  • include_once()
  • require_once()

远程文件包含

  • allow_url_include = on

文件读取

读文件

  • hightlight_file($filename);
  • show_source($filename);
  • print_r(php_strip_whitespace($filename));
  • print_r(file_get_contents($filename));
  • readfile($filename);
  • print_r(file($filename)); // var_dump
  • fread(fopen(filenam**e,”r”),filename,”r”),size);
  • include($filename); // 非php代码
  • include_once($filename); // 非php代码
  • require($filename); // 非php代码
  • require_once($filename); // 非php代码
  • print_r(fread(popen(“cat flag”, “r”), $size));
  • print_r(fgets(fopen($filename, “r”))); // 读取一行
  • fpassthru(fopen($filename, “r”)); // 从当前位置一直读取到 EOF
  • print_r(fgetcsv(fopen(filenam**e,”r”),filename,”r”),size));
  • print_r(fgetss(fopen($filename, “r”))); // 从文件指针中读取一行并过滤掉 HTML 标记
  • print_r(fscanf(fopen(“flag”, “r”),”%s”));
  • print_r(parse_ini_file($filename)); // 失败时返回 false , 成功返回配置数组

列目录

  • print_r(glob(“*”)); // 列当前目录
  • print_r(glob(“/*”)); // 列根目录 print_r(scandir(“.”));
  • print_r(scandir(“/“));
  • $d=opendir(".");while(false!==($f=readdir($d))){echo"$f\\n";}
  • $d=dir(".");while(false!==($f=$d->read())){echo$f."\\n";}

超全局变量

变量覆盖

  • extract()
  • import_request_variables()
  • parse_str()
  • mb_parse_str()
  • 全局变量覆盖:register_globals为ON,$GLOBALS

php序列化函数

  • serialize()
  • unserialize()
  • ini_set(‘session.serialize_handler’, ‘php_serialize’);

Reference

以上是关于php eval怎样执行系统命令?的主要内容,如果未能解决你的问题,请参考以下文章

php一句话木马怎样放上去的

php代码审计小总结

一句话木马(webshell)是如何执行命令的

RCE与命令执行从产生到防御

远程代码与命令执行

MySQL UDF提权执行系统命令