前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >命令执行漏洞简单讲述

命令执行漏洞简单讲述

作者头像
C4rpeDime
发布2018-12-18 17:01:47
7560
发布2018-12-18 17:01:47
举报
文章被收录于专栏:黑白安全黑白安全

1. 利用系统函数实现远程命令执行

在PHP下,允许命令执行的函数有:

eval() assert() preg_replace() call_user_func() ...

如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞

eval()函数

定义和用法

eval() 函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

语法

eval(phpcode)

phpcode 必需。规定要计算的 PHP 代码。

例子

代码语言:javascript
复制
<?php $a = $_GET['a']; eval($a); ?> 
http://127.0.0.1/oscommand/1.php?a=phpinfo();
assert()函数

定义和用法

检查一个断言是否为 FALSE

语法

PHP 5

bool assert ( mixed assertion [, stringdescription ] )

PHP 7

bool assert ( mixed assertion [, Throwableexception ] )

assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动

例子

代码语言:javascript
复制
<?php $a = $_GET['a'];
assert($a); ?> 
http://127.0.0.1/oscommand/1.php?a=phpinfo(); http://127.0.0.1/oscommand/1.php?a=phpinfo()

ps: eval()和assert()区别

eval()函数正确执行需要满足php的代码规范,而assert()函数则不存在这个问题,对于php的代码规范要求不高

preg_replace()函数

定义和语法

preg_replace 函数执行一个正则表达式的搜索和替换。

语法

mixed preg_replace ( mixed pattern , mixedreplacement , mixed subject \[, intlimit = -1 [, int &$count ]] )

搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。

参数说明:

pattern: 要搜索的模式,可以是字符串或一个字符串数组。当pattern处存在一个"/e"修饰符时,$replacement的值会被当成php代码来执行。 $replacement: 用于替换的字符串或字符串数组。 $subject: 要搜索替换的目标字符串或字符串数组。 $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。 $count: 可选,为替换执行的次数。

例子

代码语言:javascript
复制
<?php $a = $_GET['a']; echo preg_replace("/test/e", $a, "just test!") ?> 
http://127.0.0.1/oscommand/1.php?a=phpinfo()

ps: 在php5.4及以下版本中,preg_replace()可正常执行代码,而在php5.5及后续版本中会提醒"/e"修饰符已被弃用,要求用preg_replace_callback()函数来代替。

call_user_func()函数

定义和用法

call_user_func — 把第一个参数作为回调函数调用

语法

mixed call_user_func ( callable callback \[, mixedparameter [, mixed $... ]] )

第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

例子

代码语言:javascript
复制
<?php call_user_func($_GET['a'],$_GET['b']); ?> 
http://127.0.0.1/oscommand/1.php?a=assert&b=phpinfo()
其他函数

ob_start()、unserialize()、creat_function()

usort()、uasort()、uksort()

array_filter()

array_reduce()

array_map()

...

2. 系统命令执行漏洞

系统命令执行的函数

system()

exec()

shell_exec()

passthru()

pcntl_exec()

popen()

proc_open()

反引号

...

环境分析

代码语言:javascript
复制
<?php if (isset($_POST['submit'])){
    $target = $_REQUEST['ip']; if(isset(php_uname('s'), 'Windows NT')) {
        $cmd = shell_exec('ping ' . $taeget); echo '<pre>'.$cmd.'</pre>';
    } else {
            $cmd = shell_exec('ping -c 3 ' . $target); echo '<pre>'.$cmd.'</pre>' }
}

页面通过request获取传入的ip参数,并获取当前系统类型之后拼接相应命令"ping + target IP"并执行,在此过程中IP参数可控,所以在IP可拼接命令。

127.0.0.1&&whoami 127.0.0.1;whoami 127.0.0.1||whoami 

防范措施

在PHP下禁用高危系统函数

找到php.ini,查找到disable_functions,添加禁用的函数名

严格过滤关键字符

代码语言:javascript
复制
$substitutions = array( '&&' => '', ';' => '', '||' => '',
);
$target = str_replace(array_keys($substitutions), $substitution, $target);

严格限制允许的参数类型

利用正则表达

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-261,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 利用系统函数实现远程命令执行
    • eval()函数
      • assert()函数
        • preg_replace()函数
          • call_user_func()函数
            • 其他函数
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档