命令注入-笔记
命令注入原因漏洞危害相关函数和语言结构漏洞利用防御方法| 和 ||,& 和 && 的区别
命令注入
原因
当应用需要调用一些外部程序时会用到一些系统命令的函数。应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入情况下,会造成命令执行漏洞。
漏洞危害
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 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&(换句话就是逻辑运算就老老实实用逻辑运算符,不然它为啥叫逻辑运算符呢?)