Microsoft Access SQL注入

问题描述 投票:0回答:5

我需要在我们被分配维护的非IT应用程序中修复一些安全问题。它位于Microsoft Access前端(SQL Server后端)。

有谁知道SQL注入是否可以通过Microsoft Access控件的RecordSource或RowSource属性完成?例如,如果我将列表框的recordsource设置为

Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Me.txtSomeTextBox & '''.

我不确定微软是否内置了这些属性的预防,所以我想知道我是否应该通过清理功能运行Me.txtSomeTextBox。

这当然是一个快速修复...应用程序将在今年晚些时候重新设计并从Access(yay!)迁移出来。

先谢谢你们!

sql vba ms-access sql-injection ms-access-2010
5个回答
0
投票

如果你正在进行字符串连接,那么你很容易受到攻击。


2
投票

可以使用VBA消除WHERE条件中字段名称的明显使用。

Sub btnLogin_OnClick()

If instr(0, me.txtBox, someFieldName) > 0 Then
        Msgbox("Foo Bar!")
Else
   Login
End If

End Sub

1
投票

在你的情况下,注入不能使它到SQL服务器。通过链接表访问本地查询是有限的一个SQL语句。因此,尽管可以“注入”Access的“小”,但是sql字符串不能作为多个sql语句到达SQL服务器,也不能使用给定的示例运行服务器端SQL。

所以“内置预防”是这样的SQL仅限于一个字符串。

因为结果字符串不能是多个sql语句,并且因为文本框结果是“引用”,所以你只能提供一个字符串表达式作为条件,并且你的例子不可能注入sql。

如果有人可以根据文本框的示例VBA sql + concat发布一个有效的注入示例,那么我全都耳朵。

因此,虽然在Access中可能会出现“一些”注入的情况,但您所拥有的示例肯定不是我所知道的这种情况。

知识渊博的用户可能会在该表达式中运行VBA()函数,但他们必须知道实际VBA函数的名称。即使在这种情况下,也不会执行一些你不想要的SQL。

我想可以查看删除记录的任何sql字符串,并且可以查看用户提供的值/表达式,但是您给出的示例不是典型的SQL注入风险。


0
投票

回答你原来的问题:这取决于控制。列表框和组合框可以将选择查询作为其记录源。不是动作查询。

文本框控件只能绑定到表字段。

这些控件不可供任何最终用户使用,以便在编译为.accde文件类型时可以重新定义记录源。


0
投票
Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Me.txtSomeTextBox & '''

你可以做一个包装器,只是为了避免破坏组合的SQL查询,例如

Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Replace(Me.txtSomeTextBox,"'","''") & '''

在这种情况下,您添加配对的'符号(' - >''),查询将不会被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.