攻防世界 fakebook writeup

1、进入环境首先来一波信息收集

  • robots.txt存在,我们知道了有user.php.bak

image.png

  • 收集一波存在哪些路径

image.png
login.php(get)
join.php(get)
join.ok.php(post)
view.php?no=xx(get)
flag.php
join.ok.php和view.php?no=xx可能存在注入

2、分析
user.php.bak,代码对blog的形式做了正则匹配,然后curl执行该blog url的内容,将返回的页面显示在iframe中。这块可能存在SSRF漏洞

name = $name;
        $this->age = (int)$age;
        $this->blog = $blog;
    }
    
    #显示blog页面的内容
    function get($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }
        curl_close($ch);

        return $output;
    }

    #调用上面get方法获取blog的页面内容
    public function getBlogContents ()
    {
        return $this->get($this->blog);
    }

    #判断blog格式是否合法
    public function isValidBlog ()
    {
        $blog = $this->blog;
        return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
    }

}

尝试下sql注入漏洞
sqlmap跑下join.php.ok,跑出了当前所在的表的详细数据,注意到users表的data列存的是UserInfo实例序列化后的结果
image.png
尝试下view.php?no=,存在注入,分析报错得出web路径为 /var/www/html
攻防世界 fakebook writeup_第1张图片

order by判断出从users表中取了4列
union select 被过滤 中间加/**/绕过过滤
image.png
攻防世界 fakebook writeup_第2张图片

使用union select进行查询,分析报错得出第二列进行了回显,可能通过load_file可以获取到flag.php

view.php进行了对某个数据进行反序列化(unserializa)操作,从上面跑出的data分析是对data进行了反序列化操作,在上一步骤中我们得到了user表有4列分别为no,passwd,data,username,并没有单独存放blog列,所以blog显示应该是从data列取出再进行反序列化
image.png
分析下正常情况下的语句,应该是select no,username,(反序列化后的age),(反序列化后的blog) from users
攻防世界 fakebook writeup_第3张图片
我们构造序列化的UserInfo实例,blog内使用file:///读取服务器端flag.php的文本内容
攻防世界 fakebook writeup_第4张图片

3、操作
PAYLOAD1:union/**/select 1,load_file("/var/www/html/flag.php"),3,4
image.png

PAYLOAD2:-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
对获取到的结果base64解码即可
image.png

你可能感兴趣的:(ctf)