刷题记录:[护网杯 2018]easy_laravel
参考链接:Laravel 相关几道题目复现
sql注入
username的sql注入,一眼就能看出来,但是admin的密码是加密过的,没法直接得到密码
public function index(Note $note)
{
$username = Auth::user()->name;
$notes = DB::select("SELECT * FROM `notes` WHERE `author`='{$username}'");
return view('note', compact('notes'));
}
重置密码
laravel内置重置密码在Illuminate\Auth\Passwords
中实现,重置密码需要填写邮箱,并向邮箱发送一个重置链接。
laravel在5.4以后都是将token加密存储的,而之前是明文存储,所以我们就可以注入出token重置admin密码
先访问/password/reset
重置admin密码,然后注出token,访问/password/reset/[token]
,完成重置
composer
接下来要寻找pop链,我们先用命令composer install
将依赖装好
blade
Blade 是 laravel 提供的一个简单强大的模板引擎。它不像其他流行的 PHP 模板引擎那样限制你在视图中使用原生的 PHP 代码,事实上它就是把 Blade 视图编译成原生的 PHP 代码并缓存起来。缓存会在 Blade 视图改变时而改变,这意味着 Blade 并没有给你的应用添加编译的负担。Blade 视图文件使用
.blade.php
后缀,一般情况下都被存储在resources/views
目录。
访问flag页面显示no flag,猜测出题者的意图是要我们删掉缓存文件,更新flag
缓存文件路径
在Illuminate\View\Compilers\Compiler
中
public function getCompiledPath($path)
{
return $this->cachePath.'/'.sha1($path).'.php';
}
其中cachePath
就是web根目录,$path
就是blade文件的位置,所以如果中间件为Apache,那么缓存文件路径就是
/var/www/html/storage/framework/views/73eb5933be1eb2293500f4a74b45284fd453f0bb.php
# sha1("/var/www/html/resources/views/auth/flag.blade.php")
pop链
删除缓存文件
全局搜索unlink
,可以发现
class Swift_ByteStream_TemporaryFileByteStream extends Swift_ByteStream_FileByteStream
{
...
public function __destruct()
{
if (file_exists($this->getPath())) {
@unlink($this->getPath());
}
}
}
正好有upload,还有check页面可以构造任意路径file_exists
,构造phar文件即可触发反序列化
getshell
-
Illuminate\Broadcasting
PendingBroadcast类的__destruct
public function __destruct() { $this->events->fire($this->event); }
-
Faker
中找到Generator类的__call
(但是我并没有找到,应该是版本的问题) -
它会调用format函数,其中format会调用call_user_func_array,且第一个参数,由下面的getFormatter返回,简单审计发现两个参数都可控。这样POP链就构造好了
附上大佬的Laravel总结Laravel 5.8 RCE POP链汇总分析