命令注入-笔记

命令注入原因漏洞危害相关函数和语言结构漏洞利用防御方法| 和 ||,& 和 && 的区别

命令注入

原因

当应用需要调用一些外部程序时会用到一些系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入情况下,会造成命令执行漏洞。

漏洞危害

1、继承Web 服务器程序权限,去执行系统命令

2、继承Web 服务器权限,读取文件

3、反弹Shell

4、控制整个网站

5、控制整个服务器

相关函数和语言结构

system():能够将字符串作为OS命令执行,自带输出功能。

if(isset($__GET('cmd'))){

echo "

";

system($__GET['cmd']);

}else{

echo "?cmd=ipconfig";

}

?>

exec():能够将字符串作为OS命令执行,需要输出执行结果。返回结果是有限的。

if(isset($__GET['cmd'])){

echo "

";

print exec($__GET['cmd']);

}else{

echo "?cmd=whoami";

}

?>

shell_exec(): 应用的最广泛

if(isset($__GET['cmd'])){

print shell_exec($__GET['cmd']);

}else{

echo "?cmd=whoami";

}

?>

passthru():

if(isset($__GET['cmd'])){

passthru($__GET['cmd']);

}else{

echo "?cmd=whoami";

}

?>

poen():

if(isset($__GET['cmd'])){

$cmd=$__GET['cmd'].">>1.txt";

popen($cmd,'r');

}else{

echo "?cmd=whoami";

}

?>

**反引号:**一种语言结构,反引号[``]内的字符串,会被解析成OS命令

if(isset($__GET['cmd'])){

$cmd=$__GET['cmd'];

print(`$cmd`);

}else{

echo "?cmd=whoami";

}

?>

漏洞利用

OS命令注入漏洞,攻击者直接集成Web用户权限,在服务器上执行任意命令,危害特别大。

查看当前路径

提交参数[?cmd=cd]

写文件

提交参数[?cmd=echo “” > D:XXX \ XXX \ XXX]

防御方法

1、尽量减少命令执行函数的使用,并在disable_functions 中禁用

2、在进入命令执行的函数或方法之前,对参数进行过滤

3、值尽量使用引号包裹,并在拼接之前调用add slashes 进行转义

| 和 ||,& 和 && 的区别

|| 和 && 定义为逻辑运算符

| 和 & 定义为位运算符

&& 如果两个操作数都非零,则条件为真;

|| 如果两个操作数中有任意一个非零,则条件为真

& 按位与操作,按二进制位进行"与"运算。运算规则:(有 0 则为 0)

0&0=0;

0&1=0;

1&0=0;

1&1=1;

| 按位或运算符,按二进制位进行"或"运算。运算规则:(有 1 则为 1)

0|0=0;

0|1=1;

1|0=1;

1|1=1;

举个例子,a=1 b=2

所以 a>0 这个值为true b>1 这个值为true b>2 这个值为 false

如 if(a>0&b>1) 我们可以得出 if(true&true),条件成立(true不为0,所以true&true不为0)

如 if(a>0&&b>1) 我们可以得出 if(true&&true),条件成立(&&两边操作数都非零,所以条件成立)

如 if(b>2&a>0) 我们可以得出 if(false&true),条件不成立(false为0,false&true为0,条件不成立)

如 if(b>2&&a>0) 我们可以得出 if(false&&a>0),条件不成立(&&左侧为false,&&运算到此结束,条件不成立)

可以看出 & 和 && 在判断语句中都可以实现“和”这个功能,不过区别在于 & 两边都运算,而 && 先算 && 左侧,若左侧为 false 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&(换句话就是逻辑运算就老老实实用逻辑运算符,不然它为啥叫逻辑运算符呢?)