如何创建一个表(或其他对象),该表始终返回传递给其WHERE子句的值,如镜像

时间:2018-11-13 09:23:42

标签: sql-server sql-function

有一个旧版应用程序,该应用程序使用表将作业名称转换为文件名。该旧版应用程序按以下方式查询它:

SELECT filename FROM aJobTable WHERE jobname = 'myJobName'

但是实际上,这些作业名称始终与文件名匹配(例如,“ myJobName.job”既是作业名称又是文件名),这使得此表显得不必要。但不幸的是,我们无法更改该程序的代码,该程序只需要从表中选择它即可。

实际上有点烦人。因为我们确实需要使该数据库保持同步。如果表中没有作业名称,则无法使用它。因此,作为唯一的出路,现在我们有一些 vbscript来同步该表,为每个可能的文件名添加记录。结果,该表只有2列具有相同的值。 -我们要摆脱这一点。

因此,我们一直在梦见某些黑客,可以使用作业名查询数据,但是总是总是再次返回作业名,例如复制/镜像查询。然后,我们实际上不必完全填充表格。

“漏洞利用”

可以在此旧版应用程序中配置以下 。我的直觉是这些可能会为一些技巧/黑客打开大门。

  • 使用MS Access或SQL Server(我们更喜欢sql server)
  • 表格名称(例如aJobTable
  • 文件名列的名称(例如filename
  • 职位名称列的名称(例如jobname

这是我想出的:

如果我创建一个table-valued function mirror(a),那么我将很接近我想要的东西。然后我可以像这样使用它

SELECT filename FROM mirror('MyJobName.job')

但这还不够好,如果我可以强迫它像

SELECT filename FROM mirror WHERE param1 = 'MyJobName.job'

不幸的是,我认为不可能调用这样的函数。

所以,我想知道是否其他人知道如何使其工作。

所以我的问题是:“如何创建一个表(或其他对象),该表始终返回传递给WHERE子句的值(如镜像)。”

1 个答案:

答案 0 :(得分:1)

如果不知道应用程序使用的代码,很难回答,但是如果我们假设它只接受字符串并将它们连接起来而没有任何测试,那么我将假定这样的代码:(翻译为c#)

var sql = "SELECT "+ field +" FROM "+ table +" WHERE "+ conditionColumn +" = '"+ searchValue +"'";

由于这是SQL注入的门户,并且考虑到SQL Server允许您创建别名的两种方式-value as aliasalias = value, 您可以利用它并尝试生成这样的SQL语句:

SELECT field /* FROM table WHERE conditionColumn */ = 'searchValue' 

因此字段应为"field /* "
并且conditionColumn应该为"conditionColumn */"

表名无关紧要,您可以为其保留一个空字符串。