【攻防世界】网鼎杯2018 Web fakebook

学web总是能让我学到新的知识,很开心,很有趣,很好玩
打开题目
在这里插入图片描述
一个登录按钮,一个注册按钮,其余没有什么发现,对于web来说,常规先测试一下robots.txt文件
在这里插入图片描述
果然又发现,有一个bak文件,我们下载下来看看
在这里插入图片描述
我一看,这不又是序列化的题吗?是可以执行curl命令的,但是现在还没有什么头绪,我们先注册一个账号看看
在这里插入图片描述
也没有什么信息,我们点进admin看看
在这里插入图片描述
乍一看没什么思路,我们看一下源代码
在这里插入图片描述
这里给了一个链接说是博客页面,猜测就是这里使用了curl获取页面,暂时还不知道怎么利用,我们再看看有没有什么能提供思路的地方
看了看,发现链接可能存在sql注入
在这里插入图片描述
我们尝试注入一下,测试了一下,确实存在注入点,当我们输入1 and 1=1#页面正常显示
在这里插入图片描述
但当我们输入1 and 1=2#时,页面就报错了
在这里插入图片描述
确定存在注入点,我们看看有几个字段
在这里插入图片描述
使用联合查询的时候,waf把我们拦截下来了,尝试一下使用注释绕过
在这里插入图片描述
成功绕过了,并且测试字段数量为4,因为为5的时候,页面就报错了
我们先查询一下当前的数据库名字
在这里插入图片描述
注意,查询的时候要把1改为-1才行,查询到数据库名字为fakebook
我们乘胜追击,查一下他的表名
在这里插入图片描述
查出来表名为users,我们再看看他有些什么字段
在这里插入图片描述
分别有no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS这些字段,我都看过了,只有data字段有点用,我们把data字段的数据取出来看看
在这里插入图片描述
是一段序列化后的字符串,那思路就很明确了,我们需要反序列化他,传入恶意的代码
我们分析一下最早拿到的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);
    }

}

我们一个一个分析
get函数:会传入一个url值,就是我们输入的blog值,然后会curl这个url,把url返回的内容输出到页面上,curl是可以使用file协议来包含文件的
get里面的几个curl函数解释如下

curl_init:初始化新的会话,返回 cURL 句柄,供curl_setopt()、 curl_exec() 和 curl_close() 函数使用。
curl_setopt:为 curl 会话句柄设置选项。
curl_exec:执行给定的 curl 会话。
curl_getinfo:获取最后一次传输的相关信息。

然后我们再看看
isValidBlog函数:对我们注册时传入的blog值进行过滤,不然我们注册的时候就可以直接用file伪协议进行文件读取了

了解了代码都是干嘛的之后,我们就可以构造php序列化字符串了
根据之前报错显示出来的路径为/var/www/html/view.php,我们可以构造下面的代码

<?php

class UserInfo
{
    public $name = "abc";
    public $age = 123;
    public $blog = "file:///var/www/html/flag.php";
}
$a=new UserInfo();
echo serialize($a);

找一个php解释器运行一下就可以得到一串序列化字符串了
然后用这串字符串sql注入
在这里插入图片描述
我们再看看源代码
在这里插入图片描述
成功返回了flag.php的内容,我们把它使用base64解码一下,就可以得到flag了
在这里插入图片描述
但这题好像没有禁用load_file函数,所以,直接使用no=-1 union/**/select 1,load_file(‘/var/www/html/flag.php’),3,4就可以直接做出来
哈哈哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值