CTF-Web【反序列化】漏洞做题姿势积累

前言

本篇文章专门用于记录做反序列化类题目的做题姿势,会不断更新。

反序列化考点

字符串逃逸

POP构造链

反序列化做题姿势

  1. 首先 正常创建类 有方法调用方法 总之要得到想要的内容

  2. 其次 对创建的类进行序列化 并打印出序列化的内容 需要绕过就更改里面的内容

  3. 最后 把序列化后的内容 进行提交 有需要编码 就进行编码

    pop链构造做题姿势

phar反序列化的三个前提条件> 可以上传phar文件

有可以利用的魔术方法

文件操作函数的参数可控

1、找到可利用的地方,比如,文件包含,命令执行等地方
2、从可以利用地方回溯到可控制的地方,找到一个链条。
3、更改属性内容,先进行序列化,看看能不能达到目的。
4、能够达到目的,才进行反序列化,进行提交 有需要编码 就进行编码

魔法方法

PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:

1. __construct(),类的构造函数

2. __destruct(),类的析构函数

3. __call(),在对象中调用一个不可访问方法时调用

4. __callStatic(),用静态方式中调用一个不可访问方法时调用

5. __get(),获得一个类的成员变量时调用

6. __set(),设置一个类的成员变量时调用

7. __isset(),当对不可访问属性调用isset()或empty()时调用

8. __unset(),当对不可访问属性调用unset()时被调用。

9. __sleep(),执行serialize()时,先会调用这个函数

10. __wakeup(),执行unserialize()时,先会调用这个函数

11. __toString(),类被当成字符串时的回应方法

12. __invoke(),调用函数的方式调用一个对象时的回应方法

13. __set_state(),调用var_export()导出类时,此静态方法会被调用。

14. __clone(),当对象复制完成时调用

15. __autoload(),尝试加载未定义的类

16. __debugInfo(),打印所需调试信息

phar反序列化利用

可以代替unserialize 进行反序列化操作的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fileatime	
filectime
file_exists
file_get_contents
file_put_contents
file
filegroup
fopen
fileinode
filemtime
fileowner
fikeperms
is_dir
is_executable
is_file
is_link
is_readable
is_writable
is_writeable
parse_ini_file
copy
unlink
stat
readfile

注意:生成phar文件//生成phar文件前需要配置php.ini

1
2
3
[Phar]
; http://php.net/phar.readonly
phar.readonly = On 改成 Off

创建对象 exp.phar 是文件名

1
2
3
4
5
6
7
8
$phar = new Phar('exp.phar');
$phar->startBuffering();
// 设置stub
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata($c1);
// 要压缩的文件
$phar->addFromString('exp.txt','test');
$phar->stopBuffering();

特性

在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在wakeup的漏洞
绕过_wakeup魔法方法

绕过方法:只需要将对象属性数量设置比原本的要大即可

利用php>7.1版本对类属性的检测不严格(对属性类型不敏感)

意味着 序列化的时候可以将portected属性换成public属性

1
2
3
4
Private 权限
%00类名%00属性名
Protected 权限
%00*%00属性名

绕过字符过滤

s 换成 S 属性值就可以为十六进制

反序列化原生类的利用

http://www.wangqingzheng.com/anquanke/82/238482.html