
Joomla 6.1.3 - उच्च - रिमोट - ACL - POST /api/v1/content/articles प्रति-श्रेणी ACL की अनदेखी करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-articles-catid
राइट-अप: https://abraxaslabs.tech/research/joomla-articles-catid
वर्ग: विशेषाधिकार अवशेष पहुँच: रिमोट
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
व्यवस्थापक ArticleController::allowAdd com_content.category.{catid} की जाँच करता है। api/components/com_content/src/Controller/ArticlesController.php में कोई allowAdd नहीं है। इसके बाद ApiController::add() बिना किसी डेटा के allowAdd() को कॉल करता है, इसलिए JSON catid कभी जाँच में प्रवेश नहीं करता। आधार allowAdd तब सत्य होता है जब उपयोगकर्ता किसी भी श्रेणी में बना सकता है।
एक Manager-वर्ग का API उपयोगकर्ता, जिसे core.login.api और एक श्रेणी पर बनाने की अनुमति दी गई है, एक ऐसी श्रेणी में लेख POST कर सकता है जिसमें उन्हें UI में मना किया गया है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष / प्राधिकरण बायपास |
| पहुँच | रिमोट (core.login.api के साथ API टोकन) |
| CWE | CWE-863 |
| CVSS | मध्यम: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| उत्पाद | Joomla CMS |
| प्रभावित | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2), POST /api/index.php/v1/content/articles |
| प्रमाणीकरण | Manager (समूह 6) के लिए API टोकन, जिसमें core.login.api, com_content core.manage, और केवल एक श्रेणी पर core.create हो। कोई Super User नहीं। डिफ़ॉल्ट core.login.api केवल Super User के लिए है। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
एक गैर-Super-User API टोकन का उपयोग करें जो एक श्रेणी में बना सकता है, उन श्रेणियों में प्रकाशित करने के लिए जिनसे उन्हें प्रतिबंधित किया गया है। इस अवशेष से वे Super User नहीं बनते। यह अनधिकृत प्रकाशन है, साइट पर कब्ज़ा नहीं और छिपे हुए लेखों का पठन नहीं।
| विशेषाधिकार | विधि / पथ | प्रकार | प्रयोगशाला-प्रमाणित या अनुमानित |
|---|---|---|---|
| उस श्रेणी में एक लेख बनाएं जिसमें उन्हें मना किया गया है | POST /api/index.php/v1/content/articles JSON catid of B | integrity | प्रयोगशाला-प्रमाणित। HTTP 200, #__content id=1, catid=9 (Press), शीर्षक poc-art-JOOMLA-ARTICLES-CATID-WITNESS |
| केवल अनुमत Drafts होने पर भी Official notices / Press में प्रकाशित प्रति रखें | वही POST, state=1 | integrity | प्रयोगशाला-प्रमाणित, मना की गई Press में निर्माण। किसी भी अन्य श्रेणी परिसंपत्ति के लिए अनुमानित जिसमें core.create मना है |
| API के माध्यम से किसी मौजूदा लेख को संपादित करें | PATCH /api/index.php/v1/content/articles/{id} | n/a | इस Manager के लिए बंद अनुमानित। आधार allowEdit को घटक core.edit चाहिए; प्रयोगशाला com_content नियम Author (4) को core.edit देते हैं, Manager (6) को नहीं। प्रयोगशाला ने PATCH नहीं किया |
| API के माध्यम से किसी लेख को हटाएं | DELETE /api/index.php/v1/content/articles/{id} | n/a | बंद अनुमानित। आधार allowDelete को घटक core.delete चाहिए। प्रयोगशाला ने DELETE नहीं किया |
| administrator से अनुमत श्रेणी A में एक लेख सहेजें | POST ... task=article.save jform[catid]=A | intended | प्रयोगशाला-प्रमाणित इच्छानुसार खुला। HTTP 200, मना नहीं किया गया |
| administrator से मना की गई श्रेणी B में एक लेख सहेजें | वही task, jform[catid]=B | n/a | प्रयोगशाला-प्रमाणित बंद। HTTP 200 "not permitted" / create-not-permitted के साथ (UI allowAdd on com_content.category.B) |
स्टॉक Manager (बिना core.login.api) के साथ API हिट करें | Bearer token / X-Joomla-Token | n/a | बंद अनुमानित। डिफ़ॉल्ट core.login.api केवल Super User (समूह 8) है। यह प्रयोगशाला इसे पहले समूह 6 को देती है |
| contacts / banners / newsfeeds पर वही अंतराल | POST /api/index.php/v1/contacts (और सहोदर) विदेशी catid के साथ | integrity | अनुमानित। उन API controllers में भी allowAdd का अभाव है। प्रयोगशाला ने उन्हें नहीं चलाया |
| Super User / installer RCE | n/a | n/a | बंद। Manager Manager ही रहता है |
मैंने 2026-07/08 JSST लहर के बाद 6.1.3 को पिन किया। Groups API को पहले से ही core.admin चाहिए। Media webservice को override पर पहले से ही core.edit चाहिए। Articles API अभी भी ApiController के माध्यम से गिरता है और हर catid के लिए "किसी भी श्रेणी में बनाएं" को पर्याप्त मानता है।
public function add()
{
if (!$this->allowAdd()) {
throw new NotAllowed('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED', 403);
}
$recordId = $this->save();
$this->displayItem($recordId);
}
आधार जाँच:
protected function allowAdd($data = [])
{
$user = $this->app->getIdentity();
if (!$user->authorise('core.manage', $this->option)) {
return false;
}
return $user->authorise('core.create', $this->option)
|| \count($user->getAuthorisedCategories($this->option, 'core.create'));
}
Administrator UI पहले से ही catid पर आधारित है:
protected function allowAdd($data = [])
{
$categoryId = ArrayHelper::getValue(
$data,
'catid',
$this->input->getInt('filter_category_id'),
'int'
);
if ($categoryId) {
return $this->app->getIdentity()->authorise(
'core.create',
'com_content.category.' . $categoryId
);
}
return parent::allowAdd();
}
गलत मोड़ जो पहले ही दर्ज हो चुके हैं: UI HTTP 200 को allow के रूप में पढ़ना (B का denial "not permitted" body है); component core.create को छेद मानना (lab Manager में यह नहीं है; base getAuthorisedCategories count के लिए एक category allow ही काफ़ी है); एक stock Manager जिसमें core.login.api नहीं है। Theatre: एक reverse shell। Oracle है API 200 into Press plus UI allow on Drafts plus UI deny on Press।
वही pin leftovers: levels API, menu items API, media override।
python3 joomla-articles-catid-Abraxas-Labs.py
or
cd lab
./run.sh
केवल http://127.0.0.1:19550 को लक्षित करें। इमेज joomla:6.1.3-php8.3-apache के साथ mariadb:11.4।
SUCCESS joomla-articles-catid api-http=200 article-id=1 catid=9 cat-a=8 cat-b=9 ui-a=200 ui-b=200 JOOMLA-ARTICLES-CATID-WITNESS
article-id अगला #__content autoincrement है (स्वच्छ 6.1.3 इंस्टॉल पर 1)। ui-a / ui-b HTTP 200 हैं; B का denial UI "not permitted" body है, 403 स्थिति नहीं।
api/components/com_content/src/Controller/ArticlesController.php पर allowAdd (और allowEdit) को उसी तरह override करें जैसे administrator ArticleController में है: com_content.category.{catid} पर core.create जाँचें। request JSON को ApiController::add() में पास करें ताकि catid वास्तव में उस जाँच तक पहुँचे। यदि contacts, banners और newsfeeds के controllers डिफ़ॉल्ट allowAdd पर ही रहते हैं तो उन पर भी वही पैटर्न लागू करें।