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
moodle-grades-feedback-idor — Moodle 5.2.3 - High - Remote - IDOR - core_grades_get_feedback skips separate-groups checks | Kitploit
Tools/GitHubGitHub/abraxas/moodle-grades-feedback-idor
Vulnerability AnalysisExploitationWeb Application ExploitationInformation GatheringSecurity VirtualizationWeb SecurityPenetration TestingLabs & Practice
GitHubabraxas/moodle-grades-feedback-idor

moodle-grades-feedback-idor

Moodle 5.2.3 - High - Remote - IDOR - core_grades_get_feedback skips separate-groups checks

View Repository
34 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 - moodle-grades-feedback-idor

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  moodle-grades-feedback-idor

moodle-grades-feedback-idor

Moodle LMS 5.2.3 - Moodle

Class: IDOR Reach: Remote

core_grades_get_feedback still only calls require_capability('gradereport/grader:view'). Other grade web services gained groups_user_groups_visible / groups_group_visible after MSA-26-0016 / MDL-88667. This AJAX service did not. The JSON comes back with feedbacktext, fullname, picture, and the first identity field.

A non-editing teacher in Separate groups, without accessallgroups, POSTs another student's userid and reads that group's feedback.

IDno CVE yet
CWECWE-863 / CWE-200
CVSSMedium: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
ProductMoodle
Affected5.2.3 tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116)
Authnon-editing teacher with gradereport/grader:view, without moodle/site:accessallgroups. Course in Separate groups.
LicenseGNU Affero GPL v3.0
Lab127.0.0.1 only

What an attacker can do

Writer: a non-editing teacher enrolled in a Separate-groups course, in Group A only, with grader view and without access-all-groups. They pick another enrolled student's userid (sequential ints) and call the AJAX service. Not RCE. Not LPE. Not a score write.

PrivilegeMethod / sinkRecon / integrity / availabilityLab-proven or inferred
Read another group's grade feedbackPOST /lib/ajax/service.php?sesskey= core_grades_get_feedback {courseid, userid, itemid}ReconLab-proven. HTTP 200, error=false, feedbacktext contains MOODLE-GRADES-FEEDBACK-IDOR-WITNESS
Read that student's identity field and display nameSame response additionalfield / fullname / pictureReconLab-proven. [email protected], fullname=Student Bravo
Walk sequential userid values in the same courseSame method, guessed idsReconInferred. Lab used the seeded Group B id
List Group B through the sibling selectorcore_grades_get_gradable_users {courseid, groupid=B}n/aLab-proven closed. cannotaccessgroup
Student calls the same feedback servicestudent role, same argsn/aLab-proven closed. nopermissions
Same-group feedback (Group A student)teacher call for Student AlphaRecon (intended)Lab-proven allowed. HTTP 200, error=false
PHP RCE / OS LPE / grade writen/an/aClosed. This leftover is a read of feedback and profile fields

Default Moodle without Separate groups, or a teacher who already has moodle/site:accessallgroups, is not this leftover. Editing teachers with that cap already see every group.

Same pin leftovers: Blackboard img file read, enrol_database SQLi, hidden grade items.

How I found it

I pinned moodle/moodle v5.2.3 after MSA-26-0042/0043. MSA-26-0016 closed group checks on other grade web services. get_feedback.php was not in that set. The grader UI was hardened. This AJAX service was not.

Wrong turns already recorded: treating the sibling get_gradable_users miss as the whole story (that one already throws cannotaccessgroup); calling this a score write because the payload names itemid (the service is a read); student-as-attacker (nopermissions). A reverse shell. Theatre.

Lab

Live Moodle v5.2.3 on php:8.3-cli + MariaDB 11.4. Seed builds a Separate-groups course, teacher in Group A only, student B in Group B only, CAP_PREVENT on moodle/site:accessallgroups, and a manual grade item whose feedback is the witness. how=live.

Compose bind-mounts ../../vendors/moodle/src as /opt/moodle-pin (path is relative to lab/docker-compose.yml). Clone moodle/moodle tag v5.2.3 to that path, or point the volume at your checkout. The Moodle tree is not in this pack.

python3 moodle-grades-feedback-idor-Abraxas-Labs.py

or

cd lab
./run.sh

Target only http://127.0.0.1:19580. Compose project moodle-grades-feedback-idor. Stack tears down after the run.

SUCCESS moodle-grades-feedback-idor how=live pin=v5.2.3 teacher-role=teacher accessallgroups=no groupmode=1 feedback-has-witness=yes [email protected] sibling-group-b=cannotaccessgroup student-call=nopermissions MOODLE-GRADES-FEEDBACK-IDOR-WITNESS

The fix

After validate_context / require_capability, load the course and the target user, then refuse unless groups_user_groups_visible($course, $userid) and the target is enrolled. Same shape as gradereport_user and core_grades_get_gradable_users after MDL-88667.

References

  • github.com/moodle/moodle tag v5.2.3
  • get_feedback.php
  • Sibling already denies the other group: get_gradable_users.php
  • Nearby patched (not this service): MSA-26-0016 / MDL-88667
  • Same pin: moodle-blackboard-img · moodle-enrol-database-sqli · moodle-grades-gradeitems
  • CWE-863

License

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

Download Tool