/dev/null
前往频道在 Telegram
| دستمو گذاشتم رو این کار ، قلبمو گذاشتم. | هر new ای را delete ای ست و پس از آن null کردنی (:
显示更多323
订阅者
无数据24 小时
+37 天
+230 天
帖子存档
323
فرض کنین بخوایم یه فایل 1 گیگ رو از سرور بخونیم و بدیم به کاربر و بخوایم به صورت ناهمزمان که قبلا گفتم ، اطلاعات فایل رو بفرستیم ( به این صورت
fs.readFile )
حالا اگه سرور، Ram کمتر از یه گیگ داشته باشه کرش میکنه
اینجا stream ها میان کمک و داده ها رو به صورت chunk chunk ( بخش بخش ) میفرستیم و سریع اطلاعات پردازش میشن و اینطوری دیگه ram پر نمیشه و مستقیم به کلاینت ارسال میشن .
مثالشم :
const http = require('http');
const fs = require('fs');
http.createServer((req, res) => {
const stream = fs.createReadStream('bigfile.txt', { encoding: 'utf8' });
stream.pipe(res);
}).listen(3000, () => console.log('httplocalhost:8080'));
اینجا stream.pipe میاد مستقیم اطلاعات رو به کلاینت میده .323
ارسال به ایمیل کاربر برای مواقعی مثل 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')
}
})323
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 شده ی =××× با ××× برابر هس.323
Repost 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
323
+1
واسم سوال بود درباره فرق udp و tcp و اینکه چطوری کار میکنن
میدونسم که tcp هر بار واسه ارسال داده tree handshake میزنه ولی udp نه !
واسه همین هم هس که udp سریع تر tcp هس
تویه tcp عملا Tree handshake با server.listen و client.send رخ میده واسه هر بار دیتا فرستادن ولی تویه udp تضمین واسه رسیدن دیتا نیس
درسته تویه udp هربار واسه فرستادن دیتا میاد یه ip , port میگیره ولی زمانش به اندازه tcp نیس .
عکس بالایی واسه tcp و پایینی udp
323
بعضی از وب سایتا هم فقط 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 که مال یه کاربر عادیه تغییر کنه
323
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
323
ChatGPT Crawler Vulnerability
Unauthenticated Reflective Distributed Denial of Service (DDoS)
https://github.com/bf/security-advisories/blob/main/2025-01-ChatGPT-Crawler-Reflective-DDOS-Vulnerability.md
323
منم کلافه شده بودم رفتم سرچ کنم ببینم چه خبره 🦦
رفتم یه سرچ زدم چون اصن همچین مسیری طبق پست برای من نبود
اول باید ببینیم سیستم از چه سرویس مدیریت شبکه ای استفاده میکنه
چطوری ؟
$ 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 NetworkManager323
Repost from N/a
اگر از لینوکس استفاده میکنید احتمالا پیش اومده هرچقدر فایل 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
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
