4

我有一个有趣的情况,我试图选择 sql server 表中的所有内容,但我只需要通过旧的公司 API 而不是 SQL 访问表。该 API 要求输入表名、字段名和值。然后它以这种方式相当简单地将其插入:

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

我无法将 = 符号更改为 != 或其他任何内容,只能更改那些变量。我知道这听起来很糟糕,但我无法在不经历很多麻烦的情况下更改 API,而这就是我必须使用的全部内容。

此表中有多个列,所有列都是数字、所有字符串,并且设置为非空。是否有一个值我可以传递这个 API 函数来返回表中的所有内容?也许是一个常量或特殊值,表示它是一个数字,它不是一个数字,它是一个字符串,*,它不是 null 等等?有任何想法吗?

4

4 回答 4

5

不,如果 API 构造正确,这是不可能的。

然而,如果这是一些本土的东西,它可能不是。您可以尝试输入YourTable]--这样的值,TABLE_NAME_VAR以便在插入查询时它最终为

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

如果]被拒绝或正确转义(通过加倍),这将不起作用。

于 2013-08-18T09:50:38.447 回答
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]='+@a)
exec(@b)
于 2013-08-18T09:35:10.120 回答
2

如果您的 API 允许列名而不是常量,

select * from [TABLE_NAME_VAR] where [FIELD_NAME_VAR] = [FIELD_NAME_VAR] ;
于 2013-08-18T16:23:12.583 回答
2

您可以尝试传递此 VALUE_VAR

1'' or ''''=''

如果它按原样使用并作为动态 SQL 执行,它应该会导致

SELECT * FROM tab WHERE fieldname = '1' or ''=''
于 2013-08-19T21:36:04.430 回答