
掌握ChatGPT插件與自定義GPT
破壞的訪問控制包含一組已知漏洞,可能對您的系統對資源訪問的控制構成威脅。
盡管許多訪問控制漏洞如果被忽視很容易被利用,但你可以相對快速地解決它們。這一點很重要,因為訪問控制被破壞的后果可能非常具有破壞性——攻擊者基本上可以接管你的系統。
正如我們之前的文章所提到的,攻擊者可以利用多種漏洞,具體取決于您的技術堆棧和架構。但是,在本文中,為了簡潔起見,我們僅關注不安全的 ID、路徑遍歷、文件權限和客戶端緩存。
下面讓我們重新認識一下訪問控制的常見漏洞。
大多數現代網站都使用某種形式的 ID 或索引來快速高效地引用數據。在大多數情況下,這種方法效果令人滿意。但是,如果 ID 很容易被破解,無論是手動破解還是暴力破解,那么你就有安全問題了。
為了說明這一點,假設您有一個個人資料頁面部分,其中顯示用戶個人資料。
現在,如果我手動更改查詢字符串中的數字,并且沒有主動訪問控制來驗證我的請求,那么我就可以訪問任何配置文件。
路徑遍歷的概念定義了用戶自由瀏覽文件系統目錄樹的能力。??
缺乏適當訪問控制的系統可能會成為路徑遍歷漏洞的受害者,并允許攻擊者訪問服務器中受限的資源。
當系統允許用戶檢索資源路徑,攻擊者修改資源路徑,而系統未充分驗證修改時,就會發生這種情況。
如果攻擊者將user.png更改為類似../../etc/passwd 的內容,他們就可以訪問應用程序的秘密。
文件權限漏洞與授予特定用戶訪問服務器上特定文件的權限機制中的弱點有關。
所有 Web 應用程序都包含關鍵配置文件和資源,這些文件和資源應保密,不向用戶開放。然而,當應用程序缺乏適當的配置策略時,攻擊者就可以攻擊這些文件并控制整個平臺。
客戶端緩存漏洞很難解決,因為它們需要攻擊者物理接管用戶的計算機。然而,惡意行為者不是遠程攻擊,而是利用會話憑據、緩存頁面或已存在于經過身份驗證的客戶端瀏覽器中的數據。一旦發生這種情況,攻擊者就已攻陷服務器并可以訪問用戶數據。游戲結束。
不幸的是,Node.js 沒有提供原生方式來實現強大的 Web 應用程序身份驗證系統。因此,我們需要自己實現它。在這種情況下,我們將使用Auth0來實現身份驗證,作為具有強大且可靠的第三方解決方案的?單點登錄服務(?SSO 服務) 。此外,我們將使用Passport作為我們的中間件庫來處理身份驗證和授權過程。?
進入 Auth0 儀表板后,轉到“應用程序”部分并單擊“創建應用程序”按鈕。輸入應用程序的名稱,并確保選擇常規 Web 應用程序作為應用程序類型。
最后,單擊“創建”按鈕。
創建應用程序后,轉到“設置”選項卡并獲取您的 Auth0域和客戶端 ID。然后,將允許的回調 URL設置為http://localhost:3000/oauth2/redirect,將允許的注銷 URL設置為http://localhost:3000/。
第一個 URL 告訴 Auth0 在身份驗證后將用戶重定向到哪里,第二個 URL 告訴 Auth0 在注銷后將用戶重定向到哪里。
最后,保存您的更改。
現在,在您的項目中,轉到您的.env文件(如果您還沒有, 請使用touch .env命令創建一個)并添加以下鍵。
AUTH0_DOMAIN=__INSERT_DOMAIN_HERE__
AUTH0_CLIENT_ID=__INSERT_CLIENT_ID_HERE__
AUTH0_CLIENT_SECRET=__INSERT_CLIENT_SECRET_HERE__
完成后,繼續使用以下命令安裝護照中間件:
$ npm install passport
$ npm install passport-openidconnect
$ npm install express-session
$ npm install connect-sqlite3
接下來,在routes 文件夾中創建一個名為auth.js的類文件,并添加以下代碼:
var OpenIDConnectStrategy = require('passport-openidconnect');
passport.use(new OpenIDConnectStrategy({
issuer: 'https://' + process.env['AUTH0_DOMAIN'] + '/',
authorizationURL: 'https://' + process.env['AUTH0_DOMAIN'] + '/authorize',
tokenURL: 'https://' + process.env['AUTH0_DOMAIN'] + '/oauth/token',
userInfoURL: 'https://' + process.env['AUTH0_DOMAIN'] + '/userinfo',
clientID: process.env['AUTH0_CLIENT_ID'],
clientSecret: process.env['AUTH0_CLIENT_SECRET'],
callbackURL: '/oauth2/redirect',
scope: [ 'profile' ]
},
function verify(issuer, profile, cb) {
return cb(null, profile);
}));
passport.serializeUser(function(user, cb) {
process.nextTick(function() {
cb(null, { id: user.id, username: user.username, name: user.displayName });
});
});
passport.deserializeUser(function(user, cb) {
process.nextTick(function() {
return cb(null, user);
});
});
var express = require('express');
var qs = require('querystring');
var router = express.Router();
router.get('/login', passport.authenticate('openidconnect'));
router.get('/oauth2/redirect', passport.authenticate('openidconnect', {
successRedirect: '/',
failureRedirect: '/login'
}));
module.exports = router;
當用戶點擊登錄按鈕時,系統會將其重定向到由 Auth0 托管的應用登錄頁面,用戶將在此登錄。
登錄后,Auth0 會將用戶重定向到您的應用程序。
現在,我們需要將身份驗證路由添加到我們的應用程序。
進入app.js類,修改代碼如下:
var indexRouter = require('./routes/index');
var authRouter = require('./routes/auth');
var logger = require('morgan');
var session = require('express-session');
var passport = require('passport');
var SQLiteStore = require('connect-sqlite3')(session);
///...
app.use('/', indexRouter);
app.use('/', authRouter);
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false,
store: new SQLiteStore({ db: 'sessions.db', dir: './var/db' })
}));
app.use(passport.authenticate('session'));
這應該添加了身份驗證所需的所有代碼。現在我們可以繼續執行它。
對于Express.js來說,以下路由體現了不受保護的端點,因為它不強制執行任何身份驗證:
app.post('/admin', function (req, res) {
// ADMIN AREA
});
此端點對所有人開放,并且必須受到某種身份驗證機制的保護。
值得慶幸的是,Express.js 允許你將身份驗證機制實現為中間件。因此,保護??此端點的直接方法如下:
function authenticate(req, res, next) {
if (!req.session.isLoggedIn) {
res.redirect('/index.html');
} else {
next();
}
}
您也可以直接在路由中插入身份驗證,如下所示:
app.post('/admin', authenticate, function (req, res) { /***/ });
就是這樣。
鑒于大多數訪問控制緩解措施在所有技術堆棧中都是標準的,讓我們簡要回顧一下我們在之前關于這個主題的文章中已經為各種漏洞確定的內容。
不安全的 ID:您可以通過將全局唯一標識符號( GUID)實現為 ID 來輕松實現此解決方案。您必須盡早考慮到此漏洞來開發系統。所有 ID(或屬于敏感資源的 ID)都必須經過混淆且唯一。
路徑遍歷:路徑遍歷緩解需要驗證所有用戶輸入并限制對關鍵資源的訪問。幸運的是,得益于Spring Security等庫的強大功能,您無需做太多工作即可實施正確的路徑遍歷策略。
文件權限:除非您需要修改服務器權限并添加與文件操作相關的功能,否則您無需做太多工作來確保文件權限安全。不過,如果您需要進一步的說明,請咨詢您的服務器管理員。
客戶端緩存:在這種情況下,最有效的解決方案也是最簡單的。不要將敏感的用戶信息存儲在客戶端瀏覽器中。但是,如果由于需求而必須嘗試復雜的功能,請實施適當的 HTML 元標記和異步驗證以在頁面加載時確認權限。
隨著時間的推移,威脅變得越來越普遍和危險。為了緩解威脅并確保用戶的安全,軟件公司不斷采用更復雜、更強大的解決方案。作為開發人員,我們有責任確保充分利用可用的解決方案,保護我們的平臺免受網絡上不良行為者的侵害。
此外,確保我們平臺的穩定性和用戶信息的安全是一個關鍵問題,而且隨著時間的推移它會變得越來越復雜和敏感。
文章來源:NodeJS Broken Access Control Guide: Examples and Prevention