php使用exec shell命令注入的方法讲解


Posted in PHP onNovember 12, 2013

使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此。如果使用了被污染数据,命令注入漏洞就产生了。
exec()是用于执行shell命令的函数。它返回执行并返回命令输出的最后一行,但你可以指定一个数组作为第二个参数,这样输出的每一行都会作为一个元素存入数组。使用方式如下:

<?php
$last = exec('ls', $output, $return);
print_r($output);
echo "Return [$return]";
?>

假设ls命令在shell中手工运行时会产生如下输出:
$ ls
total 0
-rw-rw-r--  1 chris chris 0 May 21 12:34 php-security
-rw-rw-r--  1 chris chris 0 May 21 12:34 chris-shiflett

当通过上例的方法在exec()中运行时,输出结果如下:
Array
(
  [0] => total 0
  [1] => -rw-rw-r--  1 chris chris 0 May 21 12:34 php-security
  [2] => -rw-rw-r--  1 chris chris 0 May 21 12:34 chris-shiflett
)
Return [0]

这种运行shell命令的方法方便而有用,但这种方便为你带来了重大的风险。如果使用了被污染数据构造命令串的话,攻击者就能执行任意的命令。
我建议你有可能的话,要避免使用shell命令,如果实在要用的话,就要确保对构造命令串的数据进行过滤,同时必须要对输出进行转义:
<?php
$clean = array();
$shell = array();
/* Filter Input ($command, $argument) */
$shell['command'] = escapeshellcmd($clean['command']);
$shell['argument'] = escapeshellarg($clean['argument']);
$last = exec("{$shell['command']} {$shell['argument']}", $output, $return);
?>

尽管有多种方法可以执行shell命令,但必须要坚持一点,在构造被运行的字符串时只允许使用已过滤和转义数据。其他需要注意的同类函数有passthru( ), popen( ), shell_exec( ),以及system( )。我再次重申,如果有可能的话,建议避免所有shell命令的使用。
PHP 相关文章推荐
常用的php对象类型判断
Aug 27 PHP
一个php导出oracle库的php代码
Apr 20 PHP
PHP Memcached应用实现代码
Feb 08 PHP
初次接触php抽象工厂模式(Elgg)
Mar 21 PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 PHP
Ajax+PHP快速上手及简单应用说明
Jul 24 PHP
如何在php中正确的使用json
Aug 06 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
php命令行使用方法和命令行参数说明
Apr 08 PHP
PHP中把对象转换为关联数组代码分享
Apr 09 PHP
PHP微信PC二维码登陆的实现思路
Jul 13 PHP
php支付宝APP支付功能
Jul 29 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 #PHP
PHP迭代器的内部执行过程详解
Nov 12 #PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 #PHP
PHP SPL使用方法和他的威力
Nov 12 #PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 #PHP
php获取远程图片体积大小的实例
Nov 12 #PHP
php过滤XSS攻击的函数
Nov 12 #PHP
You might like
php的控制语句
2006/10/09 PHP
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
我就是这样学习Python中的列表
2019/06/02 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
python安装sklearn模块的方法详解
2020/11/28 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
八年级数学教学反思
2014/01/31 职场文书
致裁判员加油稿
2014/02/08 职场文书
大学校务公开实施方案
2014/03/31 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
运动员加油词
2015/07/18 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers