• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
بررسی امکان حمله های DOS با ارسال دیتای حجیم در Request ها
#1
چند وقت پیش یه اشاره ای در این مورد بین من و وحید رد و بدل شد.
یخورده روش کار کردم.
اونطور که من تست کردم ظاهرا داده های حتی در حد چند مگابایت هم فشار زیادی وارد نمیکنن. حتی مثلا موقعی که یک دیتای خیلی حجیم بعنوان پسورد هش میشه (اونم با Key stretching).

من این برنامهء پایتون رو برای تست حمله به پروژهء خودم نوشتم:

کد:
import http.client, urllib.parse, time, random, os

size=7000000

bigData=''
t1=time.clock()
bigData = ''.join(map(chr, [i() for i in [lambda: random.randint(65, 90) for i in range(26)]]*(size//26)))
t2=time.clock()
print('generating random bytes took: {0:.2f} secs'.format(t2-t1))

t1=time.clock()
params = urllib.parse.urlencode({'username': 'Admin', 'password': bigData, 'form_id': 'x'})
t2=time.clock()
print('url encoding took: {0:.2f} secs'.format(t2-t1))

print('POST size: ', len(params))

headers = {"Content-type": "application/x-www-form-urlencoded"}
conn = http.client.HTTPConnection("localhost:80")

t1=time.clock()
conn.request("POST", "/reg8log/index.php", params, headers)
t2=time.clock()
print('sending request took: {0:.2f} secs'.format(t2-t1))

t1=time.clock()
response = conn.getresponse()
t2=time.clock()
print('receiving response took: {0:.2f} secs'.format(t2-t1))

print('\n', response.status, response.reason)

data = response.read()
conn.close()

print("\n-------------------------------\n")
print(data[:1000])

f=open('response.html', mode='wb')
f.write(data)
f.close()
os.startfile('response.html')

print('\npress any key to quit...', end='')
input()

یه برنامهء ساده و آزمایشیه فقط. با پایتون 3.

یه نمونه از خروجی این برنامه:
کد:
generating random bytes took: 2.84 secs
url encoding took: 4.59 secs
POST size:  7000014
sending request took: 0.16 secs
receiving response took: 1.61 secs

200 OK

-------------------------------

b'\r\n<html>\r\n\r\n<head>\r\n<meta http-equiv="Content-type" content="text/html
;charset=UTF-8" />\r\n<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">\r\n<M
ETA HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">\r\n<META HTTP-EQUIV="EXPIRES" CONTEN
T="0">\r\n      <title>Login</title>\r\n      <meta http-equiv="generator" conte
nt="Kate" />\r\n      <style>\r\n\r\nbutton {\r\nmargin-left: 1; margin-right: 1
\r\n}\r\n\r\n</style>\r\n<script src="js/common.js"></script>\r\n<script src="js
/sha256.js"></script>\r\n<script language="javascript">\r\n\r\nfunction clear_fo
rm() {\r\ndocument.login_form.username.value=\'\';\r\ndocument.login_form.passwo
rd.value=\'\';\r\ndocument.login_form.remember.checked=false;\r\nclear_cap(true)
;\r\nreturn false;\r\n}\r\n\r\n\nsite_salt=\'Mpv1VD5EUUznJNAbMG1bkE\';\n\r\nfunc
tion hash_password() {\r\ndocument.login_form.password.value=\'hashed-\'+site_sa
lt+\'-\'+hex_sha256(site_salt+document.login_form.password.value);\r\n}\r\n\r\nf
unction validate()\r\n{\r\nmsgs=new Array();\r\ni=0;\r\nif(!document.login_form.
username.value) msgs[i++]=\'Username field is empty'

press any key to quit...

همونطور که میبینید، حدود 7 مگ دیتا رو ارسال کردیم (یک پسورد 7 مگابایتی)، و جوابش 1.5 ثانیه بعد دریافت شده. بنظرم سرعت خوبیه! تازه شاید بخش قابل توجهی از این زمان توسط خود پایتون برای دریافت پاسخ صرف شده (حالا در آینده اگر فرصت شد و علاقمند بودیم میشه تستهای بیشتری کرد و حالتهای بیشتر رو بررسی کرد).

نسبت زمان پاسخ به زمان صرف شده برای ارسال درخواست 10 هست.

حالا با یک دیتای غیرحجیم هم تست میکنیم:
کد:
generating random bytes took: 0.00 secs
url encoding took: 0.00 secs
POST size:  86
sending request took: 0.05 secs
receiving response took: 0.76 secs

نسبت زمان پاسخ به زمان صرف شده برای ارسال درخواست: 15
جالبه که در این حالت نسبت زمان پاسخ به درخواست بیشتره!
و درحالیکه حجم دیتای ارسال شده حدود 80 هزار برابر اختلاف داشته، اما سرعت پاسخ فقط 2 برابر اختلاف داره.

خلاصه بنظر میاد که ارسال داده های حجیم برای حمله های DOS چندان ایدهء خوبی نباشه، مگر اینکه ضعف خاصی در سرور/برنامه شناسایی شده باشه که نسبت به این امر آسیب پذیر باشه.
چه بسا اینکه هکر داده های حجیم ارسال کنه بیشتر به ضرر خودش باشه تا سرور مورد حمله.
ببینید هر درخواستی که ارسال میشه یکسری فرایندهای قابل توجهی رو در سمت سرور موجب میشه، و Overhead خودش رو داره. اگر ما در زمان x تعداد 1000 درخواست ارسال کنیم 1000 تا Overhead داریم. ولی اگر بخوایم دیتای حجیمی ارسال کنیم طبیعتا دیگه نمیتونیم 1000 درخواست رو در زمان x ارسال کنیم و بنابراین تعداد درخواست و Overhead کمتری رو به سرور تحمیل میکنیم.
حالا باید دید برای سرور هندل کردن دیتای حجیم بیشتر هزینه داره یا هندل کردن درخواستهای با تعداد زیاد.

البته این تست و تحلیل هنوز خیلی ناقص و نامطمئن هست. اگر علاقمند بودید میتونید نظر بدید و تست و تحقیق بیشتری داشته باشیم.

راستی من ارسال دیتای حجیم رو در فیلد username هم تست کردم که نتیجش ایجاد این خطای دیتابیس در برنامهء PHP بود:

کد:
MySQL server has gone away

ظاهرا چون کوئری خیلی حجیم شده، MySQL اتصال رو قطع کرده.
ولی این ظاهرا فقط برای همون درخواست رخ میده، و بقیهء درخواستها و سرور با مشکلی مواجه نمیشن.
  پاسخ
تشکر شده توسط : admin mehrzad3019 Bojbaj
#2
کد php هم میزاشتی خوب بود.. بعد دیتایی که یادمه برای من ارسال می شد ۲۰۰ و خورده ای مگ بود. البته سرور هم سرور قدتمندی نبود.
خطایی هم که داده بله به همین خاطر بوده. اتفاقی هم برای بقیه کانکشن ها نمی افته.
  پاسخ
تشکر شده توسط :
#3
روی همون پروژهء رجیستر و لاگین خودم تست کردم.
البته یک بخش امنیتی داشت (سیستم ضد XSRF) که موقتا بخاطر اینکه بتونم این برنامه رو تست کنم غیرفعالش کردم.
نقل قول:بعد دیتایی که یادمه برای من ارسال می شد ۲۰۰ و خورده ای مگ بود.
این مقدار که اصلا وارد اجرای برنامه هم نمیشه و از همون ابتدا PHP جلوش رو میگیره.
تازه شاید خود وب سرور هم تنظیماتی داشته باشه که قبل از PHP جلوی اون درخواست رو سد کنه.
احتمالا هکرش اسگول بوده که این کار رو کرده Big Grin
شایدم هدف یه برنامه و سرور دیگه ای بوده که این حجم دیتا روش اثری داشته (یا حداقل هکر اینطور فکر کرده).
چون خودت گفتی حمله هایی که به این سایت میشه ممکنه بخاطر تارگت های دیگری باشه که در جوار شما هستن.
ببین یه جوجه هکر و آدم کم سواد خیلی راحت میتونه فکر کنه که چون داره 200 مگ دیتا ارسال میکنه پس ممکنه سرور رو بترکونه.
امروزه روز هم که نرم افزار و کد و روشهای آماده در دسترس عمومه.
  پاسخ
تشکر شده توسط :
#4
جلوش گرفتن رو که بستگی به تنظیمات داره. چون سرور برای آپلودهای حجیم بود بسته های ارسالی رو زیاد در نظر می گرفتیم.
ولی به هر حال به هدفش رسیده بود دیگه. البته خیلی از حملات DDOS بیشتر توسط جوجه هکر ها اتفاق می افته. چون راحتترین راه حمله هست. فقط منابع نیاز داره. اسکریپتش هم که پره. اون موقع تابع md5 نمی دونم چرا اینقدر زمان می گرفته برای md5 کردنش
  پاسخ
تشکر شده توسط :
#5
این بخش از کد:
کد:
''.join(map(chr, [i() for i in [lambda: random.randint(65, 90) for i in range(26)]]*(size//26)))
کار کاربر pyrater هست از pylearn.com.
تاپیک مربوطه: http://www.pylearn.com/fa/forum//index.php?topic=1673.0

گفتم حقشه بهش Credit بدم.
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان