在這里,用戶可以從兩個分別以6902和5586為結(jié)尾的卡中選擇一個,該卡號由數(shù)據(jù)庫的關(guān)鍵字引用,而應(yīng)用程序可以訪問此數(shù)據(jù)庫文件。因此,黑客可以將56或88改為另一個數(shù)字,如78,用來引用屬于另外一個用戶的卡號。如果沒有其它的認(rèn)證檢查來防止這種引用,攻擊將獲得成功。
避免不安全的直接對象引用
避免不安全的直接對象引用(DOR)漏洞的最佳方法是,完全不要暴露私密的對象引用,但如果非用不可,非常重要的一點是確保在向任何用戶提供訪問之前對其進(jìn)行認(rèn)證和審查。全球頂級的Web應(yīng)用安全機(jī)構(gòu)OWASP建議企業(yè)建立一種引用應(yīng)用程序?qū)ο蟮臉?biāo)準(zhǔn)方法,現(xiàn)簡述如下:
1、盡可能避免將私密的對象引用暴露給用戶,如重要的關(guān)鍵字或文件名。
2、運用一種“可接受的良好方法”,詳細(xì)地驗證任何私密的對象引用。決定準(zhǔn)許用戶訪問哪些文件,并僅授與這些用戶訪問這些文件的權(quán)力。
3、對所有引用的對象都要進(jìn)行驗證。
OWASP還提供了第三個要點的一個例子。在此,黑客可以將電子商務(wù)網(wǎng)站的購物車ID參數(shù)改為任何值:
int cartID = Integer.parseInt( request.getParameter( "cartID" ) );
String query = "SELECT * FROM table WHERE cartID=" + cartID;
要想防止受到這種攻擊,就只能允許獲得授權(quán)的記錄可以顯示:
int cartID = Integer.parseInt( request.getParameter( "cartID" ) );
User user = (User)request.getSession().getAttribute( "user" );
String query = "SELECT * FROM table WHERE
cartID=" + cartID + "AND userID=" + user.getID();
直接對象引用的另外一種選擇是每個用戶或會話都使用非直接的對象引用。
在前面那個關(guān)于信用卡的例子中,用戶需要從兩個卡中選擇一個信用卡,這會暴露對信用卡數(shù)據(jù)庫的直接引用。一個更好的方法是將這兩個信用卡的記錄存儲到一個針對此用戶的特定陣列中。關(guān)于信用卡的選擇,其代碼類似于下面的內(nèi)容:

在這種方法中,僅有對此用戶陣列的一個直接引用,它僅包含此用戶的數(shù)據(jù)。將選項的值改為大于2的任何值不會導(dǎo)致其他用戶的信用卡細(xì)節(jié)被利用。然后,應(yīng)用程序?qū)延脩舻奶囟ǖ姆侵苯訉ο笠?選項值為1或2)映射回底層的數(shù)據(jù)庫關(guān)鍵字(前面例子中的56和88)
對不安全的直接對象引用的測試
不幸的是,漏洞掃描器在發(fā)現(xiàn)不安全的直接對象引用漏洞方面并不是很高效,所以最佳的選擇是:
1、仔細(xì)檢查代碼,確認(rèn)是否有重要的參數(shù)易于遭到利用和操縱。
2、經(jīng)常實施專業(yè)的滲透測試。
中國太保林春:金融數(shù)據(jù)庫及業(yè)務(wù)場景AI應(yīng)用實踐
從市場需求看2025年存儲行業(yè)發(fā)展
賽迪顧問舉辦“2025年IT趨勢”發(fā)布會
【直播預(yù)告】多場景數(shù)據(jù)庫選型,中小企業(yè)的數(shù)字化轉(zhuǎn)型必修課
數(shù)據(jù)庫選型看這里!騰訊云原生數(shù)據(jù)庫案例實踐集值得參考
3年增長400%,阿里云PolarDB引領(lǐng)云原生數(shù)據(jù)庫創(chuàng)新