弱點風險
- Checkmarx 弱點掃描掃出,使用 DirectorySearcher 建立 LDAP 查詢句,其中 search.Filter 使用沒有被處理過不受信任的字串,可能會有被注入攻擊的機會。
DirectorySearcher search = new DirectorySearcher(directoryEntry); // 搜尋 AD 帳號名稱為 USER_ID 的項目 search.Filter = "(SAMAccountName=" + Obj.USER_ID + ")";
- 這邊在 AntiXSS 4.0 Released 程式庫中有提供 LDAP Encoding changes 的方法,可以透過 Encode 的方式將字串轉義,來避免 LDAP Injection。
- 開啟 NuGet 套件管理員,搜尋並安裝 AntiXSS 。
- 其中針對 LDAP 有提供了三個方法
- Encoder.LdapFilterEncode(string):
- 用於編碼 LDAP 查詢過濾器中的值,如 (、)、*、\、/、NUL 等特殊字符。
- 會對這些特殊字符進行轉義,轉義為 LDAP 查詢語法中的安全表示形式。
- Encoder.LdapDistinguishedNameEncode(string):
- Distinguished Name(DN)在創建或修改LDAP條目時使用的屬性值。
- 用於編碼LDAP分類名稱(DN)中的值,如 ,、=、+、<、>、#、;、\。
- 會對這些特殊字符進行轉義,轉義成為LDAP DN中的安全表示形式。
- Encoder.LdapDistinguishedNameEncode(string, bool, bool):
- 這個重載方法允許你指定額外的參數來控制編碼的行為。
- 第一個參數是要編碼的字符串。
- 第二個參數,用於指示是否編碼域(即 @ 後面的部分)中的特殊字符。
- 設置為 true,則會對域中的特殊字符進行轉義,默認為 false。
- 第三個參數,用於指示是否編碼空格。
- 設置為 true,則會對空格進行轉義,默認為 true。
- 設置為 true,則會對空格進行轉義,默認為 true。
- Encoder.LdapFilterEncode(string):
- 通過使用 Encoder.LdapFilterEncode 方法對變數進行編碼,可以有效地解決潛在的弱點風險。
using Microsoft.Security.Application; DirectorySearcher search = new DirectorySearcher(directoryEntry); // 對字串編碼 string filteredUserId = Encoder.LdapFilterEncode(Obj.USER_ID); // 搜尋 AD 帳號名稱為 USER_ID 的項目 search.Filter = "(SAMAccountName=" + filteredUserId + ")";