در عصر دیجیتال، اسکرپینگ وب یکی از ابزارهای کلیدی برای استخراج دادههای مفید از وبسایتها است. در بسیاری از موارد، زیردامنههای یک دامنه اصلی منابع قابل توجهی از اطلاعات را شامل میشوند. علاوه بر این، تنظیمات نادرست CORS میتواند منجر به نشت دادهها یا ارائه دسترسیهای ناخواسته به منابع شود. در این مقاله، ما یک اسکریپت پیشرفته را معرفی میکنیم که با استفاده از Node.js قادر است زیردامنهها را شناسایی کرده، اطلاعات مورد نظر را استخراج کرده و تنظیمات نادرست CORS را بررسی کند.
یک مکانیزم امنیتی است که به سرورها اجازه میدهد مشخص کنند کدام دامنهها مجاز به دسترسی به منابعشان هستند. این مکانیزم برای جلوگیری از حملات Cross-Origin استفاده میشود که در آن مهاجم میتواند از یک دامنه غیرمجاز به دادههای یک سرور دسترسی پیدا کند.
تنظیمات نادرست CORS
زمانی که تنظیمات CORS به درستی پیکربندی نشده باشد، سرور میتواند به درخواستهای غیرمجاز از دامنههای خارجی پاسخ دهد. این موضوع میتواند منجر به نشت اطلاعات یا سوءاستفاده از منابع شود. نمونهای از تنظیمات نادرست:
http
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
مشکل:
- Access-Control-Allow-Origin: *
به تمام دامنهها اجازه دسترسی میدهد.
- Access-Control-Allow-Credentials: true
باعث میشود کوکیها و اطلاعات حساس به دامنههای غیرمجاز ارسال شوند.
ویژگیهای اسکریپت
1. شناسایی زیردامنهها:
- شناسایی زیردامنهها با استفاده از ابزار Subfinder.
2. اسکرپینگ داده:
- ارسال درخواست به زیردامنهها برای جمعآوری دادههای HTML و JSON.
3. بررسی تنظیمات CORS:
- شناسایی زیردامنههایی که تنظیمات CORS نادرست دارند.
4. گزارشدهی:
- ذخیره نتایج به صورت فایل JSON.
کد Node.js برای اسکرپینگ پیشرفته و بررسی CORS
const axios = require('axios');
const { exec } = require('child_process');
const fs = require('fs');
// پیدا کردن زیردامنهها با استفاده از Subfinder
async function findSubdomains(domain) {
return new Promise((resolve, reject) => {
console.log(`[+] Running Subfinder for ${domain}...`);
exec(`subfinder -d ${domain}`, (error, stdout, stderr) => {
if (error) {
return reject(`Error finding subdomains: ${error.message}`);
} else if (stderr) {
return reject(`Subfinder error: ${stderr}`);
} else {
const subdomains = stdout.split('\n').filter(Boolean); // فیلتر کردن خطوط خالی
console.log(`[+] Found ${subdomains.length} subdomains.`);
return resolve(subdomains);
}
});
});
}
// بررسی تنظیمات CORS
async function checkCors(url) {
console.log(`[+] Checking CORS for ${url}`);
try {
const response = await axios.get(url, {
headers: { 'Origin': 'http://evil.com' },
timeout: 5000,
});
const corsHeader = response.headers['access-control-allow-origin'];
const credentials = response.headers['access-control-allow-credentials'];
if (corsHeader === '*' || (corsHeader === 'http://evil.com' && credentials === 'true')) {
console.log(`[!] Vulnerable CORS configuration found on ${url}`);
return { url, vulnerable: true, corsHeader, credentials };
} else {
console.log(`[-] No CORS misconfiguration on ${url}`);
return { url, vulnerable: false };
}
} catch (error) {
console.log(`[!] Error checking CORS for ${url}: ${error.message}`);
return { url, vulnerable: false, error: error.message };
}
}
// ارسال درخواست برای اسکرپینگ
async function scrapeData(url) {
console.log(`[+] Scraping data from ${url}`);
try {
const response = await axios.get(url, { timeout: 5000 });
console.log(`[+] Data retrieved from ${url}`);
return { url, data: response.data };
} catch (error) {
console.log(`[!] Error scraping ${url}: ${error.message}`);
return { url, data: null, error: error.message };
}
}
// مدیریت فرآیند اصلی
async function main(domain) {
console.log(`[+] Starting Scraping Process for ${domain}`);
// شناسایی زیردامنهها
let subdomains;
try {
subdomains = await findSubdomains(domain);
} catch (error) {
console.error(`[!] Error finding subdomains: ${error}`);
return;
}
// اسکرپینگ و بررسی CORS برای هر زیردامنه
const results = [];
for (const subdomain of subdomains) {
const urls = [`http://${subdomain}`, `https://${subdomain}`];
for (const url of urls) {
const corsResult = await checkCors(url);
if (corsResult.vulnerable) {
results.push(corsResult);
}
const scrapeResult = await scrapeData(url);
results.push(scrapeResult);
}
}
// ذخیره نتایج
console.log(`[+] Saving results to scraping_results.json`);
fs.writeFileSync('scraping_results.json', JSON.stringify(results, null, 2));
}
// اجرای اسکریپت
const domain = process.argv[2];
if (!domain) {
console.error('Usage: node scraper.js <domain>');
process.exit(1);
}
main(domain);
نمونه خروجی:
فایل خروجی scraping_results.json به شکل زیر خواهد بود:
json
[
{
"url": "http://subdomain1.example.com",
"vulnerable": true,
"corsHeader": "*",
"credentials": "true"
},
{
"url": "https://subdomain2.example.com",
"data": "<html><head>...</head><body>...</body></html>"
}
]
این اسکریپت به صورت همزمان میتواند زیردامنهها را شناسایی، دادههای قابل استفاده را استخراج، و تنظیمات CORS را بررسی کند. توانایی شناسایی تنظیمات نادرست CORS به شما کمک میکند تا از منابع آسیبپذیر برای بهبود امنیت یا استخراج اطلاعات ساختارمند استفاده کنید. با این حال، اطمینان حاصل کنید که اسکرپینگ و بررسیهای انجام شده قانونی و اخلاقی هستند.