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 相关文章推荐
杏林同学录(三)
Oct 09 PHP
php中的MVC模式运用技巧
May 03 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
PHP中数据库单例模式的实现代码分享
Aug 21 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
php数组冒泡排序算法实例
May 06 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 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中的Traits
2015/07/29 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
通过cmd进入python的步骤
2020/06/16 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
通俗讲解python 装饰器
2020/09/07 Python
高性能装备提升营地:Kammok
2019/02/27 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
英语分层教学实施方案
2014/06/15 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
《角的度量》教学反思
2016/02/18 职场文书
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python