解析ADO.NET連接字符串注入式攻擊
ADO.NET連接字符串還是比較常用的,于是我研究了一下ADO.NET連接字符串生成器,在這里拿出來和大家分享一下,希望對大家有用。在 ADO.NET 的早期版本中,不會對具有串聯(lián)字符串值的連接字符串進(jìn)行編譯時檢查,因此在運(yùn)行時,不正確的關(guān)鍵字會產(chǎn)生 ArgumentException。每個 .NET Framework 數(shù)據(jù)提供程序支持的連接字符串關(guān)鍵字的語法不同,這使得手動構(gòu)造有效連接字符串變得很困難。為了解決這個問題,ADO.NET 2.0 為每個 .NET Framework 數(shù)據(jù)提供程序引入了新的連接字符串生成器。每個數(shù)據(jù)提供程序包括一個從 DbConnectionStringBuilder 繼承的強(qiáng)類型連接字符串生成器類。下表列出了 .NET Framework 數(shù)據(jù)提供程序及其關(guān)聯(lián)的ADO.NET連接字符串生成器類。
- ConnectionStringBuilder 類
- System.Data.SqlClient
- SqlConnectionStringBuilder
- System.Data.OleDb
- OleDbConnectionStringBuilder
- System.Data.Odbc
- OdbcConnectionStringBuilder
- System.Data.OracleClient
- OracleConnectionStringBuilder
連接字符串注入式攻擊
#T#當(dāng)使用動態(tài)字符串串聯(lián)根據(jù)用戶輸入生成連接字符串時,可能發(fā)生連接字符串注入式攻擊。如果未驗(yàn)證字符串并且未轉(zhuǎn)義惡意文本或字符,則攻擊者可能會訪問服務(wù)器上的敏感數(shù)據(jù)或其他資源。例如,攻擊者可以通過提供分號并追加其他值來發(fā)起攻擊。連接字符串通過“l(fā)ast one wins”算法分析,惡意的輸入被替換為合法的值。連接字符串生成器類旨在排除推測,防止出現(xiàn)語法錯誤和安全漏洞。它們提供與每個數(shù)據(jù)提供程序允許的已知鍵/值對相對應(yīng)的方法和屬性。每個類都保持一個固定的同義詞集合,可以將同義詞轉(zhuǎn)換為相應(yīng)的已知鍵名。將執(zhí)行鍵/值對的有效性檢查,無效對會引發(fā)異常。此外,還會以一種安全方式處理插入的值。
下面的示例演示 SqlConnectionStringBuilder 如何處理為 Initial Catalog 設(shè)置插入的額外值。
Visual Basic
- Dim builder As New System.Data.SqlClient.SqlConnectionStringBuilder
- builder("Data Source") = "(local)"
- builder("Integrated Security") = True
- builder("Initial Catalog") = "AdventureWorks;NewValue=Bad"
- Console.WriteLine(builder.ConnectionString)
C#
- System.Data.SqlClient.SqlConnectionStringBuilder builder =
- new System.Data.SqlClient.SqlConnectionStringBuilder();
- builder["Data Source"] = "(local)";
- builder["integrated Security"] = true;
- builder["Initial Catalog"] = "AdventureWorks;NewValue=Bad";
- Console.WriteLine(builder.ConnectionString);
輸出結(jié)果表明,通過用雙引號轉(zhuǎn)義該額外值而不作為新的鍵/值對將其追加到連接字符串,SqlConnectionStringBuilder 可以正確處理此額外值。
- data source=(local);Integrated Security=True;
- initial catalog="AdventureWorks;NewValue=Bad"