
رمز الـPoC لثغرة أمنية في webmod v0.48. كُتب أصلاً في 2007، وتم تعيين CVE-2007-1260 له.
بواسطة cybermind (Kevin Masterson)
[email protected]
موقع WebMod (مؤرشف): https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
الإصدارات القابلة للاختراق:
0.48، لكل من Win32 و Linux. قد تكون الإصدارات السابقة قابلة للاختراق. يجب أن يعمل هذا مع أي إصدار من HLDS.
نوع الثغرة:
DoS، تنفيذ تعليمات برمجية عن بعد تحت المستخدم الذي يعمل عليه HLDS.
الوصف: عند استلام طلب HTTP POST، يقوم بتخصيص 11 بايت على المكدس لتخزين قيمة Content-Length، لكنه يكتب في هذا المخزن المؤقت حتى يتم استلام حرف سطر جديد أو فاصل فارغ. بعد أن يصل سلسلة Content-Length إلى 158308 بايت، يبدأ في الكتابة فوق EIP. قد يكون هذا الرقم مختلفًا قليلاً على لينوكس بسبب المحاذاة. يجب ألا تحتوي شل كود الخاصة بك على 0x00 أو 0x0A أو 0x0D وإلا ستتوقف عن قراءة البيانات من المقبس.
قد يساعد هذا في تنفيذ شل كود الخاصة بك:
رمز الإثبات:
w48crash.c
ملاحظة: "شل كود" المستخدمة في الإثبات مشفرة ثابتة خصيصًا للعمل مع خادم يعمل على Win2K SP4/kernel32.dll/user32.dll الإصدار 5.0.2195.6688. ومع ذلك، فإن تجاوز سعة المخزن المؤقت الفعلي سيعمل كما هو على أي إصدار ويندوز. لاختبار ذلك، يمكنك ضبط المتغير العمومي "our_eip" إلى 0xFFFFFFFF للتسبب في تعطل ببساطة.
السبب/الإصلاح:
الكود المشكل من الأسطر 542-552 في server.cpp:
542 char clbuf[11];
543
544 for(i=0;(size_t)i<strlen(input)-17;i++)
545 {
546 if(!strnicmp(input+i,"\nContent-Length: ",17))
547 {
548 LOG_DBG_SERVER(("Content-length spotted"));
549 i+=17;
550 for(j=0;input[i]!='\n'&&input;[i];i++,j++)
551 clbuf[j]=input[i];
552 clbuf[j]='\0';
المخزن المؤقت، clbuf، المخصص في السطر 542، يتم الكتابة فيه باستخدام الحلقة في السطور 550-551، ثم يتم إنهاؤه بقيمة فارغة. الإصلاح هو استبدال السطر 550 بما يلي:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)