• 命令执行漏洞详解


    介绍

    命令执行漏洞是值应用有时需要调用一些执行系统命令的函数,如:system()、shell_exec()、eval()、passthru(),代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

    分类

    1、代码层过滤不严

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

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

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

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

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

      wordpress中用来处理图片的ImageMagick组件;

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

      ThinkPHP命令执行;

    利用条件

    1、应用调用执行命令的函数

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

    3、没有对用户输入过滤或过滤不严格

    常见拼接符

    命令A ;命令B 先执行命令A,在执行命令B
    命令A && 命令B 命令A执行成功,才会执行命令B
    命令A & 命令B 简单拼接,命令A、B之间没有制约关系
    命令A | 命令B 显示命令B的执行结果
    命令A || 命令B 命令A执行失败,才会执行命令B

    PHP中的危险函数

    system():  成功则返回命令输出的最后一行,失败则返回 FALSE。

    exec():   命令执行结果的最后一行内容

    shell_exec():  命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NUL。

    passthru(): 执行外部程序并且显示原始输出。

    eval():   将输入的字符串参数当做PHP程序代码来执行。

    命令执行常见可控位置情况

    system("$sag");  //可控点直接是待执行的程序

    stem("/bin/prog $arg")  //可控点是传入程序的整个参数

    system("/bin/prog -p $arg");  //可控点是传入程序的某个参数的值(无引号包裹)

    system("/bin/prog -p="$arg"");  //可控点是传入程序的某个参数的值(有双引号包裹)

    system("/bin/prog -p='$arg'");  //可控点是传入程序的某个参数的值(有单引号包裹)

    利用方式

    方式一:常见拼接符利用

    1、&&拼接符

     2、&拼接符

     3、||拼接符

    4、|拼接符

    方式二:添加用户

    创建用户a

     查看用户是否创建成功

     将用户a添加管理员组

     使用创建的用户进行远程登录

    方式三:执行函数,信息泄露

    执行函数,phpinfo();

    方式四:写入文件,反弹shell

    在目标/tmp目录下写入反弹shell脚本

    使用命令执行漏洞,执行写入的脚本

    nc监听端口,得到目标服务器shell

    命令执行漏洞危害

    • 继承WEB服务程序的权限去执行系统命令或读写文件
    • 反弹shell
    • 控制整个网站甚至服务器
    • 进一步内网渗透

    命令执行漏洞防御方式

    • 尽量少用执行命令的函数或直接禁用
    • 参数值尽量使用引号包括,并在拼接前调用addslashes函数进行转义
    • 在使用动态函数之前,确保使用的函数是指定的函数之一
    • 在进入执行命令的函数方法之前,对参数进行过滤,对敏感字符进行转义
    • 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤
  • 相关阅读:
    maven settings.xml 文件
    Ajax配合后端实现Excel的导出
    线性表的链式存储--单链表
    微软最新开源工具PowerToys,让你的win10更加好用!!
    二叉树合集(三):线索二叉树(图文详解)
    二叉树合集(二):霍夫曼树(图文详解)
    二叉树合集(一):二叉树基础(含四种遍历,图文详解)
    二叉树合集(六):高度平衡的二叉搜索树简介(图文解析)
    二叉树合集(五):二叉搜索树(图片详解,含基本操作)
    【LeetCode】108.将有序数组转换为平衡二叉树(中序遍历三种方法,java实现)
  • 原文地址:https://www.cnblogs.com/wszgg/p/14194880.html
Copyright © 2020-2023  润新知