我正在閱讀有關SQL注入的內容,並看到了這一點,這使我開始思考:
輸入字段應盡可能小,以減少黑客將SQL代碼壓入該字段的可能性不會被截斷(通常會導致T-SQL語法錯誤)。
來源: Microsoft SQL Server 2008 R2釋放
SQL注入會造成損害的最短字段大小是多少?
損害是數據庫修改或返回設計所不希望的結果。在兩個字符字段中包含結束註釋標記(-
)不會造成危害,只會導致查詢失敗。潛在的黑客可能會知道該領域容易受到注入,但他們無法利用它。
我正在閱讀有關SQL注入的內容,並看到了這一點,這使我開始思考:
輸入字段應盡可能小,以減少黑客將SQL代碼壓入該字段的可能性不會被截斷(通常會導致T-SQL語法錯誤)。
來源: Microsoft SQL Server 2008 R2釋放
SQL注入會造成損害的最短字段大小是多少?
損害是數據庫修改或返回設計所不希望的結果。在兩個字符字段中包含結束註釋標記(-
)不會造成危害,只會導致查詢失敗。潛在的黑客可能會知道該領域容易受到注入,但他們無法利用它。
在沒有上下文的情況下,我將假定作者引用的是客戶端應用程序中的輸入字段。最簡單的示例是Web應用程序中HTML頁面中的表單,儘管我要描述的內容實際上對任何類型的客戶端應用程序都是有效的。
鑑於此,答案是不,沒有最大輸入字段長度足夠短以保護您免受SQL注入,因為您無法控制最大輸入字段長度。攻擊者可以。當包含輸入字段的表單駐留在客戶端上時(例如在攻擊者計算機上的瀏覽器窗口中),它不在信任範圍之內,並且不受您的控制。可以以攻擊者想要或需要的任何方式對其進行操作,或者完全避免。記住,對於Web應用程序,您得到的只是一個HTTP請求。您不知道它是如何創建的,也沒有理由相信您要求瀏覽器執行的任何操作實際上是在發生的,任何客戶端安全控件都已在運行,請求中的任何內容都是
因此,輸入字段長度不是有效的SQL注入預防機制,並且永遠不要信任未經安全驗證跨越安全邊界的輸入。
不,沒有太短而無法利用的長度(至少在某些情況下)。
長度過濾器不是防止SQL注入的有效保護措施,而準備好的語句實際上就是
長度過濾器是深度防禦的好方法(整數過濾器,字母數字過濾器等)。在許多情況下,例如有效輸入絕不能超過30個字符,但是有意義的利用需要更多的字符。應該(但可能不是)不用說,任何過濾作為深度防禦都必須在服務器端進行,因為任何客戶端都可以簡單地繞過。
限制繞過
限制子句(例如, AND
/ OR
)可以繞過兩個字符,這會造成真正的傷害,而不僅僅是查詢失敗。最簡單的示例是登錄(其他示例是未經授權的其他數據刪除):
SELECT * FROM users WHERE userid = [id] AND password = [password]
注入:
id = 1#password =錯誤密碼
有效載荷:2個字符
DoS
DoS攻擊只需要很少的字符。在一個MySQL示例中,實際調用花費7,在給定的秒數內x,加上調用該函數和修復查詢所需的一切。
示例:
SELECT * FROM users WHERE userid = [id]
注入(這是有效的注入,較長的形式為 1 AND sleep(99)
):
sleep(99)
有效載荷:9個字符
如果有數據在顯示時,長度主要取決於表和列的名稱。我將假定所有表的列數相等(這可能會發生,並且會保存字符)。
示例:
SELECT *來自評論,其中commentid = [id]
注入:
1個並集選擇*從用戶
有效載荷:27個字符。
未經授權的數據庫修改也可以用很少的字符完成。
示例:
UPDATE用戶SET password ='[password]'WHERE id = [id]
注入(輸入密碼):
',isadmin ='1
有效載荷:12個字符
限制繞過也會起作用(結果是所有密碼現在為空*):
'#
有效載荷:2個字符
*密碼示例是為了簡化起見;應該對密碼進行哈希處理,以使該示例變得不可能。該示例仍適用於所有類似情況(更新用戶名,更新權限等) sub>
輸入字段應盡可能小,以減少黑客將SQL代碼壓縮到該字段中而不被截斷的可能性(通常會導致T-SQL語法錯誤)。
恕我直言,這只是狗屎。可怕的建議是使用輸入字段的長度來防止SQL注入:
否。
考慮查詢:
從tweets中選擇* WHERE RowNum > = [offset] AND RowNum < [offset] + [limit]
如果您可以為 offset
注入單個非整數(例如,字母“ a”),則查詢將產生語法錯誤,並且不會顯示任何帖子,導致您提出“設計未預期的結果”以引起損壞。如果您可以注入一個空字符串,則有效載荷長度為零的效果相同。注入結束註釋將浪費兩個字符;)
攻擊者可以在拒絕服務攻擊中利用這一點(不同於通常與DoS相關的網絡氾濫,仍然是 DoS)。取決於被拒絕的服務,這可能是災難性的。
其他答案表明,字段長度與SQL注入影響無關。如 OWASP SQL注入預防速查表所述,準備好的,參數化的語句是處理方法。
否。
一個單字符SQL注入的簡單示例:
`
它將引發錯誤,將是“返回非設計意圖的結果”的示例。很多時候,錯誤可以被用來獲取信息,這將在以後的攻擊中有所幫助。
是。
最大長度為零。通過最大長度確保不受信任的輸入安全而不進行其他驗證或檢查的唯一方法是完全忽略從索引0開始的輸入。
這裡還有許多其他(更好的)答案,但是這個可以回答理論上的問題,即當場長是您唯一可用的工具時,如何保持安全。
字段的長度與SQL注入無關,因為這種攻擊只需要註釋掉先前的代碼並啟動攻擊代碼即可,因此任何字段的長度都不會影響此策略。 / p>
這裡有很多理論,但沒有實際例子。當我發現一個真實的sql注入漏洞(現已修復)時,我嘗試使用大約30個字符長的輸入字段。這讓我很沮喪,因為我花了一段時間才弄清刪除了30個字符後的所有內容,而30個字符並沒有給我留下太多的空間。
(許多sql注入示例都具有簡單的sql“例如select * from id = @id的表”,現實世界中的sql通常會復雜得多)
您可以獲得看中了您的輸入,SQL專家可能會使用一些技巧來減少有效負載計數。但是,如果您要選擇一些較長的表名,那麼無論您多麼棘手,都將需要很多字符。
無論如何,當我切換到使用超過1000個字符的輸入字段時,我發現有很多用於sql注入的方法。
就像我上面的許多評論者所說的那樣,針對sql注入的最佳防禦方法是準備好的語句