命令注入是一种常见的漏洞形态。一旦存在命令注入漏洞,攻击者就可以在目标系统执行任意命令。
测试脚本command.py:
import os,subprocess
import sys
command = "ping -c 4 {}".format(sys.argv[1])
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
out = p.stdout.readlines()
for line in out:
print(line.decode('utf-8'))
这允许我们从外部传入参数执行ping命令,但是参数并没有被限制,那么我们就可以注入其他命令,让OS去执行。例如测试注入whoami
python command.py 8.8.8.8 && whoami
实际执行的是ping -c 4 8.8.8.8 && whoami 命令。
原本功能只是用来测试主机和别的主机是否网络可达,现在就造成可以执行任意操作系统命令的漏洞。
一般测试命令可以用 | 、`、&&、;等符号来进行命令拼接。
但是一般情况下很少遇到会完全不过滤的情况,如过滤掉空格
import os,subprocess
import sys
#测试ping功能
command = "ping -c 4 {}".format(sys.argv[1].replace(' ',''))
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
out = p.stdout.readlines()
for line in out:
print(line.decode('utf-8'))
那么可以用payload python command.py 8.8.8.8&&{cat,/etc/passwd}
以上是有回显的情况下,可以直接看打印的命令结果去判断注入的命令是否执行了,但是一般正常情况很少有回显的,因为回显显得比较难看。
一般我们遇到的都是直接输入一个ip地址,然后点击测试,最后告诉你是网络可达还是不可达。
这种就是命令盲注的情况了。
和SQL盲注一样,我们可以用sleep来延时,从返回响应结果的时长来判断是否注入成功。
测试 payload python command.py 8.8.8.8 && sleep 5
这里要注意一点,不是返回响应的时间为5秒就是存在注入,要判断上一次直接ping 8.8.8.8和我们使用payload后的时间差为5秒才能判断命令被注入了。
现在的命令执行中,喜欢做系统权限最小化,只能执行某些命令,不是所有的命令都能执行,这时候可以使用sleep来测试系统是否存在这个命令
例如我直接测试aaa命令不存在的情况
这时候会返回命令不存在,但是是盲注我们看不到这个返回结果,我们能感知的是sleep 5秒没有被执行,因为结果很快被返回了。
curl -h && sleep 5
wget -h && sleep 5
ssh -V && sleep 5
telnet && sleep 5
这样的话就可以用来测试一些用得到的命令了。