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 相关文章推荐
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
php smarty模版引擎中的缓存应用
Dec 02 PHP
php读取xml实例代码
Jan 28 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
Nov 20 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 PHP
如何打开php的gd2库
Feb 09 PHP
PHP实现SMTP邮件的发送实例
Sep 27 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
php5.2时间相差8小时
2007/01/15 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
基本DOM节点操作
2017/01/17 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
JS实现密码框效果
2020/09/10 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python实现的弹球小游戏示例
2017/08/01 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
python梯度下降法的简单示例
2018/08/31 Python
Django REST framework视图的用法
2019/01/16 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python tornado使用流生成图片的例子
2019/11/18 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
知识就是力量演讲稿
2014/09/13 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
门面房租房协议书
2014/12/01 职场文书
读后感作文评语
2014/12/25 职场文书
老员工辞职信范文
2015/05/12 职场文书
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android