zoukankan      html  css  js  c++  java
  • 命令执行漏洞攻击&修复建议

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

    命令执行攻击过程

    页面1.php提供了ping的功能,当给参数IP输入127.0.0.1时, 程序会执行ping 127.0.0.1,然后将ping的结果返回到页面上,如下图所示。


    而如果将参数IP设置为127.0.0.1|dir,然后再次访问,从返回结果可以看到,程序直接将目录结构返回到页面上了,这里就利用了管道符"|” 让系统执行了命令dir,如下图所示。

    下面展示了常用的管道符。

    Windows系例支持的管道符如下所示。

    • "|”:直接执行后面的语句。例如: ping 127.0.0.1|whoami.
    • “||”:如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。例如: ping 2|whoami.
    • "&”: 如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如: ping 127.0.0.1&whoami.
    • "&&” :如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如: ping 127.0.0.1&&whoami.

    Linux系统支持的管道符如下所示。

    • ";" :执行完前面的语句再执行后面的。例如: ping 127.0.0.1;whoami.
    • "|":显示后面语句的执行结果。例如: ping 127.0.0.1|whoami.
    • "||":当前面的语句执行出错时,执行后面的语句。例如: ping 1||whoami.
    • "&" :如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如: ping 127.0.0.1&whoami.
    • "&&" :如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。例如: ping 127.0.0.1&&whoami.

    命令执行漏洞代码分析

    服务端处理ping的代码如下所示,程序获取GET参数IP,然后拼接到system()函数中,利用system()函数执行ping的功能,但是此处没有对参数IP做过滤和检测,导致可以利用管道符执行其他的系统命令,代码如下所示。

    <?php
    echo system("ping -n 2 " . $_GET['ip']);
    ?>
    

    命令执行漏洞修复建议

    • 尽量不要使用命令执行函数。
    • 客户端提交的变量在进入执行命令函数前要做好过滤和检测。
    • 在使用动态函数之前,确保使用的函数是指定的函数之一。
    • 对PHP语言来说,不能完全控制的危险函数最好不要使用。
  • 相关阅读:
    安装sqlserver后 服务启动过几秒就自动停止
    MVC使用基架添加控制器出现的错误:无法检索XXX的元数据
    HTML:模拟链接被按下,在新标签页打开页面,不使用window.open(可能被拦截)
    解决 NDP40-KB2468871不能安装
    十进制转二进制and位运算符
    行万里路
    grunt使用小记之uglify:最全的uglify使用DEMO
    grunt使用小记之开篇:grunt概述
    HTTP权威指南阅读笔记五:Web服务器
    ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
  • 原文地址:https://www.cnblogs.com/coderge/p/command-execution-vulnerability-attacks-and-repair-suggestions.html
Copyright © 2011-2022 走看看