学习任务
命令执行漏洞出现的比较少,通常出现在一些系统管理平台,方便运维使用,比如jenkins、zabbix,还有一些组件漏洞,比如反序列化漏洞等。
那么如何利用命令执行漏洞获得系统权限,通过命令执行漏洞上传文件呢?这个需要对系统命令有深入的理解和熟练的操作。
任务目标
学习命令执行漏洞的原理及利用方式
报告要求
1、编写一个存在命令执行漏洞的页面(可以配置两套 win + linux)
2、通过命令执行可以做什么?可以实现什么样的目的
扩展学习
1、对于命令执行的输入口如何过滤,如何验证可以杜绝命令执行的问题
2、对于命令执行无回显的情况,如何获取执行结果
学习报告
0x01 编写一个存在命令执行漏洞的页面
1. 在WINDOWS环境下
这里就是通过Get传入一个参数,这里的cmd参数是可以直接控制,所以我们可以通过发送请求http://127.0.0.1:8080/?cmd=ls
来让ls命令运行。
核心代码示例
1
$_GET['cmd']); system(
2. 在LINUX环境下
$request
变量来自于用户URL的输入,最终进入到system函数里作为命令来执行,但是这段代码没有安全处理用户的输入,任意用户都可以通过如下URL来在机上执行自己的命令。
1 | php?cmd=1190&func=sync_css&uri=hi&from=;cat/etc/passwd;&to=hi&1=2 |
核心代码示例
1
2
3
4
5uri = $request['uri'];
$from = $request['from'];
$to = $request['to'];
$tmp = '/tmp/act_css_tmp_' . $uri;
system("/usr/bin/wget $from -O $tmp");
3. 常见的命令执行函数
System函数
1
2
3system函数可以用来执行一个外部的应用程序并将相应的执行结果输出。
string system(string command, int&return_var)
其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。Exec函数
1
2
3exec函数可以用来执行一个外部的应用程序
string exec (string command, array&output, int &return_var)
其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。Passthru函数
1
2
3passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。
void passthru (string command, int&return_var)
其中,command是要执行的命令,return_var存放执行命令后的状态值。Shell_exec函数
1
2
3执行shell命令并返回输出的字符串。
string shell_exec (string command)
其中,command是要执行的命令。
0x02 命令执行的作用
- 存在回显示的话,可以直接读取各种配置文件,密码文件,数据库连接文件。
- 查看自己的权限,可以提升自己权限,访问敏感数据或控制服务器。
- 通过命令反弹shell拿到服务器的控制权限。
0x03 命令执行漏洞的防御
- 严格对用户输入进行过滤,例如
&
、&&
、|
、||
等连接符必须过滤。 - 尽量少的调用执行系统命令的函数,通过黑名单的方式过滤敏感函数,如在PHP的配置文件php.ini中禁止一部分危险函数。采用白名单的方式对特殊输入的类型/长度进行限制。
- 对开发者要执行特定系统命令,必须把命令转换成一个字符串,然后传给系统执行。
- 在开发中尽量使用
pcntl_exec
这类可以限制一次只执行一条命令并且参数为数组传入的函数而不是system
这种直接调用sh
去执行命令的函数,同时在执行系统命令的时候检查用户输入参数。
0x04 对于命令执行无回显的情况,如何获取执行结果
- 遇到不回显的情况,最可靠的方法使用时间延迟推断,类似与盲注的方法。通过一些命令的延时作用来判断漏洞的存在,例如ping命令。
- 不能在浏览器直接看到回显,可将命令重定向到当前目录下的文件中并查看。或者用TFTP上传工具到服务器,用telnet和netcat建立反向shell,用mail通过SMTP发送结果给自己的计算机