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

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

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


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

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


محمدحسن یگانه
محمدحسن یگانه
تخصص :Full-Stack Web Developer Freelancer
@mhyeganeh6 سال پیشمطرح شد
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
@pari.a6 سال پیشمطرح شد
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('کد تایید وارد شده صحیح نیست.');
        }
    }

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


AriaieBOY
AriaieBOY
تخصص :TALL Stack Lover
@ariaieboy6 سال پیشمطرح شد
1

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


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

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


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

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