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笔记之:php数组相关函数的使用
Apr 26 PHP
php中$_POST与php://input的区别实例分析
Jan 07 PHP
php递归实现无限分类的方法
Jul 28 PHP
php实现微信公众号无限群发
Oct 11 PHP
PHP时间类完整实例(非常实用)
Dec 25 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
Yii2框架制作RESTful风格的API快速入门教程
Nov 08 PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 PHP
解决php extension 加载顺序问题
Aug 16 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 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中DOMElement操作xml文档实例演示
2013/03/26 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
python 网络爬虫初级实现代码
2016/02/27 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
python中的格式化输出用法总结
2016/07/28 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
python Kmeans算法原理深入解析
2019/08/23 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
《童年》教学反思
2014/02/18 职场文书
党支部活动策划方案
2014/08/18 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
借钱欠条怎么写
2015/07/03 职场文书
公司会议开幕词
2016/03/03 职场文书
golang语言指针操作
2022/04/14 Golang