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与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
header中Content-Disposition的作用与使用方法
Jun 13 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
smarty缓存用法分析
Dec 16 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
php中array_slice和array_splice函数解析
Oct 18 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 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边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
web前端开发也需要日志
2010/12/09 Javascript
js实现微信分享代码
2020/10/11 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
python进行TCP端口扫描的实现
2018/12/21 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python如何实现单链表的反转
2020/02/10 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
python中rb含义理解
2020/06/18 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
入党积极分子自我鉴定
2014/02/18 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
网聊搭讪开场白
2015/05/28 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js