zoukankan      html  css  js  c++  java
  • 网鼎杯 fakebook

    这道题目登录之后我们可以看到有join和login

    login即登录,join即注册

    我们通过查看robots.txt可以知道

    有源代码泄露。

    先将泄露的源码下载下来审计一波

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

    可以看到泄露的是UserInfo这个类的源码,看其他师傅们的WP可以知道还可以扫出来flag.php的存在。

    curl_exec — 执行一个cURL会话

    因为我们要传递自己博客的网址,所以猜测这里是否能够通过file协议读取绝对路径下的文件。

    接着在join里面虽然我们要输入自己博客的网址,但是其进行了非常严格的正则表达式过滤,所以想在这个位置运用file协议基本上是不可能了。

    我们注册一个账号看看

    注册成功即登录,可以看到我们输入的信息可以看到

    这里就是我们输入的博客网址的地方,不过在join的时候如果输入除http/https以外的关键词就会被检测出来,所以我们点击test用户看是否有突破点

    可以看到view.php后面的参数no,这里让我们很容易想到该地点是否存在SQL注入漏洞

    简单测试一下

    输入了and 1=2之后,页面报错,数字型注入,同时页面返回来网站的绝对路径,这正是我们需要的。

    接着我们进行常规注入操作,不过因为有WAF的存在,我们使用union select 的时候需要将空格转换成/**/绕过,当然也可以用其他方法绕过

    这里回显位置是2,我们可以看到爆出了数据,同时页面Notice里面提示了我们unserialize(),所以这里涉及了反序列化漏洞,我们先不管这个,进一步读取数据

    可以看到data是序列化之后的结果,泄露的源代码里面也有getBlogContents函数,其配合get函数,恰好构造成SSRF漏洞, 并且blog的值我们可以通过构造反序列,利用file协议来进行任意文件读取 。

    反序列化的payload我们直接依葫芦画瓢即可

    O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:20;s:4:"blog";s:29:"file:///var/www/html/flag.php";} 

    现在的问题在于我们应当将payload放在哪里,才可以使其正确的被反序列化。

    答案是:在SQL语句里面控制

    因为页面提示了我们反序列化,所以猜测no参数的值代入数据库查询之后还会被反序列化一次,这个时候就会导致blog变成我们构造的blog

    后面分析view.php源代码也可以看出

    所以我们将构造之后的序列化payload放进no参数SQL语句里面,即

    view.php?no=-1/**/union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:20;s:4:"blog";s:29:"file:///var/www/html/flag.php";} ' from users

    这里可以看到blog的值已经成为我们构造的了

    查看源代码

    当然用这个方法还可以查看view.php ,db.php等等文件,加深自己对题目的认识。

  • 相关阅读:
    Xshell安装教程及Xshell安装程序集组件时出错的解决方法
    Xshell远程连接的具体操作和Xshell多会话设置小技巧
    VMware中出现物理内存不足,无法使用配置的设置开启虚拟机解决方案
    在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)
    Sublime Text编辑器配置Python解释器简易教程
    虚拟机创建后该如何获取IP地址并访问互联网实用教程
    关于Scrapy爬虫项目运行和调试的小技巧(下篇)
    Spring的xml和注解对比
    Spring5.X的注解配置项目
    Spring的AOP快速实现通用日志打印
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/12177107.html
Copyright © 2011-2022 走看看