命令执行漏洞

在介绍命令执行漏洞之前,我们先介绍一个函数
(类似的函数还有system、exec、passthru、popen、proc_popen等)

从该函数的官方手册中可以得到以下信息

  • 该函数的参数是一条shell命令
  • 该函数的返回值是命令执行的结果的输出

如果对该函数的参数没有任何过滤的话,我们就可以通过该函数在目标服务器上执行任意的shell命令

命令执行漏洞的利用

我们在此以一段存在命令执行漏洞的代码来展开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
if(isset($_REQUEST[ 'ip' ])) {//传入变量ip
$target = trim($_REQUEST[ 'ip' ]);//去除字符串首尾处的空白字符,然后把值赋给$target
$substitutions = array(//一个数组
'&' => '',
';' => '',
'|' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
//str_replace(search, replace, subject)将 subject 中全部的 search 都被 replace 替换
//array_keys返回数组的键名
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );

//shell_exec(cmd),通过shell环境执行命令
//ping -c 数字,在发送指定数目的包后停止发送
$cmd = shell_exec( 'ping -c 4 ' . $target );//此处是造成命令执行漏洞的罪魁祸首
echo $target;
echo "<pre>{$cmd}</pre>";
}
show_source(__FILE__);
?>

在上面这段代码中,我们可控的参数是传入的变量ip,该变量传入后被shell_exec()函数执行造成了命令命令执行漏洞
shell_exec()中用了ping -c 4来拼接后面,因此后面不能直接跟我们想执行的命令,而只能跟一个ip地址或者一个域名
但是在linux下的命令行中,允许我们使用命令分隔符来一次执行多条命令
使用”;”来分隔命令,先执行分号之前的然后执行分号之后的命令

使用”&”来分隔命令,限制性&之后的,然后执行&之前的

我们可以看出,这道题过滤了这些连接符
但是我们可以利用%0a来代替连接符绕过
%0a为换行符经过url编码后的形式

最后更新: 2018年01月23日 10:02

原始链接: http://drac0nids.top/2017/08/18/命令执行漏洞/

× 请我吃糖~
打赏二维码