<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیر حسین فلاحی</title>
        <link>https://virgool.io/feed/@amir.h.fallahi</link>
        <description>مهندس امنیت اپلیکیشن</description>
        <language>fa</language>
        <pubDate>2026-06-07 19:46:46</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/280961/avatar/RfjhmC.png?height=120&amp;width=120</url>
            <title>امیر حسین فلاحی</title>
            <link>https://virgool.io/@amir.h.fallahi</link>
        </image>

                    <item>
                <title>بحث Overlong encoding چیه و چرا میتونه منجر به Security Issue بشه ؟</title>
                <link>https://virgool.io/@amir.h.fallahi/%D8%A8%D8%AD%D8%AB-overlong-encoding-%DA%86%DB%8C%D9%87-%D9%88-%DA%86%D8%B1%D8%A7-%D9%85%DB%8C%D8%AA%D9%88%D9%86%D9%87-%D9%85%D9%86%D8%AC%D8%B1-%D8%A8%D9%87-security-issue-%D8%A8%D8%B4%D9%87-sskzoceyslmt</link>
                <description>چیشد که بهش برخورد کردم ؟تو cheat sheet های آسیب پذیری Path traversal به یه موضوعی برخورد کردم تحت عنوان overlong encoding که در UTF-8 میتونست منجر به دورزدن موانعی بشه که توسعه دهنده برای اینکه آسیب پذیری path traversal رخ نده ، گذاشته بود .بعد سرچ کردن متوجه شدم این بحث خیلی قدیمی هست و چیز تاپی نیست اما چیزایی که تو stackoverflow  و همچنین ویکی پدیا دربارش گفته بودن برام گنگ بود ، تا اینکه یه وبلاگ رو پیدا کردم که این بحث رو باز کرده بود ، حالا من میخوام خلاصه اون مطلب رو با cheat sheet هایی که از path traversal یاد گرفتم رو با هم ترکیب کنم و  باهاتون به اشتراک بذارم .پیش نیاز این مطلب هم این هست که با تبدیل مبنا ها و همچنین با استاندارد های معروف character encoding آشنایی داشته باشید .اما UTF-8 چه جوری کار میکنه ؟استاندارد یونیکد به تمام کاراکتر هایی که پشتیبانی میکنه یه عددی اختصاص میده به اسم code point یا code position . استاندارد UTF-8 از ۸ بیت برای represent کردن ۱۲۷ کاراکتر تو استاندارد ascii استفاده میکنه که ۳۲ تای اولش شامل control character ها میشه و بقیش شامل symbol ها و الفبای انگلیسی و اعداد میشن. مثلا کاراکتر # عدد ۳۵ رو برای code point داره . حرف A عدد ۶۵ رو داره ، عدد ۵ مقدار ۵۳ رو برای code point داره و برای بقیه code point ها که فراتر از استاندارد اسکی میرن ،  از variable length encoding استفاده میکنه. به این منظور که طول encodoing ما متغییر هست یعنی تعداد bit های استفاده شده برای encode کردن یه کاراکتر با افزایش code point ، زیاد میشه . طبیعتا وقتی عدد بزرگتری داشته باشیم تعداد bit بیشتری برای ذخیرش نیاز داریم . تو این استاندارد کاراکتر ها در فضای ۱ بایتی تا ۴ بایتی ذخیره میشن . تعداد کمی ازشون به ۴ بایت نیاز دارن و اکثرا کمتر از ۲ بایت میخوان .تو کاراکتر encode شده در مبنای باینری اگر اولین bit از اولین byte عدد 0 باشه ، این کاراکتر فضای ۱ بایتی داره و جز کاراکتر های ascii محسوب میشه . مثلا کاراکتر C رو در نظر بگیریم که code point اش ۶۷ هست . عدد ۶۷ در مبنای باینری میشه 01000011 و همونطور که مشاهده می کنید اولین bit اش 0 هست . یه مثال دیگه : کاراکتر = با مقدار ۶۱ برای code point تو مبنای باینری میشه 00111101 که بازم اولین bit اش 0 هست .در غیر این صورت یعنی اگر اولین بیت از از اولین بایت 0 نبود ، نشون دهنده فضای اون کاراکتر هست که اشغال میکنه . مثلا اگر با 110 اغاز شد کاراکتر ما 2 بایت فضا اشغال میکنه ( از تعداد 1 های ابتدا متوجه شدیم ) ، اگر با 1110 شروع شد کاراکتر ما 3 بایت اشغال میکنه ( چون با 3 تا 1 شروع شده ) و اگر با 11110 اغاز شده بود یعنی کاراکتر ما فضای ۴ بایتی اشغال میکنه . اولین بایت رو به اسم leading byte میشناسیم و تمام بایت های دیگه با مقدار باینری 10 آغاز میشن که اون ها رو به اسم continuation byte میشناسیم . خوب اوکی مشکل کجاست ؟کاراکتر A رو در نظر بگیرید که code point اش 65 هست در مبنای دسیمال و 0x41 در مبنای هگزادسیمال . چون عددش ۶۵ هست و کمتر از ۱۲۸ پس میتونیم توی ۱ بایت نمایشش بدیم دقیقا مثل ascii . اما ظاهرا راه های مشابهی برای نمایش همین کاراکتر هم وجود داره ! مثلا دنباله 0xC1, 0x81 دقیقا کاراکتر A رو نشون میده . چجوری ؟ خب عدد C1 رو میتونیم به صورت 11000001 و عدد 81 رو هم به صورت 10000001 در مبنای باینری نشون بدیم . در کنار هم می نویسیمشون :در عکس بالا مشاهده می کنید که باینری ها رو کنار هم نوشتیم  ، بعدش دور باینری هایی که باید حذف بشن پرانتز گذاشتم ، باید از leading byte مقدار 110 رو حذف کنیم ( چون صرفا نشون دهنده تعداد بایت های کاراکتر هست ) و از continuation byte هم مقدار 10 حذف می کنیم ( چون نشون دهنده continuation byte هست )  ، تو مرحله بعد باینری که به دست میاد رو از سمت راست ۴  رقم ۴ رقم جدا می کنیم ، بعدش یه 0001 داریم که در مبنای هگزادسیمال میشه 1 و یه 0100 هم در مبنای هگزادسیمال میشه 4 ، این هارو که کنار هم بذاریم میشه 0x41 ، مقدار 41 هگزادسیمال رو هم اگر در مبنای دسیمال ببریم میشه همون 65 که نشون دهنده کاراکتر A هست و اینکه 0x41 میشه overlong form کاراکتر A(:این مثال صرفا مثال جالبی بود اما Security Issue کجاست ؟‌ اونجاست که  توسعه دهنده اپلیکیشن فکر میکنه وقتی دیتایی از طرف کاربر میاد ، حتما encoding اون short form هست . فرض کنید فانکشنی داریم که کارش لود کردن فایل از توی وب سرور هست ، اسم فایل توسط پارامتری به اسم filename از کاربر گرفته میشه  ، برنامه نویس برای جلوگیری از path traversal هم میاد / و . و \ رو از پارامتر گرفته شده حذف میکنه ، اما این کاراکتر ها نوع نمایش دیگه ای هم دارن و اون overlong هست که تو بالا با هم نمونه کاراکتر A رو دیدیم .حالا میخوایم overlong encode کاراکتر های Dot ، Forward slash ، Back slash و همچنین Null character رو ببینیم . Dot : %c0%2e , %c0%aeتو url encoding مقدار Dot برابر هگزادسیمال 2e% هست اما ۲ تا مقدار بالا هم همشون همین مقدار 2e% رو نشون میدنDot overlong formبرای مثال اگر بخوایم  c0%2e% رو بررسی کنیم ، بعد اینکه هگزادسیمال رو در مبنای باینری نوشتیم ،‌ از leading byte مقدار 110 رو حذف می کنیم ، چون continuation byte با 10 شروع نمیشه چیزی برای حذف کردن نداره ، در آخر باینری ها رو از سمت چپ ۴ رقم ۴ رقم جدا می کنیم و در مبنای هگزادسمیال می نویسمیشون ، که 1110 میشه e و 0010 میشه 2 ، در نهایت ما 2e% رو داریم که همون Dot هستش در ادامه هم بایپس های دیگه و تو عکس نحوه به وجود اومدنش هست : Forward slash : %c0%af , %e0%80%af, %c0%2fForward slash overlong formBackslash: %c0%5c , %c0%80%5c , %ca%9c‌Back slash overlong formNull character : %c0%80Null character overlong formمرسی که مطلب رو تا اینجا خوندید (:منبع : https://kevinboone.me/overlong.html</description>
                <category>امیر حسین فلاحی</category>
                <author>امیر حسین فلاحی</author>
                <pubDate>Wed, 20 Oct 2021 15:26:11 +0330</pubDate>
            </item>
                    <item>
                <title>راهکار های جدید مقابله با فیشینگ کارت های بانکی</title>
                <link>https://virgool.io/@amir.h.fallahi/%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF-%D9%85%D9%82%D8%A7%D8%A8%D9%84%D9%87-%D8%A8%D8%A7-%D9%81%DB%8C%D8%B4%DB%8C%D9%86%DA%AF-%DA%A9%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D8%A8%D8%A7%D9%86%DA%A9%DB%8C-e2tehwj518nb</link>
                <description>تو این پست قصد دارم راهکار های جدید مقابله با فیشینگ کارت های بانکی رو بهتون بگم چون راه های قبلی همگی منسوخ شده اندخالی شدن  حساب بانکی شما با اینجور روش ها ممکنه فقط یکبار اتفاق بیفته و همون یکبار مبلغ زیادی از حساب شما برداشت بشه و شما رو برای همه عمرتون از پرداخت اینترنتی زده کنه ، پس راهش استفاده صحیح هست نه دوری کردن از پرداخت الکترونیک (:فیشینگ کارت بانکیقبلش بد نیست معنی این دو تا کلمه رو بدونیم :فیشینگ : عملیاتی که کاربر با اون اطلاعات حساب ( شماره کارت ، رمز پویا ،  cvv2 ، تاریخ انقضا ) خودش رو دو دستی تحویل فیشینگر می کنهفیشینگر : شخصی که طمع خالی کردن حساب شما رو دارهروش های جدید :در درگاه های جدید جعلی از قابلیت هایی استفاده میشه که تشخیصش رو از درگاه پرداخت واقعی سخت تر می کنه !مثلا چه قابلیت هایی : تو یه درگاه جعلی میتونی رمز دوم پویا صحیح دریافت کنی یا صحیح بودن اطلاعات کارتت رو چک کنی ( اطلاعات غلط وارد کنید درگاه بهتون میگه اطلاعات صحیح نیست )فیشینگر میتونه موقع پرداخت ، اطلاعات پرداخت غلطی بهتون بده  مثل اینکه چقدر قراره از حسابتون کسر بشه ! شاید اونجا نوشته باشه 10 هزار تومن ولی در اصل  1 میلیون تومن از حساب شما کسر میشه ! زمانی که پرداخت انجام میشه هم فیشینگر میتونه اطلاعات پرداخت غلط تحویل شما بده ! یعنی چی ؟ مثلا در اطلاعات پرداخت درج شده مبلغ برداشت شده 10 هزار تومن بوده اما فیشینگر 2 میلیون تومن برداشته !یا شماره پیگیری ، شماره ترمینال ، شماره مرجع غلط بده که اگه درست هم باشه دستتون به جایی بند نیست ! چرا ؟ ادامه مطلب رو ببینیدبا ساز و کار رمز دوم پویا میزان فیشینگ های بانکی صفر نشد بلکه به طور چشم گیری کم شد چون فیشینگر با یک رمز نهایتا میتونه یک تراکنش انجام بده ، فرض کنید مبلغی که میخواد برداشت کنه در حساب شما موجود نباشه ( طبیعتا به در بسته میخوره)و اما اصل مطلب ، راه های مقابله با فیشینگ کارت های بانکی:تو کارتی که باهاش پرداخت انجام میدید مبلغی باشه که اگه صفر شد بهتون لطمه مالی وارد نشهپیامک انجام تراکنش های بانکیتون رو فعال کنیدتنها راه شناخت درگاه اصلی از جعلی در حال حاضر آدرس صفحه هست ( قبلا کلی راه وجود داشت )آدرس صفحه باید زیر دامنه ای از آدرس اصلی زیر باشهshaparak.irاین آدرس مال کجاست ؟ نهاد مرجع صنعت پرداخت الکترونیک کشورزیر دامنه چیه ؟ یه آدرس قبل از آدرس اصلی میاد و بعدش نقطه میاد ( نقطه خیلی خیلی مهمه ) ، غیر از این جعلی هستx.shaparak.irدر این آدرس  x اسم شرکت ارائه دهنده درگاه هست ( که مخفف شده )مثال چندتا آدرس صحیح :bpm.shaparak.irsep.shaparak.irpep.shaparak.irbmi.shaparak.irنمونه آدرس صحیح : به آدرس بالا دقت کنیدقسمت 1 : بخش متغییر هست و میتونه هر حرفی داشته باشه ، و نکته مهم اینکه حتما بعد اون حروف متغیر باید نقطه داشته باشه ( اگه نقطه نداشت جعلی هست )قسمت 2 : آدرس ثابت  shaparak.ir  هستمثال چندتا آدرس و زیر دامنه غلط :Shaparak.comShapaarak.orgBmishaparak.irsepshaparak.irبالاتر گفتیم با شماره پیگیری ، شماره ترمینال ، شماره مرجع درست هم نمیشه پیگیری کرد و درصد احتمالش کم هست که پیگیری نتیجه بده؟ چرا ؟ پول شما به کارت (حساب) فردی رفته که متاسفانه در ازای مبلغ نا چیزی مثل 100 هزار تومن کارتش رو فروخته (عموما افراد بی خانمان  یا معتاد)بعد از اینکه پول از حساب شما کسر شد فیشینگر باهاش چیکار می کنه ؟ پول شما رو میشوره ! بله ، پولشویییعنی با پول شما ارز مجازی خریداری میشه ، مثل بیت کویین ( قابل پیگیری نیست )با پول شما از فروشگاه های اینترنتی کالا سفارش داده میشه و اون کالا باز به یک نفر دیگه فروخته میشه ( پولشویی )و کلی راه های دیگه که گفتنش دردسر ساز هست برای شکایت از کلاهبرداری میتونید برید به دادسرا منطقه یا نزدیکترین شعبه پلیس فتا ، اما نکته مهم این هست که برادران پلیس فتا سرشون شلوغ هست و شما هم باید کلی دوندگی کنید تا به پولتون برسید ، تازه اگه برسید ! ،  پس به نکات گفته شده خوب دقت کنید و اون ها رو به خاطر بسپارید و اون رو با عزیزانتون به اشتراک بزاریدپی نوشت :بالاتر اشاره کردیم که در درگاه های بانکی جعلی از قابلیت هایی استفاده میشه که از تشخیصش رو سخت می کنه ! چه قابلیتی ؟ این قابلیت پیاده سازی یک پراکسی بین کاربر و درگاه پرداخت اصلی است که با اون میشه اطلاعات کاربر رو شنود کرد !این هم که گفتم با پول شما ارز مجازی خریداری میشه ، مثل بیت کویین که قابل پیگیری نیست منظورم شبکه بانکی امن و غیر متمرکز  هست وگرنه شاید از صرافی بشه پیگیری کردبانک چجوری میتونه تا حدودی این مشکل رو برطرف کرد ؟ باید برای هر درگاه پرداخت یک شناسه  منحصر به فرد در نظر گرفته بشه ، و هنگام درخواست رمز دوم پویا از سمت کاربر ، بانک رمز دوم پویایی بوجود بیاره که فقط برای اون درگاه پرداخت اصلی و قیمت درج شده اعتبار داشته باشه در غیر این صورت پرداخت انجام نشهممنون که مطلب رو تا انتها خوندید (:</description>
                <category>امیر حسین فلاحی</category>
                <author>امیر حسین فلاحی</author>
                <pubDate>Fri, 25 Sep 2020 19:17:59 +0330</pubDate>
            </item>
            </channel>
</rss>