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初学入门
Nov 19 PHP
Fatal error: Call to undefined function curl_init()解决方法
Apr 09 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
May 29 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
php中文验证码实现示例分享
Jan 12 PHP
php+mysql数据库查询实例
Jan 21 PHP
Laravel搭建后台登录系统步骤详解
Jul 26 PHP
PHP用户验证和标签推荐的简单使用
Oct 31 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
Mar 11 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 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
为查询结果建立向后/向前按钮
2006/10/09 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
python返回昨天日期的方法
2015/05/13 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
基于python操作ES实例详解
2019/11/16 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
大学生收银员求职信分享
2014/01/02 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书
建筑工地文明标语
2014/10/09 职场文书
公证处委托书
2015/01/28 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python