本文目录一览:
- 1、这个网站干什么的 什么是PHP反序列化靶机实战
- 2、简单分析PHP中序列化用法介绍
- 3、请写出php变量序列化和反序列化的函数,并举出1个应用例子
- 4、php数组反序列化。下面这段为什么失败
- 5、php如何循环反序列化?
- 6、php 经过uft-8处理方式之后,反序列化仍然失败
这个网站干什么的 什么是PHP反序列化靶机实战
在我们讲PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。那么什么是序列化呢,序列化说通俗点就是把一个对象变成可以传输的字符串。举个例子,不知道大家知不知道json格式,这就是一种序列化,有可能就是通过array序列化而来的。而反序列化就是把那串可以传输的字符串再变回对象。而反序列化则比较容易出现漏洞。
这么序列化一下然后反序列化,为什么就能产生漏洞了呢?
这个时候,我们就要了解一下PHP里面的魔术方法了,魔法函数一般是以__开头,通常会因为某些条件而触发不用我们手动调用:
在研究反序列化漏洞的时候,如果服务器能够接收我们反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法里面的话,就容易造成很严重的漏洞了。
所以这个网站其实希望告诉大家这个反序列化的问题,并提供一些实战练习。
简单分析PHP中序列化用法介绍
简单分析PHP中序列化用法介绍
序列化在我们学习php中都会有用到了对于序列化我们常用的函数有serialize和unserialize了,希望以下这篇文章能够帮助到各位了解到PHP中序列化用法,具体如下:
0x00 序列化函数
serialize():返回带有变量类型和值的字符串
unserialize():想要将已序列化的字符串变回 PHP 的值
测试代码:
?php
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$a = $a;
$this-b = $b;
}
}
class test1 extends test{
function __construct($a){
$this-a = $a;
}
}
$a = 'hello';
$b = 123;
$c = false;
$d = new test('helloa','hellob','helloc');
$e = new test1('hello');
var_dump(serialize($a));
var_dump(serialize($b));
var_dump(serialize($c));
var_dump(serialize($d));
var_dump(serialize($e));
?
运行结果:
string 's:5:"hello";' (length=12)
string 'i:123;' (length=6)
string 'b:0;' (length=4)
string 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' (length=46)
string 'O:5:"test1":2:{s:1:"a";s:5:"hello";s:1:"b";N;}' (length=46)
序列化字符串格式: 变量类型:变量长度:变量内容 。
如果序列化的是一个对象,序列化字符串格式为:
变量类型:类名长度:类名:属性数量:{属性类型:属性名长度:属性名;属性值类型:属性值长度:属性值内容}
将上述结果反序列化输出,执行结果:
string 'hello' (length=5)
int 123
boolean false
object(test)[1]
public 'a' = null
public 'b' = string 'hellob' (length=6)
object(test1)[1]
public 'a' = string 'hello' (length=5)
public 'b' = null
0x01 对象序列化
当序列化对象时,PHP 将在序列动作之前调用该对象的成员函数 sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 wakeup()成员函数。
在serialize()函数执行时,会先检查类中是否定义了 sleep()函数,如果存在,则首先调用 sleep()函数,如果不存在,就保留序列字符串中的所有属性。
在unserialize()函数执行时,会先检查是否定义了 wakeup()函数。如果 wakeup()存在,将执行__wakeup()函数,会使变量被重新赋值。
serialize()测试代码:
?php
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$this-a = $a;
$this-b = $b;
}
function __sleep(){
echo "b has changed"."\n";
$this-b = 'hib';
return $this-b;
}
function __wakeup(){
echo "a has changed"."\n";
$this-a = 'hia';
}
}
class test1 extends test{
function __construct($a){
$this-a = $a;
}
}
$d = new test('helloa','hellob','helloc');
$e = new test1('hello');
serialize($d);
serialize($e);
var_dump($d);
var_dump($e);
?
执行结果:
b has changed b has changed
object(test)[1]
public 'a' = string 'helloa' (length=6)
public 'b' = string 'hib' (length=3)
object(test1)[2]
public 'a' = string 'hello' (length=5)
public 'b' = string 'hib' (length=3)
unserialize()测试代码:
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$this-a = $a;
$this-b = $b;
}
function __sleep(){
echo "b has changed"."\n";
$this-b = 'hib';
return $this-b;
}
function __wakeup(){
echo "a has changed"."\n";
$this-a = 'hia';
}
}
class test1 extends test{
function __construct($a){
$this-a = $a;
}
}
$d = 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' ;
请写出php变量序列化和反序列化的函数,并举出1个应用例子
PHP中的序列化和反序列化分别通过函数serialize()和unserialize()即可实现。serialize()的参数可以是resource类型外的所有变量类型,最常见的是用来序列化对象,unseialize()将serialize的返回结果作为参数,进行反序列化,得到原对象。$str = serialize ($obj);...$obj222 = unserialize($str);现在可以用$object222对象来执行该对象可以执行的各种操作。在用serialize序列化对象时,会自动调用__sleep方法,__sleep方法必须返回一个数组,包含需要串行化的属性。 PHP会抛弃其它属性的值, 如果没有__sleep方法,PHP将保存所有属性,包括private属性。用unserialize反序列化对象时,PHP 会调用__wakeup方法。__sleep和__wakeup方法可以根据实际需要,都添加上,也可以只要其中的一个,当然也可以都不要。下面给出一个序列化的代码:共serialize.php和unserialize.php两个文件。// serialize.php?php
class User
{
private $name;
private $id;
public $sex="F";
function __construct()
{
//give user a unique ID 赋予一个不同的ID
$this-id = uniqid();
}
function __sleep()
{
//do not serialize this-id 不串行化id
return(array("name","sex"));
}
function __wakeup()
{
//give user a unique ID
$this-id = uniqid();
}
function p(){
echo "in function p() \t";
return $this-name;
}
function setname($name){
$this-name = $name;
}
} //create object 建立一个对象
$u = new User;
$u-setname("pphu");
//serialize it 串行化
$s = serialize($u);
echo "in serialize.php br/";
print_r($s);
echo "br/";
print_r($u);
echo "br/br/";
? //// unserialize.php?php
include('serialize.php');
//global $s;
$u2 = unserialize($s);
echo "in unserialize.phpbr/";
echo $u2-p()."br/";
echo $u2-sex."br/";
print_r($u2);
?
php数组反序列化。下面这段为什么失败
不要滥用heredoc,代码不美观。
我试过了,用序列化的结果反序列化是没问题的,你检查一下是不是有个别字符对不上?
php如何循环反序列化?
1.构造HITCON类反序列化字符串,其中$method='login',$args数组’username’部分可用于构造SQL语句,进行SQL注入,'password’部分任意设置。
2.调用login()函数后,利用username构造联合查询,使查询结果为SoFun类反序列化字符串,设置username构造联合查询,使查询结果为SoFun类反序列化字符串,设置username构造联合查询,使查询结果为SoFun类反序列化字符串,设置file=‘flag.php’,需绕过__wakeup()函数。
3.绕过oadData()函数对反序列化字符串的验证。
4.SoFun类 __destruct()函数调用后,包含flag.php文件,获取flag,需绕过__wakeup()函数。
php 经过uft-8处理方式之后,反序列化仍然失败
??UTF-8处理!不过是进行了一个正则替换而已,应该是规则写的不完整,可以用在线正则工具测试一下