2013-08-18 31 views
4

我有一個有趣的情況,我試圖選擇sql server表中的所有內容,但我只需要通過舊的公司API而不是SQL訪問表。該API要求提供表名稱,字段名稱和值。然後,它插入相當簡單了這種方式:選擇表中的所有內容...用where語句

select * from [TABLE_NAME_VAR] where [FIELD_NAME_VAR] = 'VALUE_VAR'; 

我不能等號(=)更改爲=或其他任何東西,只有那些瓦爾!我知道這聽起來很糟糕,但是我不能在沒有經歷很多麻煩的情況下更改API,這是我必須處理的。

此表中有多列都是數字,所有字符串,並設置爲非空。是否有值我可以通過這個API函數,將返回表中的所有內容?也許是一個常量或特殊值,這意味着它是一個數字,它不是一個數字,它是一個字符串,*,它不是空的,等等?有任何想法嗎?

+3

SQL注入可能是你應該看看的東西。假設你可以做你想做的事情。否則,你可能會做一些非法的事情。 – asafreedman

+3

我同意。如果此API允許修改參數以更改語句的邏輯,則允許從表中刪除或刪除 –

+3

您可以嘗試爲'1'(或任何其他常量)分配'FIELD_NAME_VAR'以產生'WHERE 1 = 1',和'VALUE_VAR'爲'1'(相同的常量)。取決於你的API如何實現它可能會或可能不會工作。 – peterm

回答

2

您可以嘗試通過這種VALUE_VAR

1'' or ''''='' 

如果它原樣使用和執行的動態SQL應該導致

SELECT * FROM tab WHERE fieldname = '1' or ''='' 
+0

輝煌。看起來很簡單,我不知道爲什麼我沒有想到它!這工作!謝謝! – dallin

+0

@dallin - 這實際上起作用的事實表明,API構造不正確,並且對可能更惡意的SQL注入(例如「DROP TABLE」語句)開放。 –

+0

@MartinSmith謝謝。我在想這個問題可以用作可能的SQL注入攻擊的參考!幸運的是,就我而言,這是一個內部公司API,不應該向公衆開放來嘗試這些攻擊。 – dallin

2

這裏是一個簡單的例子, 希望它可以幫助

declare @a varchar(max) 
set @a=' ''1'' or 1=1 ' 

declare @b varchar(max) 
set @b=('select * from [TABLE_NAME_VAR] where [FIELD_NAME_VAR]='[email protected]) 
exec(@b) 
5

沒有API是否正確構建,這是不可能的。

但是,如果這是一些家庭成長的東西,它可能不是。你可以嘗試進入YourTable]--作爲價值TABLE_NAME_VAR這樣,當插入查詢作爲

select * from [YourTable]--] where [FIELD_NAME_VAR] = 'VALUE_VAR'; 

結束了。如果]被拒絕或正確轉義(由它加倍),這將不但是工作。

+0

這實際上並不適用於我,但如果API沒有通過函數首先運行表名稱,並且如果它找不到表格,則會引發錯誤。這絕對是最好的選擇,因爲圍繞字段名稱的括號和圍繞該值的單引號使所有其他建議失敗。謝謝! – dallin

2

如果你的API允許列名,而不是恆定的,

select * from [TABLE_NAME_VAR] where [FIELD_NAME_VAR] = [FIELD_NAME_VAR] ; 
+0

如果允許這樣做並且列'[FIELD_NAME_VAR]'不可爲空,它確實會返回所有行。 –

+0

不幸的是,FIELD_NAME_VAR包含在單引號中,而不是括號。這令人遺憾地使這種方法無效,因爲它將值轉換爲字符串而不是列名。 – dallin