字符逃逸
字符变多 :
就把想要构造的变量值的反序列化内容的字符长度记录下来 然后看字符替换会多多少个字符 比如a会替换成aaaaaa 这样子也就是一个a多了5个字符 所以只要写七个a即可成功逃逸
还有字符变少的 没写
打开里面是个代码文件
包含了一个hanxin.exe.php 接收chant参数 进行了序列化(所以传参时要先反序列化)然后调用move函数
打开hanxin.exe.php
Make_a_move函数 循环遍历传入进来的$move变量 把该里面的第一枪-第十三枪(左边的字符)
替换成右边的字符
所以这题要获取flag就要把Spear_Owner改成MaoLei
但是有个问题就是他只接收chant变量 只能修改chant的值 修改不了Spear_Owner的值
所以这里想到利用反序列化的字符逃逸 提前闭合 因为传入chant的值 如果有包含过滤数组的东西的话(第一枪到第十三枪)他就会替换成更长的字符串 这样子输入的字符就会因此变多
首先计算后面的值
然后发现原本第十枪的字符时16 会被替换成21个的字符 也就是会多5个字符
然后使用第九枪 原本12个字符 替换成32个的字符 也就是多20个字符
所以综上 只要使用一个第九枪和三个第十枪这样子就有多了20+3*5=35
这样子就把s:11:"Spear_Owner";s:6:"MaoLei";} 给逃逸出来了 就可以正常闭合了
传入:
di_jiu_qiangdi_shi_san_qiangdi_shi_san_qiangdi_shi_san_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}
替换后 s:95:"Night_Parade_of_a_Hundred_GhostsUnrepentant_LethalityUnrepentant_LethalityUnrepentant_Lethality";s:11:"Spear_Owner";s:6:"MaoLei";}";s:11:"Spear_Owner";s:6:"Nobody";}
di_jiu_qiangdi_shi_san_qiangdi_shi_san_qiangdi_shi_san_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}
简单来讲就是假设原本字符接收的长度为X X的组成是
前面那部分(di_jiu_qiangdi_shi_san_qiangdi_shi_san_qiangdi_shi_san_qiang)
+
后面需要构造闭合的(";s:11:"Spear_Owner";s:6:"MaoLei";})字符长度为35
然后他的字符替换 前面那部分的长度 就会多出35(后面那部分的字符长度)
这样就把后面那部分给闭合了