Quantcast
Channel: Planet Python
Viewing all articles
Browse latest Browse all 22462

بايثون العربي: فحص ملفات تطبيقات الويب المفتوحة المصدر

$
0
0

أنظمة إدارة المحتوى ومنصات التدوين مثل جوملا ، وردبرس إلخ… تجعل من إطلاق مدونة أو موقع أمر سهل وممتع وتعتبر هذه الأنطمة شائعة على الإستضافات المشتركة أو حتى على شبكات المؤسسات ، جميع الأنظمة لديها طريقة خاصة بها في ترتيب الملفات ، الإعدادات وعمليات الترقيع وعندما لا يوفق مدراء المواقع في إتباع خطوات التثبيت الصحيحة والأمنة سيكون من السهل للمهاجمين في الوصول إلى سيرفر الويب .

ولأننا نستطيع جميعا تحميل أي تطبيق ويب مفتوح المصدر وفحص بينة ملفاتها ومجلداتها على أجهزتنا المحلية يمكننا إنشاء برنامج يقوم بفحص وتعقب جميع الملفات التي يمكن الوصول إليها على الموقع المستهدف وتمكننا هذه الأداة من إجتثثات بقايا ملفات الخاصة بتثبيت تطبيق الويب المستهدف ، المجلدات والدلائل التي من الممكن أن تكون محمية بواسطة ملف htaccess. وغيرها من الأشياء الجيدة التي يمكن أن تساعد المهاجم في الحصول على موطئ قدم على سيرفر الويب الذي يستضيف موقعك .

بدون إطالة قم بقتح ملف جديد تحت إسم web_app_scanner.py وأكتب الكود التالي :


import Queue
import threading
import os
import urllib2
threads = 10
target = "http://www.website.com"
directory = "/Users/kader/Downloads/wordpress-3.1.1"
filters = [".jpg",".gif","png",".css"]
os.chdir(directory)
web_paths = Queue.Queue()
for r,d,f in os.walk("."):
    for files in f:
        remote_path = "%s/%s" % (r,files)
        if remote_path.startswith("."):
            remote_path = remote_path[1:]
        if os.path.splitext(files)[1] not in filters:
            web_paths.put(remote_path)

def test_remote():
    while not web_paths.empty():
        path = web_paths.get()
        url = "%s%s" % (target, path)
        request = urllib2.Request(url)
        try:
            response = urllib2.urlopen(request)
            content = response.read()
            print "[%d] => %s" % (response.code,path)
            response.close()
        except urllib2.HTTPError as error:
            #print "Failed %s" % error.code
            pass
for i in range(threads):
    print "Spawning thread: %d" % i
    t = threading.Thread(target=test_remote)
    t.start()

نبدأ الأن على بركة الله بشرح الكود السابق :


target = "http://www.website.com"
directory = "/Users/kader/Downloads/wordpress-3.1.1"
filters = [".jpg",".gif","png",".css"]

بداية قمنا بتحديد الهدف وذلك بكتابة عنوانه بالإضافة إلى تعيين المسار المحلي الذي يحتوي على تطبيق الويب الذي قمنا بتحميله وفك الظغط عنه كما  قمنا أيضا بإنشاء قائمة بسيطة تحتوي على صيغ الملفات التي لا نريد أن يشملها الفحص ويمكن لهذه القائمة أن تكون مختلفة على حسب نوع التطبيق المستهدف.


web_paths = Queue.Queue()

المتغير web_paths عبارة عن كائن Queue الخاص بنا والذي سنقوم بتخزين الملفات التي سنحاول تحديد موقعها على السيرفر.


for r,d,f in os.walk("."):
    for files in f:
        remote_path = "%s/%s" % (r,files)
        if remote_path.startswith("."):
            remote_path = remote_path[1:]
        if os.path.splitext(files)[1] not in filters:
            web_paths.put(remote_path)

بعد ذلك سنقوم بإستخدام وظيفة os.walk للتنقل بين جميع الملفات والدلائل الخاصة بالتطبيق على السيرفر وعندما نقوم بهذه العملية نحن نقوم ببناء مسار كامل لملفات الهدف للقيام بفحصها وتصفية جميع الملفات الموجودة في قائمة الصيغ الغير المرغوبة حتى نكون واثقين من فحص إلا الملفات المهمة والتي نريدها وكل ما نجد ملف مطلوب نقوم بإضافته إلى المتغير web_paths.


for i in range(threads):
    print "Spawning thread: %d" % i
    t = threading.Thread(target=test_remote)
    t.start()

لو قمنا بالنظر إلى ذيل الكود سنجد أننا قمنا بإنشاء مجموعة من threads (تماما مثل تلك الموجودة في أعلى الملف) والتي سنقوم كل واحدة من مناداة دالة test_remote وتعمل هذه الأخيرة داخل حلقة حتى تضمن عمل البرنامج إلى غاية عدم إحتواء web_paths Queue على أي شيء.


def test_remote():
    while not web_paths.empty():
    path = web_paths.get()
    url = "%s%s" % (target, path)
    request = urllib2.Request(url)
    try:
        response = urllib2.urlopen(request)
        content = response.read()

ومع كل عملية تكرار للحقلة نقوم بالإستلاء على المسار من Queue ونقوم بإضافته إلى المسار الرئيسي للموقع المستهدف فإذا نجحت العملية نقوم بطبع كود حالة HTTP والمسار الكامل إلى الملف.


print "[%d] => %s" % (response.code,path)
response.close()

أما في حالة عدم وجود الملف أو أنه محمي بواسطة ملف htaccess. هنا ستقوم مكتبة urllib2 بعرض خطأ وسنتعامل معه من خلال السطور التالية


except urllib2.HTTPError as error:
    #print "Failed %s" % error.code
    pass

وبالتالي ستتمكن الحلقة من الإستمرار في تنفيذ عملها .

 

 


Viewing all articles
Browse latest Browse all 22462

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>