Lucene search
K

Laravel 2.1 Hash::make() bcrypt Truncation

🗓️ 16 Sep 2014 00:00:00Reported by Pichaya MorimotoType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 29 Views

Laravel 2.1 Hash::make() function causes bcrypt password truncation leading to pseudo hash collisio

Code
`######################################################################  
# _ ___ _ _ ____ ____ _ _____  
# | | / _ \| \ | |/ ___|/ ___| / \|_ _|  
# | | | | | | \| | | _| | / _ \ | |  
# | |__| |_| | |\ | |_| | |___ / ___ \| |  
# |_____\___/|_| \_|\____|\____/_/ \_\_|  
#  
# Laravel 2.1 Hash::make() bcrypt truncation  
# Website : http://laravel.com/  
# Author : @u0x (Pichaya Morimoto)  
# Release dates : September 16, 2014  
#  
# Special Thanks to 2600 Thailand group  
# https://www.facebook.com/groups/2600Thailand/ , http://2600.in.th/  
#  
########################################################################  
  
[+] Laravel  
============================================================  
Laravel is a free, open source PHP web application framework, designed for  
the development of model–view–controller (MVC) web applications. According  
to a December 2013 developers survey on PHP frameworks popularity, Laravel  
is listed as the most popular PHP framework in 2013. At the same time, as  
of August 2014 Laravel is the most popular and watched PHP project on  
GitHub.  
https://en.wikipedia.org/wiki/Laravel  
  
[+] Description  
============================================================  
By using Laravel Security mechanism,  
http://laravel.com/docs/security#storing-passwords  
The passwords will be hashed using Laravel's Hash::make() function.  
This function internally call PHP 's password_hash() without checking the  
length.  
  
Why do we need to check length? as PHP manual said,  
"Using the PASSWORD_BCRYPT for the algo parameter,  
will result in the password parameter being truncated  
to a maximum length of 72 characters."  
http://php.net/manual/en/function.password-hash.php  
  
The problem occurs if users enter password longer than 72 characters  
then the password will be truncated to be 72 characters.  
  
This will result in pseudo hash collision.  
  
[+] Proof-of-Concept  
============================================================  
// user input password  
$input = str_repeat('A',72);  
// plaintext password  
$pass1 =  
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.'mysupersecretpassword';  
$pass2 =  
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.'longcatishere';  
// hashed password  
$hash1 = Hash::make($pass1);  
$hash2 = Hash::make($pass2);  
// match?  
$status1 = Hash::check($input, $hash1)?'Yes':'No';  
$status2 = Hash::check($input, $hash2)?'Yes':'No';  
  
User 1  
Desc. Value  
$input  
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  
$pass1  
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmysupersecretpassword  
Hash::make($pass1)  
$2y$10$9oMcpTwHgTzR5ZUMqlnMMOx/P18QZ5e9054lq.pwxw1O9urX3JHHu  
Hash::check($input, $hash1) Yes  
  
User 2  
Desc. Value  
$input  
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  
$pass2  
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlongcatishere  
Hash::make($pass2)  
$2y$10$W7wwB4nLmFjrenJGmx1uauqhjzikZNZA0qzxH8wkbiSmVatCYrAUm  
Hash::check($input, $hash2) Yes  
  
[+] Vulnerable Code  
============================================================  
/vendor/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php  
  
...  
public function make($value, array $options = array())  
{  
...  
$hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));  
...  
return $hash;  
  
[+] How to fix this?  
============================================================  
In Django project, they solved this problem by applying SHA256 before using  
bcrypt  
"BCryptSHA256PasswordHasher fixes this by first hashing the password using  
sha256.  
This prevents the password truncation"  
https://docs.djangoproject.com/en/dev/topics/auth/passwords/#using-bcrypt-with-django  
  
  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation