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 相关文章推荐
15种PHP Encoder的比较
Mar 06 PHP
在PHP里得到前天和昨天的日期的代码
Aug 16 PHP
PHP详细彻底学习Smarty
Mar 27 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
PHP中mysql_field_type()函数用法
Nov 24 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
Dec 17 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
Yii多表联合查询操作详解
Jun 02 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
下载文件的点击数回填
2006/10/09 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
PHP中常用的转义函数
2014/02/28 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
javascript两段代码,两个小技巧
2010/02/04 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
让 python 命令行也可以自动补全
2014/11/30 Python
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
简短证婚人证婚词
2014/01/09 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
2014年后勤工作总结
2014/11/18 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python