Please_RCE_Me

/这题挺简单的妥妥签到题/

  1. 打开题目,得到提示GET传moran=flag

    image-20231029203501472

    image-20231029203532687

    可以看到源码

  2. 分析源码,需要利用的函数是preg_replace(),使用了/e修饰符,当第一个参数的字符串在第三个参数中检测到时,会将第二个参数作为php代码执行,且使用了/i的修饰符,大小写不敏感

    image-20231029203952234

  3. 需要绕过正则匹配

    image-20231029220207510

    能直接用的命令执行函数基本上都被过滤了,限制了flag字符串长度,并且过滤了preg_replace()中的please_give_me_flag,但是没有使用/i大小写不敏感,所以可以用大写绕过

    task参数传入的为我们需要执行的代码,flag参数传入含有please_give_me_flag的字符串

    查阅可以进行RCE的函数,发现还有一个array_map()可以使用

    array_map()需传入两个参数,第一个参数为使用的函数,第二个参数为一个数组,并且数组的数据为函数的参数,例如

    1
    2
    &arr = array('phpinfo()');
    array_map('assert',&arr);

    就可以执行phpinfo()

    由于task参数被限制,可以添加$_POST['a']来执行任意代码

    1
    payload:task=array_map($_POST['a'],$_POST['b'])&flag=please_give_me_flaG&a=assert&b[]=phpinfo()

    image-20231029205429545

  4. 执行成功,开始找flag,用system()

    1
    task=array_map($_POST['a'],$_POST['b'])&flag=please_give_me_flaG&a=system&b[]=ls

    image-20231029205552425

    image-20231029205605004

    image-20240501152539225

    得到flag