تزریق LDAP و راههای جلوگیری از حملات تزریق کد
مفهوم حملات تزریق کد و راه های مقابله با آن
حملات injection یا تزریق کد مانند تزریق SQL، OS و LDAP زمانی اتفاق می افتد که داده های بی اعتبار به عنوان دستور یا کوئری به یک مفسر فرستاده می شود.
داده مخرب مهاجم می تواند مفسر را به اجرای دستورات ناخواسته مجبور کند و یا اینکه به مهاجمین اجازه دهد که به داده هایی بدون انجام احراز هویت دسترسی یابند.
حمله تزریق کد
عامل تهدید :
عامل تهدید و حمله می تواند با توجه به برنامه متفاوت باشد، به عبارتی می توان گفت که هر برنامه خاص یک عامل مخصوص به خود را دارد.
این طور فرض کنید که هرکس می تواند اطلاعات نامعتبر را به سیستم (شامل کاربران بیرونی، کاربران درونی و مدیران) بفرستد.
روش حمله :
روش حمله و تخریب مهاجمین آسان است. مهاجمین اطلاعات متنی ساده ای را می فرستند که Syntax مفسر را به هم می ریزد.
تقریبا می توان گفت که هر ورودی اطلاعات (حتی ورودی های داخلی) می تواند یک مسیر برای حمله باشد.
ضعف امنیتی :
حملات تزریقی وقتی اتفاق می افتد که یک برنامه اطلاعات غیر قابل اعتماد را به یک مفسر می فرستد. این نوع حمله ها بسیار شایع هستند، به خصوص در کدهایی که از یکدیگر ارث می برند.
معمولا این نوع حمله ها در SQL، LDAP، XPath، کوئری های NoSQL، دستورات سیستم عاملی، تجزیه کننده های (Parser) XML، هدرهای SMTP، آرگومان های برنامه و … دیده می شود.
پیدا کردن نقاط ضعف برنامه در برابر حمله تزریقی را در هنگام تست کد به راحتی می توان پیدا کرد اما زمان آزمایش برنامه این کار مشکل می شود.
اسکنرها و fuzzerها به مهاجمین کمک می کنند تا نقاط ضعف برنامه در مقابل injection را پیدا کنند.
آسیب فنی :
تزریق کد می تواند به از دست رفتن یا تخریب اطلاعات، مشکل در پاسخگویی و یا عدم دسترسی منجر شود. گاهی اوقات با استفاده از تزریق کد می توان کنترل کامل هاست را به دست گرفت.
آسیب تجاری :
ارزش تجاری اطلاعاتی که تحت تاثیر قرا گرفته است و پلتفرم اجرا کننده مفسر را در نظر بگیرید. همه اطلاعات می توانست دزدیده، دستکاری و یا حذف شود.
آیا من در برابر تزریق کد آسیب پذیرم؟
بهترین راه برای فهمیدن اینکه یک برنامه در مقابل تزریق کد آسیب پذیر است یا نه، این است که تمام اطلاعات غیر قابل اعتماد را قبل از رسیدن به دستورها و کوئری ها از هم جدا کنیم.
برای فراخوانی های SQL، به این معنی است که در عبارات و stored procedure ها از متغیرهای قیدی استفاده کنیم و از کوئری های دینامیک جلوگیری کنیم.برای اینکه بفهمید کدتان از مفسر بدون خطر استفاده می کند، کدتان را چک کنید.
چک کردن کد یکی از سریع ترین و دقیق ترین روش ها برای این کار است. ابزارهای تحلیل گر کد به متخصصین تحلیل امنیت کمک می کنند تا کاربرد مفسر و جریان داده درون برنامه را بررسی کنند.
تسترهای نفوذی هم هستند که اعمال برنامه را واکاوی می کنند و نقاط ضعف را استخراج می کنند. همچنین می توانید از روش های اسکن دینامیک استفاده کنید.
با این روش می توانید بعضی از نقاط ضعف برنامه تان در برابر تزریق کد را پیدا کنید. اسکنرها همیشه نمی توانند به مفسر دسترسی پیدا کنند و در پیدا کردن حملات موفقیت آمیز، مشکل دارند.
هرچه قدر در برنامه تان مدیریت خطا را قوی تر انجام دهید، پیدا کردن نقاط ضعف در برابر تزریق کد ساده تر می شود.
چگونه از تزریق کد در برنامه ام جلوگیری کنم؟
مهم ترین مسئله در پیشگیری از این نوع حمله ها، جدا کردن داده های غیر قابل اعتماد از دستورها و کوئری ها است.
گزینه مناسب استفاده از یک API امن است. این API باید از استفاده کامل از مفسر جلوگیری کند و یا یک رابط با استفاده از پارامترها ایجاد کند.
هنگام استفاده از APIها هم مراقب باشید، چراکه با اینکه بعضی از آن ها از رابط پارامتری استفاده می کنند، اما همچنان در برابر تزریق کد خطرپذیر هستند.
اگر API پارامترسازی شده نیست، هنگام استفاده از کاراکترهای خاص با استفاده از روش های رمزنگاری مفسر، کدهای تان را رمز نگاری کنید.
اعتبارسنجی مثبت یا همان “لیست سفید” برای داده های ورودی نیز مفید است، اما یک دفاع کامل نیست، چون در ورودی بسیاری از برنامه ها کاراکترهای خاص را می بینیم. اگر کاراکترهای خاص داشتیم، تنها راه حل های 1 و 2 که در بالا ذکر شد، امن هستند.
آشنایی با پروتکل LDAP
یکی از سرویسهایی که روی لینوکس ارائه میشود، امکان کار با پروتکل LDAP است.
این سرویس که تا حدودی برای بسیاری از کاربران و مدیران شبکه ناآشنا است، در کنار سرویس سامبا (Samba) بستری برای ارتباط سکوی اپنسورس با دیگر سکوهای سیستمعاملی ایجاد میکند و موجب میشود بدون در نظرگیری استانداردها و پروتکلهای سمت سرویسدهنده، با آنها سازگاری و همسانسازی داشته باشد.
سرویس دایرکتوری
دایرکتوری یا فهرست راهنما، یک سرویس ویژه در شبکههای کامپیوتری یا اینترنت است که برای بهبود کار با بانکهایاطلاعاتی برای خواندن، جستوجو و مرور اطلاعات به کار میرود.
با استفاده از سرویس دایرکتوری میتوان محتویات بانک اطلاعاتی را دستهبندی نمود، برای آنها ویژگیها و ایندکسهایی تعریف کرد و بر این اساس فایلها و اطلاعات شبکه را برای دسترسی سریع و آسان طبقهبندی نمود.
برای مثال، در شبکه ممکن است یک بانک اطلاعاتی از فایلها وجود داشته باشد. با استفاده از سرویس دایرکتوری میتوان این فایلها را طبقهبندی نمود، ویژگیهای مختلفی به آنها افزود و عملیات بروزرسانی و آپلود آنها را انجام داد؛ به طوری که دسترسی به آنها از روی شبکه برای کاربران ساده و راحت باشد.
هر سرویس دایرکتوری دارای ویژگیهای اساسی زیر است:
- قابلیت بهینهسازی خواندن و دسترسی به فایلها
- مدلی توزیع شده برای مدیریت و ذخیره اطلاعات
- افزایش و توسعه ویژگیها و انواع اطلاعات ذخیره شده
- ایجاد یک ابزار جستوجوی پیشرفته روی شبکه
روشهای مختلفی برای راهاندازی یک سرویس دایرکتوری وجود دارد. علاوه بر این، متدهای مختلفی برای مدیریت اطلاعات و ذخیرهسازی آنها براساس آپلودکردن آنها روی بانک اطلاعاتی، نحوه دسترسی، چگونگی مرجعدهی آنها برای یک سرویس دایرکتوری قابل استفاده است.
برخی از سرویسهای دایرکتوری محلی (Local) هستند و فقط روی یک شبکه محلی یا یک ماشین سرویسدهنده اجرا میشوند.
برخی دیگر از دایرکتوریها عمومی (Global) هستند و روی چندین شبکه محلی یا سرویسدهنده توزیع میشوند، و امکان مدیریت و دسترسی به اطلاعات روی شبکه را از این طریق فراهم میکنند. Domain Name System) DNS) یک مثال از سرویس دایرکتوری عمومی است.
پروتکل LDAP
Lightweight Directory Access Protocol یک پروتکل مبتنی بر شبکه و X500 برای دسترسی به سرویسهای دایرکتوری روی شبکه است.
این پروتکل دارای مستندات RFC2251 و RFC3377 است. به علت آنکه دایرکتوریهای موجود روی شبکه یکتا نیستند و هر یک ممکن است براساس یک سکوی سیستمعاملی و ساختار متفاوت باشند، پروتکل LDAP امکان برقراری ارتباط و مدیریت آنها را فراهم میکند.
در حقیقت LDAP ابزاری برای مدیریت اطلاعات شبکه، حسابهای کاربری، ماشینهای میزبان شبکه و منابع درون شبکه است.
با استفاده از این استاندارد میتوان یک مدیریت متمرکز و واحد را به کل پیکره شبکه اعمال نمود و با دسترسی به تمام سرویسهای درون شبکه (سختافزاری و نرمافزاری) امکان همسانسازی و پیکربندی آسان آنها را فراهم کرد.
در حالت کلی پروتکل LDAP وظایف زیر را بر عهده دارد:
- ایجاد یک زبان مشترک دسترسی دایرکتوری (Directory Access) بین ماشین میزبان و سرویسدهنده در شبکه و امکان برقراری ارتباط و تبادل اطلاعات میان آنها فارغ از سکوی سیستمعاملی و سختافزاری.
- ایجاد قابلیت استفاده از متدهای ساده رمزنگاری در پروتکل TCP/IP برای تبادل اطلاعات کنترلی و مدیریتی مانند کنترل و مدیریت کاربران در شبکه.
- ایجاد یک استاندارد برای استفاده از دایرکتوری در شبکه.
- این استاندارد قابلیت نصب و پیکربندی ساده و انعطافپذیر سرویس دایرکتوری و سفارشی نمودن آن برای نیازهای گوناگون را روی شبکه فراهم میکند.
- پشتیبانی توابع API : این پروتکل از C ،Netscape’s Java SDK ،PerLDAP ،SunSoft’s JNDI و Microsoft’s Active Directory Services Interface) ADSI) پشتیبانی میکند و با آنها سازگار است. این ویژگی امکان مدیریت و کنترل دسترسی شبکههای گسترده را فراهم میکند که دارای چندین سکوی نرمافزاری/ سختافزاری هستند.
- استفاده از یک استاندارد با نام LDAP Data Interchange Format) LDIF) برای توصیف و تشریح اطلاعات دایرکتوری. این استاندارد که توسط یک ابزار با همین نام به کار گرفته میشود، تحت خط فرمان است و امکان تنظیم مجموعهای از دایرکتوریها یا آپلودکردن آنها برای استفاده در دایرکتوری را در اختیار مدیر شبکه قرار میدهد.
ساختار LDAP
اطلاعاتی که روی LDAP قرار میگیرد، اطلاعاتی ایندکسدار و مدخلمانند است.
بدین معنی که اطلاعات به صورت مجموعهای از ویژگیهای توزیع شده قابل دسترسی هستند که از یکدیگر متمایزند و کاربران میتوانند از طریق ایندکسهای موجود، به اطلاعات دسترسی پیدا نمایند.
برای مثال، عبارت میتواند یک ایندکس برای اطلاعات دستوری و برای آدرسهای ایمیل باشد.
cn میتواند ارزش یک داده یا اطلاعات برای یک کاربر یا ماشین باشد (برای مثال Misagh و mail) آدرس ایمیل مرتبط با ارزش cn باشد (برای مثال misagh؛example.com).
روی LDAP اطلاعات به صورت مدخلهای دایرکتوری و سلسله مراتبی قرار میگیرند.
این ساختار سلسله مراتبی انعکاسی از ساختار شبکه یا اینترنت و وضعیت جغرافیایی یا قرارگیری ماشینهای کلاینت و سرویسدهنده است.
LDAP در لینوکس
LDAP خود یک پروتکل و استاندارد برای برقراری ارتباط با سرویس دایرکتوریهای مختلف است، اما در لینوکس برای به کارگیری و مدیریت این پروتکل ابزار OpenLDAP ارائه شده است.
OpenLDAP یکی از بنیادیترین ابزارهای لینوکس است و به همین خاطر در غالب توزیعهای لینوکس مشاهده میشود و امکان نصب و راهاندازی آن به راحتی وجود دارد.
بنابراین نصب این سرویس کار چندان مشکلی نخواهد بود، اما پیکربندی LDAP برای دسترسی به دایرکتوریهای تعریف شده و تنظیمات آنها براساس مستندات شبکه، نیازمند دقت و تمرین است.
علاوه بر این، هر توزیع، ابزارهای متنوع مدیریتی برای کار با این سرویس ارائه نموده است.
برای نمونه در توزیع SUSE، در بخش Network Service ابزار LDAP Client ارائه شده است که میتوان با دادن آدرس سرویسدهنده LDAP و شماره DN اختصاصی تعریف شده برای کاربر، به این سرویس متصل شد .
برای تنظیمات مورد نیاز باید به سراغ پوشه /etc/openldap رفت. در این پوشه فایلهای پیکربندی ldap.conf و slapd قرار دارند.
برای شروع و خاتمه سرویس LDAP نیز از دو دستور slapd start و slapd stop استفاده میشود. slapd نام دایمون ابزارOpenLDAP در لینوکس است.
نصب و پیکربندی LDAP روی دبیان سارژ
دبیان بزرگترین توزیع لینوکس است که قابلیتها و ویژگیهای آن موجب شده روی کامپیوترهای سرور و با هدف ایجاد سرویسدهنده به راحتی راهاندازی شود.
سارژ یا دبیان 1/3 آخرین نسخه این توزیع است که شامل طیف گستردهای از برنامهها و ابزارهای موردنیاز برای یک سیستم سرور است.
در ادامه نصب و پیکربندی سرویسدهنده پروتکل LDAP روی این توزیع مرور میشود.
برای نصب LDAP ، اگر در هنگام نصب دبیان نصب نشده است، باید از دستور زیر استفاده نمود:
apt-get install slapd ldap-utils
با اجرای دستور فوق ابزار OpenLDAP و ابزارهای دیگر وابسته به آن نصب میشوند.
اکنون از مسیر /etc/openldap فایل دایمون slapd.conf را توسط یک ویرایشگر متنی باز نمایید.
دو گزینه برای دسترسی به سرویسدهنده LDAP و مدیریت آن و که نام دامنه سرویس LDAP است، در این فایل باید تنظیم شوند.
برای مثال:
omit openLDAP server configuration? no
DNS domain name: example.org
Admin password: ldap
database backend to use: BDB
Do you want your database to be removed when slapd is purged? no
protocol? No2Allow LDAPv
پس از انجام دادن تنظیمات موردنیاز و اجرای سرویس LDAP، با استفاده از دستور
ldapsearch -x -b dc=example,dc=org
میتوانید سرویسدهنده LDAP و صحت کارکرد آن را تست نمایید.
سپس باید اطلاعات پایهای اولیه سلسله مراتبی سرویس دایرکتوری شبکه یا نام دامنه مورد نظر برای OpenLDAP تعریف شوند.
برای این منظور یک فایل متنی را باز کنید و نام آن را base.ldif قرار دهید.این فایل در همان پوشه openldap ذخیره میشود.
همانطور که در ضمن مثالی در بالا اشاره شد، اطلاعات یک دایرکتوری ممکن است به صورت زیر باشند:
dn: ou= People, dc= example, dc=org
ou: People
objectClass: top
objectClass: organiationalUnitz
dn: ou= Group, dc= example, dc=org
ou: Group
objectClass: top
objectClass: organiationalUnitz
اکنون برای افزودن فایل اطلاعات به دایرکتوری LDAP و اجرای سرویسدهنده از فرمان زیر استفاده میشود:
ldapadd -x -D “cn=admin,dc=example,dc=org” -W -f base.ldif
در صورت اجرای دستور بالا و صحیح بودن کلمه عبور، خروجی مشاهدهشده در ترمینال خط فرمان باید با عبارت . آغاز شده باشد که بیانگر آماده بودن سرویسدهنده LDAP برای وارد نمودن اطلاعات جدید یا مدیریت کاربران است.
در گام بعد معمولاً مدیران شبکه یک گروه کاری را تعریف میکنند تا کاربرانی که میخواهند به اطلاعات روی سرویس دایرکتوری دسترسی داشته باشند عضو این گروه شوند.
نام گروه میتواند group.ldap باشد. بدون اینکه بخواهیم درگیر جزئیات و پیچیدگیهای راهاندازی یک گروه کاری روی LDAP شویم، میتوان اینگونه عمل نمود:
dn: cn= ldapusers, ou= Group, dc= example, dc=org
objectClass: PosixGroup
ObjectClass: top
cn: ldapusers
userPassword: [crypt]x
gidNumber:9000
اکنون LDAP برای برقراری یک ارتباط و استفاده روی شبکه آماده است.
بیتر بخوانید :
WebSpy؛ راهکاری برای مقابله با سوء استفاده از اینترنت
آشنایی با برخی از مفاهیم پایه امنیت شبکه و اینترنت