命令执行(RCE)漏洞

RCE简介

        RCE(remote command/code execute):远程命令/代码执行。

        命令执行漏洞: 直接调用操作系统命令。

        代码执行漏洞: 靠执行脚本代码调用操作系统命令。

        原因:在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。

原理

        攻击者在一些能够执行系统命令的位置,输入恶意的系统命令,服务器端没有针对执行函数做严格的过滤,导致服务器执行了该恶意的系统命令,从而对服务器产生了安全威胁。

        命令执行和代码执行的区别:命令执行漏洞是直接调用操作系统命令,而代码执行漏洞则是靠执行脚本代码调用操作系统命令。

命令执行

        系统命令执行函数

        System():system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下: system(command,return_var) 其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。

        Exec():exec函数可以用来执行一个外部的应用程序 exec (command, output, return_var) 其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。

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

其中,command是要执行的命令,return_var存放执行命令后的状态值。
        Shell_exec():执行shell命令并返回输出的字符串,函数原型如下: shell_exec (command) 其中,command是要执行的命令。

        popen()         proc_open()         pcntl_exec()

        利用管道符

 Window系列
        " | ":直接执行后面的语句。例如:ping 127.0.0.1 | whoami。
        “ || ”:如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。例如:ping 127.0.0.1 || 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。

代码执行

        脚本代码执行函数

         eval():把字符串按照 PHP 代码来执行。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

        assert():普通调用

        preg_replace()  :对一个字符串进行正则处理

        call_user_func()        array_map()

绕过

绕过空格 

        {cat,flag.txt}        cat${IFS}flag.txt        cat$IFS$9flag.txt        

        cat<flag.txt          cat<>flag.txt             ca\t fl\ag

通配符绕过

        ???在linux里面可以进行代替字母                /???/c?t flag.txt

        *在linux里面可以进行模糊匹配        cat flag.*         *进行模糊匹配php

        ?代表一个字符*代表一串字符

同功能语句替换

编码绕过

        base64、hex编码绕过、unicode编码

关键字符绕过

函数绕过

print_r(scandir(pos(localeconv()))) //当前目录

print_r(scandir(’/’)) //查看根目录文件

输出目录中倒数第二个文件内容:

print_r(next(array_reverse(scandir(pos(localeconv())))))

绕过长度限制

  >>>两个符号的使用

        >命令会将原有文件内容覆盖,如果是存入不存在的文件名,那么就会新建文件再存入

  >>符号的作用是将字符串添加到文件内容末尾,不会覆盖原内容

防御

        1、参数值尽量使用引号包括

        2、尽量少用执行命令的函数或者直接禁用

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

        4、在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义

        5、能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值