pari.a
4 سال پیش توسط pari.a مطرح شد
17 پاسخ

نفوذ به پنل ادمین سایت

سلام . یه پنل ادمین دارم که با لاراول نوشته شده برای لاگین کاربر اول رمز عبور رو وارد میکنه و بعد از اون وارد صفحه ای میشه که پیامک تایید میاد و میتونه لاگین کنه.امروز چند تا پیامک تایید اومد و متاسفانه اون شخص تونسته بود لاگین کنه. به نظرتون چطور ممکنه؟به نظر من محتمل ترین گزینه sql injection هست .


ثبت پرسش جدید
میثم فلاح
تخصص : برنامه نویس
@meysamfallah 4 سال پیش مطرح شد
1

سلام
بهتره یه لینک بفرستید تا بررسی بشه.
اینجوری نمیشه چیزی گفت و فقط حدس و گمانه


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش آپدیت شد
2

@pari.a

اگر از ORM و کوئری بیلدر لاراول استفاده کرده باشید، بصورت اتومات جلوی SQL Injection رو میگیره. تنها در حالتی ممکن هست این اتفاق افتاده باشه که به شکل کوئری رو به شکل خام (raw) نوشته باشید.

The Laravel query builder uses PDO parameter binding to protect your application against SQL injection attacks. There is no need to clean strings being passed as bindings.

Raw statements will be injected into the query as strings, so you should be extremely careful to not create SQL injection vulnerabilities.

درباره علل دیگه اش هم بدون دیدن کدها و تحلیل فرایند احراز هویت نمیشه نظری داد.


pari.a
@pari.a 4 سال پیش آپدیت شد
0

@meysamfallah
@mhyeganeh
البته میدونم قسمتهایی از کد کثیف کاری شده بخاطر کمبود وقتم نمیخواستم از اول بنویسم تجربم بسیار پایینه. قسمتی که true گذاشتم میره سراغ ارسال اس ام اس کد تایید .این متد لاگین لاراول هست که اون مقدار true داخل پرانتز رو گذاشتم.ورژن لاراول 5.6 هست

  public function login(Request $request)
    {
        $this->validate($request, [
            $this->username() => 'required|string',
            'password' => 'required|string',
            'captcha' => 'required|captcha'
        ],[
            'captcha.required' => 'وارد کردن کد امنیتی الزامی است.',
            'captcha.captcha' => 'کد امنیتی وارد شده اشتباه است.'

        ]);

        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        if ($this->attemptLogin($request)) {
            if(\Auth::user()->isInActive()){
              \Auth::logout();
              return Redirect::back()->withErrors('اکانت کاربری شما مسدود شده است');
            } else {
                if(true){
                    $user = \App\User::where('mobile', $request->input('mobile'))->get()->first();
                    $user->temporary_code = rand(10000, 99999);
                    $user->save();
                    \Auth::logout();
                    $response =  SmsController::login($user->temporary_code, $user->mobile, 'login-confirm');
                    if($response[0] == 'error')
                    {
                        return \redirect()->back()->withErrors('پیامک تایید ارسال نشد لطفا دقایقی بعد تلاش نمایید.');
                    } else {
                    return \redirect()->route('sms.login.view', ['guid' => \Crypt::encrypt($user->mobile)])->with(['success_message' => true]);
                        }
                } else {
                    return $this->sendLoginResponse($request);
                }
            }
        }

        $this->incrementLoginAttempts($request);

        return $this->sendFailedLoginResponse($request);
    }

