Persistent Cross-Site Scripting in default Laravel installation

Disclosed: 2018-08-10 15:57:55 By x1m To laravel
High
Vulnerability Details
# Persistent XSS in default Laravel Installation I have been using the [Laravel](https://laravel.com/) framework for quite a while now and discovered something odd. When following the installation instructions for the latest Laravel version **(5.6.8 at the time of writing)** you will be up and running in a matter of minutes. Even better: With a single command such as `php artisan make:auth` from the CLI, Laravel will scaffold basic login and registration views and routes. This is a very convenient function and saves developers a lot of time. But what if there is some resource included that might be vulnerable? # POC Vulnerability: Persistent Cross-site Scripting. ## Installation Following the instruction from the [Laravel Docs](https://laravel.com/docs/5.6) we can quickly create a new project with basic authentication. You can use the Laravel installer: `laravel new project` (where project is the directory that is going to be used for your new project.) This requires you to global require the laravel installer first: `composer global require "laravel/installer"` The other option is the "old" way with Composer: `composer create-project --prefer-dist laravel/laravel project` After running one of the above commands your project will be created and you can start developing a new application. Pretty neat. I am using the the `Vagrant/Homestead` [box](https://laravel.com/docs/5.6/homestead) for local development. If you haven't tried it and you are developing PHP applications I recommend checking this out! {F331053} ## User registration and authentication We now have a fresh Laravel project. Let's start with building the user registration and authentication functionality: `php artisan make:auth` This will create a view, some controllers and database migrations. When this is done all you have to do is `php artisan migrate` and you are ready to go. {F331052} ## The vulnerability So, the setup is ready. Time to show the proof of concept Since we used the `php artisan make:auth` command we now have a login and registration function. {F331055} Let's create a user: {F331054} The vulnerability lies within the username field: using `{{ alert(document.domain) }}` , Laravel transforms this to `<script>alert(document.domain)</script>` due to Vue.js frontend. This is the default frontend framework that Laravel uses. After checking the `app.js` file in /project/resources/assets/js/ we can see that Laravel indeed uses Vue.js as default frontend framework: ``` javascript /** * First we will load all of this project's JavaScript dependencies which * includes Vue and other libraries. It is a great starting point when * building robust, powerful web applications using Vue and Laravel. */ require('./bootstrap'); window.Vue = require('vue'); /** * Next, we will create a fresh Vue application instance and attach it to * the page. Then, you may begin adding components to this application * or customize the JavaScript scaffolding to fit your unique needs. */ Vue.component('example-component', require('./components/ExampleComponent.vue')); const app = new Vue({ el: '#app' }); ``` This is where the vulnerability hides, as Vue sees curly brackets and turns it into `<script>` tags. Also, the `v-pre` tags were not present in the default front end code, combined with the curly brackets this led to the persistent cross-site scripting vulnerability. After authenticating with a registered user that has the payload set as name: {F331056} I disclosed this issue to the creator of Laravel through email, later on via Twitter and a blogpost . The issue was fixed with the release of patch **(5.6.9)** within 15 minutes. Thanks for reading, more posts @ https://x1m.nl [x1m](https://twitter.com/x1m_martijn)
Actions
View on HackerOne
Report Stats
  • Report ID: 392797
  • State: Closed
  • Substate: resolved
  • Upvotes: 58
Share this report