/dev/null
321 subscribers
50 photos
11 videos
8 files
111 links
| دستمو گذاشتم رو این کار ، قلبمو گذاشتم. |

هر new ای را delete ای ست و پس از آن null کردنی (:
Download Telegram
آقا داشتم درباره fs (file system) تویه node js میخوندم دیدم این بحث جالبیه 🦦❤️

کلا fs یه ماژول برای اجرا کردن دستورات سیستم عاملی هست .
میاد یه سری directory یا file درست میکنه ، حذف ، ویرایش و یا پسوند فایل میخونه و ...
حالا تویه node js دو نوع عملکرد واسه ماژول fs میتونه رخ بده :

عملکرد همزمان (Synchronous):
در این حالت، برنامه تا زمانی که عملیات I/O (مانند خواندن فایل) کامل نشود، متوقف می‌شود. به عنوان مثال، fs.readFileSync باعث می‌شود که برنامه منتظر بماند تا فایل خوانده شود و سپس به خط بعدی کد برود.
این روش می‌تواند در اسکریپت‌های ساده یا در مواقعی که نیاز به عملکرد سریع و بدون پیچیدگی دارید، مفید باشد.
عملکرد ناهمزمان (Asynchronous):

در این حالت، برنامه می‌تواند به کار خود ادامه دهد در حالی که عملیات I/O در پس‌زمینه در حال انجام است. به عنوان مثال، fs.readFile به شما این امکان را می‌دهد که با استفاده از callback functions ، نتیجه را پس از اتمام عملیات دریافت کنید.
این روش برای برنامه‌های سرور که نیاز به پردازش همزمان چندین درخواست دارند، بسیار مناسب است. ینی در این روش باعث میشه event loop مسدود نشه.

حالا فرقشون چیه تویه پردازش و مدیریت خطا:

در متدهای همزمان، می‌توانیم try-catch برای مدیریت خطاها استفاده کنیم.
در متدهای ناهمزمان، خطاها معمولاً از طریق callback‌ها، Promise‌ها یا syntax async/await مدیریت می‌شوند
2
/dev/null
آقا داشتم درباره fs (file system) تویه node js میخوندم دیدم این بحث جالبیه 🦦❤️ کلا fs یه ماژول برای اجرا کردن دستورات سیستم عاملی هست . میاد یه سری directory یا file درست میکنه ، حذف ، ویرایش و یا پسوند فایل میخونه و ... حالا تویه node js دو نوع عملکرد واسه…
Synchronous :

const path = require('path') 
const fs = require('fs');
const projec = path.join(__dirname, 'projects');

if (!fs.existsSync(projec)) {

try {
fs.mkdirSync(projec);
console.log('Directory created successfully.');
} catch (err) {
console.log('Error creating directory:', err);
}
} else {
console.log('Directory already exists.');
}

console.log('It is interesting');

Asynchronous :

const path = require('path') 
const fs = require('fs');

const projects = path.join(__dirname , 'projects')

if (!fs.existsSync(projects)){
fs.mkdir(projects , (err)=>{
if (err){
console.log('Error creating directory:', err);

}
console.log(`add new directory be name projects`);

})
}

console.log('It is interesting');
👏4
/dev/null
Synchronous : const path = require('path') const fs = require('fs'); const projec = path.join(__dirname, 'projects'); if (!fs.existsSync(projec)) { try { fs.mkdirSync(projec); console.log('Directory created successfully.'); }…
اینم واسه تستش
اگه هر کدوم رو تست کنین تویه همزمان اون it is interesting آخر همه ی لاگ ها چاپ میشه ولی اگه تویه ناهمزمان تست کنین اول از همه لاگ ها چاپ میشه
👍2💯2
Forwarded from リョウ (Mr.Packer)
اگر از لینوکس استفاده میکنید احتمالا پیش اومده هرچقدر فایل resolv.conf رو ادیت میکنید دوباره nameserver ها بعد از ریبوت یا ریست شدن سرویس نتورک به حالت اول بر میگردن اما راه حل چیه ؟
بنا بر توزیعتون پکیج resolvconf رو نصب کنید مثلا برای دبین ها apt install resolvconf و آرچ ها pacman -S resolvconf و ..
بعدش باید سرویسش رو enable و start کرد :
$ sudo systemctl start resolvconf.service

$ sudo systemctl enable resolvconf.service

سپس این مسیر باید ویرایش بشه etc/resolvconf/resolv.conf.d/head
$ sudo nano /etc/resolvconf/resolv.conf.d/head


و nameserver های خوتون رو داخلش بریزید مثلا :
nameserver 8.8.8.8


و سپس این دو سرویس رو ریستارت کنید باید اوکی بشه :

$ sudo systemctl restart resolvconf.service
$ sudo systemctl restart systemd-resolved.service





#linux

@DiHoXCH
3👎1
منم کلافه شده بودم رفتم سرچ کنم ببینم چه خبره 🦦
رفتم یه سرچ زدم چون اصن همچین مسیری طبق پست برای من نبود
اول باید ببینیم سیستم از چه سرویس مدیریت شبکه ای استفاده میکنه
چطوری ؟

$ sudo mousepad /etc/resolv.conf

مال من NetworkManager بود . میتونه systemd-resolved یا dhclient و ... باشه .
( فقط رویه NetworkManager تست کردم )
بعدش اگه فقط خواستین رویه تمام connection ها dns ست کنین یه حلقه میخواد و یه nmcli برای پیدا کردن connection ها و dns خودکار هم ایگنور کنین (DHCP)
$ for connection in $(nmcli -g NAME connection); do
sudo nmcli connection modify "$connection" ipv4.dns 8.8.8.8
sudo nmcli connection modify "$connection" ipv4.ignore-auto-dns yes
done

واسه کانکشن ها جدید هم
sudo mousepad /etc/NetworkManager/NetworkManager.conf

اینو به main اضافه کنین
[main]
dns=8.8.8.8


$ sudo systemctl restart NetworkManager
👍4
Access Control

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

خب حالا این مجموعه شامل چه اعضایی میشه:
1. در گام اول Authentication اتفاق می‌افته و فرد احراز هویت میشه.
2. در گام دوم Authorization اتفاق می‌افته و به کاربران مختلف دسترسی‌های متفاوت داده میشه.
3. اجرا شدن قوانین به‌صورت امن.

حالا این کنترل دسترسی‌ها شامل چند دسته و نوع میشن:
فقط اینکه مفهومشون رو بدونید فکر کنم کافیه. مثل اینکه مدیر فقط میتونه ادمین اضافه کنه یا اینکه مثلا کشور ایران نمیتونه به یه فیچر از برنامه دسترسی داشته باشه یا من به‌عنوان مدیر تصمیم میگیرم فقط یه نفر رو به‌طور خاص سطح دسترسیش رو مشخص کنم. هم‌چنین، یه سری محدودیت‌ها هم توسط سیستم‌ها اعمال میشن و توسط کاربر دیگه قابل کنترل نیستن (به اینا میگن MAC).

حالا برای این Access Control یه سری آسیب‌پذیری‌ها پیش میاد:
یکی از این آسیب‌پذیری‌ها IDOR هست (Insecure Direct Object Reference).

توی این آسیب‌پذیری، وب‌سرور ورودی کاربر رو میگیره و به‌عنوان ورودی برای دسترسی به یه شیء یا فایل استفاده میکنه. مثلا:
https://bank.com/card/?idUser=22   ==> id مربوط به یه کاربر هست
https://bank.com/card/?idUser=34 ==> id مربوط به کاربر دیگه است!!

یا ممکنه توی API این اتفاق بیفته:
post /card
body: {"idUser": "22"} // تغییر به idUser34!

اما همیشه اینقدر ساده نیست. مثلا ممکنه idUser توسط uuid یا gid یا حتی یه عدد تصادفی ساخته بشه. در این صورت باید اون عدد رو از راه‌های مختلف برای کاربران دیگه پیدا کنیم. مثلا توی بخش نظرات یک محصول:
یه مثال با gid :
<div class="comment">
<p>great !</p>
<span>mr_x: b6f8a920-3d7a-4a21-92f2-e8f5a6d123ab</span>
</div>

با درخواست به این لینک:
https://store.com/user-profile?user_id=b6f8a920-3d7a-4a21-92f2-e8f5a6d123ab

می‌تونیم پروفایل طرف رو ببینیم.

یه نوع دیگه اینه که بسته به شرایط id تغییر می‌کنه. مثلا شما می‌خواهید پروفایلتون رو آپدیت کنید. علاوه بر اینکه یه user_id دارید که چک می‌کنه خودتون هستید، یه id هم برای پروفایلی که می‌خواهید آپلود کنید در نظر گرفته میشه:
post /profile/image/?id_user=22
profile_pic = Blob_data

(Blob_data یه نوع روش برای ارسال و ذخیره عکس هس )
وقتی این درخواست ارسال میشه، یک id برای پروفایلی که میخواهید ارسال کنید در نظر گرفته میشه. وقتی گزینه submit رو میزنید، اون id هم چک میشه، علاوه بر user_id که توی json ارسال میشه و چک میشه:
post /profile/?user_id=22
{
"name": "mr_x",
"profile_edit": "4"
}

این‌ها خود به نوعی IDOR محسوب میشن، اما آسیب‌پذیری‌های دیگه‌ای هم هستن که باعث بروز IDOR میشن. مثلا:
- تغییر method HTTP:
برنامه‌نویس ممکنه فقط post به /deleteUser رو مسدود کرده باشه، ولی بخواهیم یه کاربر دلخواه رو پاک کنیم:

  post /deleteUser
cookie: session=xxxx
username = mr_x

میشه این رو تبدیل کرد به:

  Get /deleteUser/?username=mr_x
cookie: session=xxxx

- استفاده از هدرهای غیرمعمول HTTP مثل X-Original-URL و X-Rewrite-URL:
این هدرها به سرور اجازه می‌دن که URL اصلی درخواست رو تغییر بدن. مثلا:

  POST / HTTP/1.1
Host: site.com
X-Original-URL: /admin/deleteUser/?username=mr_x
Content-Length: 0

اینطوری میشه URL رو از / به /deleteUser تغییر داد و کاربر دلخواه رو حذف کرد.

دوستان این مبحث طولانیه، ولی ساده است و انواع مختلفی از Broken Access Control وجود داره که بیشتر باهاشون مواجه شدم و گفتم 🦦


#access_control #IDoR

t.me/mrdevnull
👏4
/dev/null
Access Control به مجموعه‌ای از قوانینی گفته میشه که مشخص میکنه چه کسی چه سطح دسترسی و از چه منابعی میتونه استفاده کنه. خب حالا این مجموعه شامل چه اعضایی میشه: 1. در گام اول Authentication اتفاق می‌افته و فرد احراز هویت میشه. 2. در گام دوم Authorization اتفاق…
بعضی از وب سایتا هم فقط Referer رو چک میکنن ینی فقط میبینن از کجا داری این درخواست رو میزنی
ینی میتونه url ت باشه /admin/deleteUser ولی Referer باشه /admin
GET  /admin-roles?username=wiener&action=upgrade  HTTP/2
Host: site.com
Cookie: session=YYYY
Referer: https://site.com/admin

این کوکی YYYY مال ادمین هس
میتونه به جاش این درخواست زده بشه

GET  /admin-roles?username=wiener&action=upgrade  HTTP/2
Host: site.com
Cookie: session= XXXX
Referer: site.com/admin

که میتونه کوکی به XXXX که مال یه کاربر عادیه تغییر کنه
👍3
واسم سوال بود درباره فرق udp و tcp و اینکه چطوری کار میکنن

میدونسم که tcp هر بار واسه ارسال داده tree handshake میزنه ولی udp نه !
واسه همین هم هس که udp سریع تر tcp هس

تویه tcp عملا Tree handshake با server.listen و client.send رخ میده واسه هر بار دیتا فرستادن ولی تویه udp تضمین واسه رسیدن دیتا نیس

درسته تویه udp هربار واسه فرستادن دیتا میاد یه ip , port میگیره ولی زمانش به اندازه tcp نیس .
عکس بالایی واسه tcp و پایینی udp
👍5
Forwarded from Daily Writeups
Title: Mengungkap Jejak Serangan XSS dan SQL Injection Menggunakan Wireshark
════════════════════════
𐀪 Author: Triadi W
════════════════════════
Time: Tue, 28 Jan 2025 17:01:56 GMT
════════════════════════
Tags: #wireshark #merdekasiber #sql_injection #xss_attack
https://www.root-me.org/en/Challenges/Web-Server/JWT-Introduction

https://www.root-me.org/en/Challenges/Web-Server/JWT-Weak-secret

https://www.root-me.org/en/Challenges/Web-Server/JWT-Revoked-token

این سه تا چلنج برای آسیب پذیری که موقع encode کردن jwt پیش میاد هس
اولیش بر میگرده به اینکه تویه header الگوریتم encode کردنش none باشه و بعد یوزر رو هم ادمین کنین

دومیش هم با jwt_tool میشه secret که باهاش encode شده رو بدست آورد:

 python3 jwt_tool.py "jwt_token" -C -d /usr/share/wordlists/rockyou.txt  

و بعد بدست آوردن secret :
 python3 jwt_tool.py "JWT_token" -T -S hs512 -p "{secret}"

و تویه سومی هم که جذاب بود این بود که وقتی توکن رو ارسال می‌کرد سریع منقضی میشد و وارد بلک لیست میشد
ولی نکته اینجا بود که خود توکن وارد بلک لیست میشد نه آی دی json ! ( یه ای دی داشت واسه اینکه جلوی چند بار درخواست با اون توکن رو بگیره )
حالا میشه دو تا توکنی پیدا کرد که دقیقا Decode شدش مث هم باشه ولی دو تا ای دی جدا بده و حالا از بلک لیست خارج میشیم. یه همچین چیزی :
(×××.×××.×××) ==== (×××.×××.×××=)
( ینی توکن هسن 🦦)
در واقع decode شده ی =××× با ××× برابر هس.
1
ارسال به ایمیل کاربر برای مواقعی مثل Reset Pass :
const nodemailer = require('nodemailer');
const crypto = require('crypto');

const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'x@gmail.com', // Replace with your email
pass: 'pass' // Replace with your app password as Google Account Security
}
});

// function for create pass token
function generateStrongPassword(){
return new Promise((resolve, reject) => {
crypto.randomBytes(32, (err, buffer) => {
if (err) {
reject(err);
} else {
const token = buffer.toString('hex');
resolve(token);}
});
});
}
router.get('/forget_pass' , async(req , res) => {
res.render('forget_password')
})

router.post('/forget_pass' , async(req , res) => {

const {email} = req.body ;
const user = await userModel.findOne({ where: { email } }); // find user
if (user){
const token = await generateStrongPassword() ;
// add in file {forget.pass.model.js}
console.log(token)
await ResetPassword.create({
email: user.email ,
token : token ,
expire: Date.now() + 3600000
})
const resetUrl = `http://localhost:8000/auth/forget_pass/${token}`;
const mailOptions = {
from: 'x@gmail.com',
to: user.email,
subject: 'Password Reset Request',
html: `
<h1>Password Reset Request</h1>
<p>You requested a password reset. Click the link below to reset your password:</p>
<a href="${resetUrl}" style="
...
">Reset Password</a>
<p>This link will expire in 1 hour.</p>

`
};
await transporter.sendMail(mailOptions);
res.send("Email sent");

console.log(token)
}
else{
res.redirect('/auth/login')
}
})
👍41