بعدش با یه guid وارد صفحه دوم میشه(http://localhost:8000/user/auth/sms?guid=eyJpdiRDZyMmZ3YzMxMjVkYzM4ZGI3NSJ9) البته guid بزرگه اینجا مقداریشو برداشتم . تا پیامک دریافتی از کاربر رو بگیره و بعد از اینکه کاربر کد رو تایید کرد

    public function loginWithSms(Request $request)
    {
        $this->validate($request, ['temporary_code' => 'required'], ['temporary_code.required' => 'وارد کردن کد هویتی الزامی است.']);

        $mobile =  \Crypt::decrypt($request->input('guid'));

        $user = \App\User::where('mobile', $mobile)->get()->first();

        if(Carbon::now()->diffInMinutes($user->updated_at) > 2)
        {
            return \redirect()->route('login');
        }else if($user->temporary_code == $request->input('temporary_code'))
        {
            \Auth::loginUsingId($user->id);

            if (\Auth::user()->isInActive()) {
                $this->logout($request);
                return redirect()->route('login');
            }

            if (\Auth::user()->role_id == \App\User::ROLE_ADMIN) {
                $route = 'admin.change.page';
            }else {
                $route = 'user.panel.index';
            }

            return \redirect()->route($route);
        } else {
            return \redirect()->back()->withErrors('کد تایید وارد شده صحیح نیست.');
        }
    }

حالا اون شخص وارد سایت شده یعنی هم پسورد رو زده هم کد تایید رو . پسورد که داخل لاراول هش شده هست .


سهیل حیدری
@hbr 4 سال پیش مطرح شد
0

من php کار نکردم ولی یه چک بکنید ببینید موقعی که کاربر auth نکنه و این رو در مرورگرش بزنه \App\User چه اتفاقی میافته وارد پنل میشه یا نه


pari.a
@pari.a 4 سال پیش مطرح شد
0

@khosravi424
دقیقا بفرمایید کجا؟ داخل url?
ممنونم


سهیل حیدری
@hbr 4 سال پیش مطرح شد
0

بله داخل url چون ممکنه موقع فراخوانی این روت چک نکنید عمل auth کردن رو


pari.a
@pari.a 4 سال پیش مطرح شد
0

@khosravi424
وارد صفحه ارور شد کسی لاگین نیست


ebi
@ebibombas1988 4 سال پیش مطرح شد
0

دوست عزیز فکر کنم شما کدتون یک اشکالی داره
شما کد فعالسازی رو sms می کنید که یک عدد 5 رقمی هستش
خوب کاربر میتونه از 10000 شروع کنه و تا 99000 یکی یکی امتحان کنه اونم توسط ربات
شما باید تو کدتون یه بخشی بنویسید که وقتی کاربر کد موقت رو وارد کرد و کد درست نبود کد موقتی که تو دیتابیس ذخیره شده ریست بشه


ebi
@ebibombas1988 4 سال پیش مطرح شد
0

تنها ادمین سایت شما هستید؟


pari.a
@pari.a 4 سال پیش مطرح شد
0

@ebibombas1988
یه محدودیت یه دقیقه ای گذاشتم براش یعنی تا یه دقیقه فرصت داره! از طرفی مشکل من اینه که قبل از این شماره تلفن همراه و رمزم رو وارد کرده


pari.a
@pari.a 4 سال پیش مطرح شد
0

@ebibombas1988
چند تا ادمین داره.


ebi
@ebibombas1988 4 سال پیش مطرح شد
1

@pari.a
شما دو دقیقه وقت گذاشتید و یک ربات در دو دقیقه میتونه چند هزار request ارسال کنه
بعد از لاگین اولیه فیلدی برای وارد کردن شماره موبایل وجود داره ؟یعنی هر شماره موبایلی رو میشه وارد کرد ؟


pari.a
@pari.a 4 سال پیش مطرح شد
0

@ebibombas1988
اخه قبلا چند تا سایت که عضو بودم و سایتهای کوچیکی نبودن رو دیدم کدی که ارسال میکردن ۴ الی ۶ رقمی بود. تایمر رو روی دو دقیقه گذاشتم چون یه وقتایی پیام به کاربر دیر میرسه صداش در میاد.
من حس میکنم کدم مشکل داره . اولش که شماره تلفن رو رو با پسورد وارد میکنه که اون با خود لاگین لاراول چک میشه بعدش شماره موبایل رو encrypt میکنه و میفرسته به صفحه بعدی که نشون دادم داخل url هست و خیلی بزرگه . تو اون صفحه از کاربر کد رو میگیرم و لاگین میکنه.


ebi
@ebibombas1988 4 سال پیش مطرح شد
1

@pari.a
تعداد کاراکتر مناسبه
ولی باید یه سیستمی وجود داشته باشه تا نتونه بینهایت بار پسورد موقت رو تست کنه
مثلا بعد چند بار اشتباه وارد کردن رمز ، پسورد از نوع ست بشه
و یا نیاز باشه بعد چند بار وارد کردن پسورد اشتباه کپچا وارد بشه تا ربات نتونه همه پسوردهارو تست کنه


pari.a
@pari.a 4 سال پیش مطرح شد
0

@ebibombas1988
اگر recaptcha گوگل رو واسه قسمت درج کد تایید بذارم باز هم ربات میتونه در دو دقیقه چند هزار request بفرسته؟


AriaieBOY
تخصص : TALL Stack Lover
@ariaieboy 4 سال پیش آپدیت شد
1

نگاه کنید دوتا کار میتونید انجام بدید اگر مشکل از بحث ربات باشه
اول اینکه یک ریت لیمیت روی روتی که داره کد ارسال میشه بذارید مثلا بگید در هر دو دقیقه فقط میشه 5 بار به این روت ریکوئست زد
اینکار مقدار زیادی جلوی بات میگیره و بعد اونم میتونید از ریکپچا استفاده کنید.
https://laravel.com/docs/7.x/routing#rate-limiting


ebi
@ebibombas1988 4 سال پیش مطرح شد
1

@pari.a
تقریبا خیر دیگه نمیتونه
چون برای ارسال اطلاعات باید از کپچا گوگل عبور کنه


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام