源码泄露

第一步是用扫描工具扫描到www.zip文件,获得网站源码。
看到网站目录结构。打开config.php发现有flag,所以我们的目的就是如何读取这个config.php
随便注册个号进去
这里就是注入点,之后会提到。

读源码

用代码审计工具发现几个要点,我们进去看看。

<?phprequire_once('class.php');if($_SESSION['username'] == null) {die('Login First'); }$username = $_SESSION['username'];$profile=$user->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']));
?>

这里就是重点代码了,以及核心处理代码class.php

<?php
require('config.php');class user extends mysql{private $table = 'users';public function is_exists($username) {$username = parent::filter($username);$where = "username = '$username'";return parent::select($this->table, $where);}public function register($username, $password) {$username = parent::filter($username);$password = parent::filter($password);$key_list = Array('username', 'password');$value_list = Array($username, md5($password));return parent::insert($this->table, $key_list, $value_list);}public function login($username, $password) {$username = parent::filter($username);$password = parent::filter($password);$where = "username = '$username'";$object = parent::select($this->table, $where);if ($object && $object->password === md5($password)) {return true;} else {return false;}}public function show_profile($username) {$username = parent::filter($username);$where = "username = '$username'";$object = parent::select($this->table, $where);return $object->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 __tostring() {return __class__;}
}class mysql {private $link = null;public function connect($config) {$this->link = mysql_connect($config['hostname'],$config['username'], $config['password']);mysql_select_db($config['database']);mysql_query("SET sql_mode='strict_all_tables'");return $this->link;}public function select($table, $where, $ret = '*') {$sql = "SELECT $ret FROM $table WHERE $where";$result = mysql_query($sql, $this->link);return mysql_fetch_object($result);}public function insert($table, $key_list, $value_list) {$key = implode(',', $key_list);$value = '\'' . implode('\',\'', $value_list) . '\''; $sql = "INSERT INTO $table ($key) VALUES ($value)";return mysql_query($sql);}public function update($table, $key, $value, $where) {$sql = "UPDATE $table SET $key = '$value' WHERE $where";return mysql_query($sql);}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 __tostring() {return __class__;}
}
session_start();
$user = new user();
$user->connect($config);
else {$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。
在过滤的时候如果遇到where会换成hacker。这里是5个字符变成了6个字符,这里就可以逃逸了。之前做过字符变少的情况,这次字符变多的情况是不太一样的。这里就要利用到序列化的拼接+伪造,对nickname参数攻击,比如该序列化字符串:

a:3:{s:4:"dddd";s:6:"ddddhm";}

我们在dddd的地方输入 dddd";s:10:“buhaobuhao”;} 就变成了:

a:3:{s:25:"dddd";s:10:"buhaobuhao";}";s:6:"ddddhm";}

但是相应的,dddd前面的字符串长度也变了,变成25了,所以这里会报错。我们就要想办法把dddd变成25位长度,还差21位。
那么我们dddd这这个位置的字符变长21个不就好了吗?
这里对应这道题是把21个where换成hacker就行了。
但是这道题要换34个。

nickname[]=where";}s:5:"photo";s:10:"config.php";}

注意有34个where,这里就可以让后面34个字符逃逸出来,让photo等于config.php,然后让原本的photo作废。

因为对nickname有一次过滤
这个过滤可以用数组绕过。
这里有张标可供参考

md5(Array()) = null
sha1(Array()) = null
ereg(pattern,Array()) =null
preg_match(pattern,Array()) = false
strcmp(Array(), “abc”) =null
strpos(Array(),“abc”) = null
strlen(Array()) = null

因为是数组,所以最终payload前多一个}
这里举个例子
这里可以看到数组和变量序列化的结果是不一样的。
最终payload

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

bp抓包发一下进去得到base64解码得到flag。
详细参考https://blog.csdn.net/qq_43622442/article/details/105751356

0CTF piapiapia相关推荐

  1. iscc 2021wp

    目录 MISC 变异的SM2 区块链 Hack the Victim 海市蜃楼2 小明的表情包 李华的红包 Retrieve_the_passcode 海市蜃楼1 美人计 检查一下 小明的宠物兔 We ...

  2. PHP反序列化由浅入深,细说php反序列化字符逃逸

    原标题:细说php反序列化字符逃逸 11/5 文章共计4381个词 预计阅读10分钟 前言 php反序列化的字符逃逸算是比较难理解的一个知识点,在最近的好几场比赛中都出现了相关的题,于是下定决心彻底理 ...

  3. ✿ISCC2021✿题目以及部分wp

    文章目录 ISCC 部分web.杂项wp WEB ISCC客服一号冲冲冲(一) 这是啥 Web01 ISCC客服一号冲冲冲(二) 登录 misc 李华的红包 Retrieve_the_passcode ...

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

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

  5. BUCTF[0CTF 2016]piapiapia

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

  6. BUU [0CTF 2016]piapiapia

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

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

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

  8. [0CTF 2016] piapiapia

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

  9. BUUCTF-WEB 【0CTF 2016】piapiapia 1

    考点:php反序列化字符长度逃逸 打开题目 一般看到登录框,就以为是sql注入题,这道题不是. dirsearch扫网站目录 python3 dirsearch.py -u "http:// ...

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

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

最新文章

  1. Android 动画的插值器 (Interpolator属性)
  2. 以太网实习_一位工科男在拿到华为实习生offer后的面经干货
  3. Linux stat命令总结
  4. WinDBg定位asp.net mvc项目异常崩溃源码位置
  5. 怎样删去csv中重复行_4个锦囊,祝你快速删去Excel中的重复数据
  6. 数据库执行自定义函数报错问题记录
  7. 编程实现strcpy函数
  8. 实现三级导航demo
  9. css样式,鼠标移动上去变成禁用、小手等样式。
  10. CVPR 历年 Best paper(1988-2020)汇总,持续更新~
  11. 计算机触摸板设置方法,笔记本的触摸板怎么用_笔记本电脑触摸板的使用教程-win7之家...
  12. nuvoton ADC采集
  13. 【2021-01-05】JS逆向之B站模拟登入(含极验点选)
  14. 风拂树,月下杯影为伊留...
  15. HTML和CSS基础
  16. 利用Java处理图片,更换背景
  17. 计算机科学与技术中文核心期刊
  18. 数理统计_正态分布经典例题
  19. 一本正经需求洽谈老黄历 No.136
  20. 找不到认证服务器 是否网卡选择错误,锐捷上网认证常见问题及解决办法

热门文章

  1. WIFI下无法登录百度网盘
  2. matlab爆炸建模,7.2.5萨墓基尔加丹M螺旋爆炸技能建模分析
  3. 如何在小方框上打对号 小方框内打对勾 word 方框打对勾
  4. Joey Logano 嘉年华正式开始,和 Joey Logano 一起竞赛吧
  5. 算法竞赛专题解析(0)--写作计划
  6. 云上架构和传统IT架构有什么区别及优势?
  7. 一步步学习k8s(二)
  8. jQuery动画slideUp()不正常位移原因
  9. 如何使用计算机上合并计算方法,Excel2019中合并计算的使用方法
  10. 买的鱼丸怎么做好吃 鱼丸的家常做法介绍