行业知识
CTF题目合集
1.反序列化题目
1.分析是什么类型的漏洞:观察代码 可知运用了反序列化函数 且它的参数可控 其次运用了wakeup函数 说明存在反序列话的漏洞
2.分析代码的思路
1. $ctf=@$_POST['ctf']; 用post 方式接受ctf这个参数
@unserialize(base64_decode($ctf)); 对ctf参数先进行base64的解码 然后对解码内容进行了反序列化
2. function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf($v);
}
反序列化之后就会调用wakeup这个函数 : 这个函数的内容 是对参数的内容进行了循环遍历 执行WAF函数的内容
3. function waf($str){
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
return $str;
} else {
echo "don't hack";
}
这个WAF函数 是执行了过滤的操作 对参数的内容进行的过滤 过滤了 如下这些内容
- 在WAF这段PHP脚本结束后 就会执行destruct这个函数 这个函数进行了判断 如果$this->method 包含了ping这个方法 就使用这个函数 call_user_func_array
- call_user_func_array 这个函数的作用:call_user_func_array() 函数的作用是以回调函数的方式调用一个函数,并将一个数组作为参数传递给该函数。
在给定的代码中,call_user_func_array(array($this, $this->method), $this->args) 的作用是调用对象 $this 的方法 $this->method(也就是调用ping函数的方法 也就是destruct下面那个ping函数),并将 $this->args 数组作为参数传递给该方法。
这种用法通常用于动态地调用对象的方法,并根据需要传递不同的参数。通过将方法和参数封装到一个数组中,可以实现更灵活的调用方式。例如,可以在运行时决定要调用哪个方法,以及传递什么样的参数。
- 所以可以看出来这个$this->method调用的是ping这个方法 args就是所要传的参数 所以 从这里就可以看出来ctf需要传两个内容 一个是ping 另一个就是ping的内容了
- 所以下面那个ping函数的内容那个$ip就是参数的内容 所以现在就需要构造这个参数的内容
- 所以现在就需要构造payload 构造payload时候需要一个new ease的函数
- new ease 是创建 ease 类的一个对象实例。它使用 new 关键字来实例化一个对象,将 ease 类实例化为一个对象,使得该对象可以调用类中定义的方法和属性
- 开始构造payload 首先需要ls一下 看看有没有flag的文件 由于 ls被过滤了 可以但那时\没有被过滤 所以我们可以使用l\s来绕过 因为在linux中 是可以这样拼接命令的 l\仍会继续 你继续输入s后会执行ls的命令