php代码审计【4】命令执行漏洞

命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别。

1、漏洞实例

例1:

<?php
    $target=$_REQUEST['ip'];
    $cmd = shell_exec('ping '.$target);
    echo "<pre>{$cmd}</pre>";
?>

返回界面:

 http://127.0.0.1:8066/test.php?ip=|ipconfig

提交以后,命令变成了 shell_exec('ping '.|ipconfig)

 

2、常用命令执行函数

exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec() 、反引号` 实际上是使用shell_exec()函数

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

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

 

3、漏洞利用及绕过姿势  

| 命令管道符

<>>> 文件重定向符

测试: 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

4 如何防止命令执行漏洞

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

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

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

  当然,修复方法还有很多方式,修复方式一般有两种思维:

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

修复代码示例一:

<?php 
$target=$_REQUEST['ip']; 
$octet = explode( ".", $target ); 
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) 
{ $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3]; 
  $cmd = shell_exec('ping '.$target); ‘
   echo "<pre>{$cmd}</pre>"; 
} 
else {
   echo '<pre>ERROR: You have entered an invalid IP.</pre>'; 
    } 

?>

 

修复代码示例二:

<?php
    $target=$_REQUEST['ip'];
    $cmd = shell_exec('ping '. escapeshellcmd($target));
    echo "<pre>{$cmd}</pre>";
?>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: index.php远程代码执行漏洞是一种安全漏洞,攻击者可以通过该漏洞在受影响的服务器上执行恶意代码。当服务器上的index.php文件存在漏洞时,攻击者可以通过发送特制的请求来注入并执行任意代码,进而获取对服务器的控制权限。 这种漏洞通常是由于代码编写不当、输入验证不完善或者服务器配置不正确造成的。攻击者可以利用该漏洞执行各种恶意活动,包括但不限于:获取敏感信息、篡改网页内容、远程控制服务器、搭建僵尸网络等。 为了保护服务器免受index.php远程代码执行漏洞的影响,我们可以采取以下措施: 1. 及时更新软件版本:经常更新并升级服务器上的软件和应用程序,确保软件版本是最新的。更新包含了对已知漏洞的修复,可以防止攻击者利用该漏洞。 2. 输入验证和过滤:在构建应用程序时,始终对用户输入进行验证和过滤,确保用户提供的数据符合预期。避免将用户输入直接传递到执行命令的函数中,使用安全的输入验证方法来防止代码注入。 3. 加强服务器安全配置:设置适当的权限和访问控制规则,限制对敏感文件和目录的访问。关闭不必要的服务和端口,以减少攻击面。 4. 使用 Web 应用程序防火墙(WAF):WAF 可以检测和拦截恶意请求,阻止攻击者利用远程代码执行漏洞。配置 WAF 来监视和过滤异常和危险的请求。 5. 安全审计和日志监控:定期审计服务器上的代码,查找漏洞并进行修复。记录和监视服务器日志,及时发现异常行为和潜在攻击。 综上所述,为了防止index.php远程代码执行漏洞的利用,我们需要采取多种安全措施来保护服务器和应用程序的安全。及时更新软件、验证输入、加强服务器配置、使用 WAF 和进行安全审计是有效防范该漏洞的重要措施。 ### 回答2: index.php远程代码执行漏洞是一种常见的网络安全漏洞,通常出现在Web应用程序开发中。这种漏洞允许攻击者通过发送恶意的HTTP请求,将恶意代码注入到index.php文件中,以执行任意的系统命令或者暴露敏感信息。 这种漏洞的原因通常是由于开发人员未对用户输入进行充分的过滤和验证,导致攻击者可以通过构造特定的恶意输入来绕过正常的输入验证和过滤机制。攻击者可以通过在URL的参数中插入特定的命令或代码,使服务器执行这些命令或代码,从而实现远程代码执行的目的。 为了防止index.php远程代码执行漏洞的发生,开发人员应该采取以下措施: 1. 输入验证和过滤:对于所有用户输入的数据,都应该进行充分的验证和过滤,确保只接受符合预期格式和内容的数据。 2. 对用户输入进行编码处理:在将用户输入显示到页面上之前,应该对其进行适当的编码,以防止恶意代码的执行。 3. 限制文件系统和数据库的访问权限:在服务器配置中,应该限制PHP文件的访问权限,并且将数据库的访问权限限制在必要的最低级别。 4. 及时更新和修补:及时安装并更新Web应用程序的补丁和安全更新,以防止已知的漏洞被利用。 5. 强化服务器端的安全策略:在服务器端,可以使用防火墙、入侵检测和防护系统来加强安全策略,对恶意访问进行识别和阻止。 综上所述,通过加强输入验证,编码处理和限制访问权限等措施,可以有效防止index.php远程代码执行漏洞的发生。同时,及时更新和修补漏洞,加强服务器端的安全策略也是必要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值