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 4.2书写安全的脚本
Oct 09 PHP
PHP 加密与解密的斗争
Apr 17 PHP
php性能优化分析工具XDebug 大型网站调试工具
May 22 PHP
php header Content-Type类型小结
Jul 03 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
php通过rmdir删除目录的简单用法
Mar 18 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
PHP解决中文乱码
Apr 28 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
python实现顺序表的简单代码
2018/09/28 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
生产班组长岗位职责
2014/01/05 职场文书
大学军训感言400字
2014/03/11 职场文书
公司合作协议书范本
2014/04/18 职场文书
网站创业计划书
2014/04/30 职场文书
4s店活动策划方案
2014/08/25 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
教师远程培训心得体会
2016/01/09 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android