ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

反序列化基础学习

反序列化基础学习 PHP(1)php变量PHP中变量用来存储数据比如文件路径、文件名、接收参数等变量必须以开头比如开头比如开头比如name、uplaoddir、uplaod_dir、uplaodd​ir、file_name、$file_path等且变量名区分大小写变量可直接赋值不需要声明类型如$upload_dir./uploads/;//字符串类型$age20//数字类型其中若要声明全局变量则设为global $upload_dir即可若要声明不删除的局部变量静态变量则设为static $upload_dir即可(2)php echo/printecho - 可以输出一个或多个字符串print - 只允许输出一个字符串返回值总为 1(3)php字符串拼接php与python不同点之一在于其具有拼接功能拼接两个字符串仅需要使用.即可也是文件上传漏洞的核心语法核心案例如下:$upload_dir./uploads/;$file_nametest.php;$file_path$upload_dir.$filen_ame(4)php超级全局变量php官方内置全局变量可以在任何域内使用所有超全局变量均是大写的数组形式专门接收用户从浏览器传递给服务器的数据是后端接收前端参数的核心方式也是Web漏洞数据入口。$_FILES文件上传专属超全局变量专门用来接收用户上传文件的所有信息的变量核心语法$_FILES[表单名称][属性名]常用$_FILES[file][name]:获取用户上传文件的原始文件名,攻击方常改$_FILES[file][tmp_name]:获取用户上传文件在服务器的临时文件名临时文件路径攻击方没法改$_GET专门接收用户通过get请求传递的所有数据数据来源于浏览器url中例如访问http://www.xxx.com/index.php?useradminpwd123$user$_GET[user];//接收的值为admin$pwd$_GET[pwd];//接受的值为123$_POST专门接收用户通过POST请求传递的所有数据数据藏在请求体中URL中不可见核心语法$_POST[参数值]后端会接收参数所有敏感数据、文件、表单信息等都是通过post传参(5)php类型比较松散比较使用两个等号 比较只比较值不比较类型。严格比较用三个等号 比较除了比较值也比较类型。?phpif(4242){echo1、值相等;}echoPHP_EOL;// 换行符if(4242){echo2、类型相等;}else{echo3、类型不相等;}?输出1、值相等 3、类型不相等(6)php运算符运算符名称功能示例x y加x 和 y 的和2 2x - y减x 和 y 的差5 - 2x * y乘x 和 y 的积5 * 2x / y除x 和 y 的商15 / 5x % y模除法的余数x 除以 y 的余数5 % 2 10 % 8 10 % 2-x设置负数取 x 的相反符号?php $x 2; echo -$x; ?~x取反x 取反按二进制位进行取反运算。运算规则~1-2; ~0-1;?php $x 2; echo ~$x; ?a . b并置连接两个字符串“Hi” . “Ha”x xor y异或如果 x 和 y 有且仅有一个为 true则返回 truex6y3(x6 xor y3) 返回 false(7)php if-else if-else与switch语句?phpif(条件){if条件成立时执行的代码;}elseif(条件){elseif条件成立时执行的代码;}else{条件不成立时执行的代码;}??phpswitch(expression){casevalue1:// 代码块1break;casevalue2:// 代码块2break;// 更多的 case 语句default:// 如果没有匹配的值}?(8)php数组在 PHP 中array() 函数用于创建数组array();在 PHP 中有三种类型的数组数值数组- 带有数字 ID 键的数组关联数组- 带有指定的键的数组每个键关联一个值多维数组- 包含一个或多个数组的数组1)PHP 数值数组自动分配 ID 键ID 键总是从 0 开始$carsarray(Volvo,BMW,Toyota);人工分配 ID 键$cars[0]Volvo;$cars[1]BMW;$cars[2]Toyota;获取数组的长度 - count() 函数count() 函数用于返回数组的长度元素的数量count($cars);2)PHP 关联数组关联数组是使用您分配给数组的指定的键的数组。有两种创建关联数组的方法$agearray(Peter35,Ben37,Joe43);or:$age[Peter]35;$age[Ben]37;$age[Joe]43;3)php多维数组array(array(elements...),array(elements...),...)三维数组array(array(array(elements...),array(elements...),...),array(array(elements...),array(elements...),...),...)(9)php面向对象(同C)类− 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。对象− 是类的实例。成员变量− 定义在类内部的变量。该变量的值对外是不可见的但是可以通过成员函数访问在类被实例化为对象后该变量即可成为对象的属性。成员函数− 定义在类的内部可用于访问对象的数据。类定义?phpclassphpClass{var$var1;var$var2constant string;functionfunc1($arg1,$arg2){[..]}functionfunc2($arg1,$arg2){[..]}functionfunc3($arg1,$arg2){[..]}[..]}?类使用class关键字后加上类名定义。类名后的一对大括号({})内可以定义变量和方法。类的变量使用var来声明, 变量也可以初始化值。函数定义类似 PHP 函数的定义但函数只能通过该类及其实例化的对象访问。对象定义$anewSite;$bnewSite;$cnewSite;调用成员方法在实例化对象后我们可以使用该对象调用成员方法该对象的成员方法只能操作该对象的成员变量$a-func1();$b-func2();$c-func3();php反序列化将php序列化后的数据恢复为内存中原始对象的过程(1)基本函数serialize()函数就是典型的序列化函数专门用于将php对象转换成一串结构化的、可传输的纯字符串的过程serialize($obj);unserialize就是典型的反序列化函数将序列化生产的字符串还原为序列化之前的完整php对象unserialize($str);(2)序列化后字符串解析序列化字符串由类型标识长度内容组成⚪表示这是对一个对象的序列化结果分隔符用于分隔标识、长度、内容数字标识后续内容长度“字符串”标识类名、属性名、属性值{}包裹对象的所有属性键值对o:4:Show:1;{s:3:cmd;s:3:calc;}O:4:Show标识这是个对象长度为4类名为Show:1表示该方法包含1个属性{}内s:3:cmd该属性的键名是字符串类型长度为3键名为cmds:4:calc该属性的键名是字符串类型长度为4键名为calc(3)漏洞触发要素(1反序列化参数完全可控且无校验服务器端的unserialize函数的参数是由前端用户传递的且开发者没有对传入序列化字符串进行任何校验不校验字符串来源、不校验序列化字符串对应类名是否合法、不校验序列化字符串的内容是否被篡改(2目标类中存在可自动触发的魔术方法目标服务器代码中被反序列化类中定义了__wakeup、__destruct等魔术方法反序列化操作化自动触发这些魔术方法无需手动调用开发者无法感知该过程(3魔术方法调用高危函数魔术方法的函数体内部调用了system、eval、exec等可以直接执行系统命令或php代码的高危函数、且危险函数的参数是类的可控属性。魔术方法名触发条件漏洞利用场景__wakeup当PHP执⾏unserialize函数对⼀个序列化字符串进⾏反序列化操作时⽴刻⾃动触发该⽅法。反序列化漏洞最主要的触发点常⽤于恢复数据库连接、重新初始化对象若此处调⽤危险函数则直接漏洞__destruct当⼀个PHP对象的⽣命周期结束时⾃动触发该⽅法。反序列化漏洞的第⼆核⼼触发点优先级甚⾄⾼于wakeup即使__wakeup被过滤脚本执⾏结束时仍会触发该⽅法隐蔽性极强是代码审计的重点。__construct当使⽤new关键字实例化⼀个对象时⾃动触发该⽅法。构造⽅法⽤于对象的初始化若初始化逻辑中包含危险函数攻击者可通过实例化对象触发漏洞注意反序列化操作不会触发该⽅法。(4)漏洞利用攻击者通过抓包⼯具将数据包请求体中原有的合法序列化字符串替换为⾃⼰构造的恶意载荷发送请求到服务器服务器接收到请求后读取参数中的恶意字符串执unserialize反序列化反序列化的瞬间⾃动触发Show类中的魔术⽅法魔术⽅法执⾏内部的system函数将攻击者传⼊的恶意命令作为参数执⾏最终服务器执⾏了攻击者的命令攻击者实现对服务器的远程控制
返回列表