Unseping
观察题目的php源码
发现好长好长,稍微浏览一遍,发现了unserialize函数,说明这道题考到了反序列化这个知识点,没办法,只能一点一点看了
__construct函数(构造函数)
作用:php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。
在对象实例化时自动调用
__destruct()函数(析构函数)
作用:析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。
相当于在代码运行结束时,调用此函数。
In_array()函数
作用:搜索数组中是否存在指定的值。
例子:
相当于源代码中的method必须是ping,因为数组中只有ping(提示)
Call_user_func_array()函数
作用:调用回调函数,并把一个数组参数作为回调函数的参数
例子:
相当于本题这个函数就是类似于输出ease::method args
然后前面又说method只能输入ping,所以相当于调用后面的ping函数,传入的参数为args
Ping函数就是一个自己构造的函数
Exec()函数
作用:执行一个外部程序
本题相当于执行ip,然后将结果传入result
然后通过var_dump输入result
Waf函数就是自己构造的一个函数
Preg_match_all()函数:
作用:preg_match_all 函数用于执行一个全局正则表达式匹配。
因为前面有‘!’相当于过滤的作用
__wakeup()函数
作用:经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
执行unserialize()时,先会调用这个函数。
传参方式是post
反序列化之前会对ctf进行一次base64解码
终于可以搞懂了所有的函数
因为有过滤所以需要进行一些绕过
开始构造函数
运行php文件我使用的是phpstudy,想问问还有其他简便的方法嘛?
发现了flag_1s_here文件,我们查看它
命令:ls flag_1s_here
因为过滤了空格所以我们使用${IFS}绕过,过滤了flag,我们继续通过双引号绕过
发现了flag_(省略).php文件
查看它:cat flag_1s_here/ flag_831b69012c67b35f.php
有/过滤
如果命令注入的网站过滤了某些分割符,可以将分隔符编码后(url编码,base64等)绕过
现在我们尝试八进制绕过
$(printf "\154\163")//ls命令
先编写一个八进制编码脚本
然后在进行反序列化
得到flag