Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
joomla-media-override — Joomla 6.1.3 - High - Remote - Overwrite - media manager overwrite leftover | Kitploit
Tools/GitHubGitHub/abraxas/joomla-media-override
Privilege EscalationVulnerability AnalysisExploitationWeb Application ExploitationSecurity VirtualizationWeb SecurityPenetration TestingLabs & Practice
GitHubabraxas/joomla-media-override

joomla-media-override

Joomla 6.1.3 - High - Remote - Overwrite - media manager overwrite leftover

View Repository
4 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

Abraxas Labs - joomla-media-override

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  joomla-media-override

joomla-media-override

Class: Privilege leftover Reach: Remote

Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters

CVE-2026-48947 taught the webservice media API to require core.edit when override is set. The site JSON API still does not. Default Author has core.create on com_media and no core.edit. The site dispatcher treats core.create as enough and loads the administrator ApiController. postFiles() then passes override straight into createFile().

A stock Author can replace a file that is already on disk. Visitors keep hitting the same public URL and get the new bytes.

IDno CVE yet
ClassPrivilege leftover / integrity
ReachRemote (default Author, no API token)
CWECWE-863, CWE-639
CVSSMedium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N
ProductJoomla CMS
Affected6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2), site com_media JSON API
AuthDefault Author (group 3). No API token.
LicenseGNU Affero GPL v3.0
Lab127.0.0.1 only

What an attacker can do

Log in as a stock Author and replace a file that is already on the site. This is defacement / bait-and-switch of stored media, not a site takeover. The extension denylist is unchanged, so this is not a .php upload.

PrivilegeMethod / pathKindLab-proven or inferred
Overwrite an existing media file (logo, article image)Site POST /index.php?option=com_media&task=api.files&format=json&path=local-images:/ with JSON override: trueintegrityLab-proven. HTTP 200, disk SHA changed, public GET /images/joomla_black.png served the new PNG that carries JOOMLA-MEDIA-OVERRIDE-WITNESS
Deface whatever still points at that URLSame public path, no cache-bustintegrityLab-proven the public bytes flipped. Inferred for other adapters under images/
Create a new allowed fileSame POST without overrideintendedAuthor has core.create on com_media
Edit via PUTPUT same task, path includes the filenamen/aLab-proven closed. HTTP 403. putFiles() already requires core.edit
Create when the name exists, no overridePOST override: false (default)n/aLab-proven closed. HTTP 409, original SHA unchanged until the override POST
Upload .php or other denied typescreateFile / isMediaFile denylistn/aInferred closed. This lab only sends a PNG
Call the webservice media API with override/api/index.php/v1/media/filesn/aInferred closed. MediaController::allowAdd checks core.edit when override is set (CVE-2026-48947)
Super User / RCEn/an/aClosed. Author stays Author

How I found it

I pinned 6.1.3 after the 2026-07/08 JSST wave. Groups API already requires core.admin. Webservice media already requires core.edit on override. The internal controller still does not.

Default Author has core.create on com_media and nothing in core.edit:

{"core.admin":{"7":1},"core.manage":{"6":1},"core.create":{"3":1},"core.delete":{"5":1}}

Site Dispatcher lets core.create through and loads the administrator ApiController. postFiles() then:

if (!$this->app->getIdentity()->authorise('core.create', 'com_media')) {
    throw new \Exception(Text::_('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED'), 403);
}
$override     = $content->get('override', false);
if ($mediaContent) {
    $name = $this->getModel()->createFile($adapter, $name, $path, $mediaContent, $override);

Fixed webservice (api/.../MediaController.php):

if ($this->input->json->get('override', false)) {
    return $user->authorise('core.edit', 'com_media');
}

Wrong turns already recorded: treating PUT as the leftover (PUT is already 403); treating the webservice path as still open (CVE-2026-48947 closed it); reading 409 without override as a miss (that is the intended create-if-absent path). Theatre: a reverse shell. The oracle is POST override 200 plus PUT 403 plus public GET of the witness PNG.

Same pin leftovers: levels API, menu items API, articles catid.

Lab

python3 joomla-media-override-Abraxas-Labs.py

or

cd lab
./run.sh

Target only http://127.0.0.1:19540. Image joomla:6.1.3-php8.3-apache plus mariadb:11.4.

SUCCESS joomla-media-override post-http=200 override=yes bytes-changed=yes put-http=403 no-edit=yes conflict-http=409 JOOMLA-MEDIA-OVERRIDE-WITNESS

The fix

Same override -> core.edit check as MediaController::allowAdd inside ApiController::postFiles() before createFile(). Keep PUT on core.edit.

References

  • github.com/joomla/joomla-cms tag 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2)
  • ApiController.php postFiles
  • Nearby patched (not this controller): CVE-2026-48947
  • Same tag: joomla-levels-api · joomla-menu-items-api · joomla-articles-catid
  • CWE-863 · CWE-639

License

GNU Affero GPL v3.0. See LICENSE. Loopback lab only. No warranty.

Download Tool