查询已参数化,但'['未给出搜索结果。 VB.NET Framework 4. ESQL实体

时间:2012-03-16 14:33:31

标签: entity-framework sql-injection vb.net-2010

以下是我数据库中的公司名称。我正在尝试生成对SQL注入万无一失的快速字符串查询。

我测试了针对SQL Injection的参数化查询的安全容限级别,因为我听说它不是100%的传言。

===== userinput纯字符串但带有SQL注入的恶意内容=========

userinput = "Tubo'; UPDATE STOCK_TYPE SET Description='SQL Injection'" & 
            "WHERE STock_Type_ID=1; --'"

userinput = "'Some Name''; GRANT CONTROL TO [Malicious User]; PRINT ''Game over!" &
            "This system is no longer yours!''" & 
            "-- Malicious User now can control the database!!!'"

userinput = "!!!@@@###$$$%%%^^^&&&***((()))///```~~~___---+++===:::;;;"""'''|||
             \\\}}}>>><<<{{{}}}]]]...,,,[[[]]]///"

=====使用SQL Injected userinput搜索公司名称==========================

Dim SQL = "select p.Name from EntContext.COMPANIes as p Where p.Name like @CompanyName"

ObjectParamters.Add(New ObjectParameter("@CompanyName", userinput))

Dim databaseObjectQuery As ObjectQuery(Of DbDataRecord) = 
     New ObjectQuery(Of DbDataRecord)(SQL, EntContext)

databaseObjectQuery.Parameters.Add(parameter)

=============================================== =====================

COMPANIes.name数据库包含这些字符串以帮助我进行测试。 通过成功搜索用户输入,我认为我的代码对攻击更强。

但是当我使用确切的用户输入字符串搜索COMPANIes.name时,只有第一个userinput产生结果。

我将罪魁祸首缩小为'['它不会通过LINQPAD产生第二和第三个用户输入的结果

select p.company_id , p.Name
from EntContext.COMPANIes as p
Where  p.Name like '%[%'

没有结果。这样做

select p.company_id , p.Name
from EntContext.COMPANIes as p
Where  p.Name like '%/[%' escape '/'

通过匹配公司名称中的'['来生成针对第二和第三个用户输入的结果。

================尝试在VB.NET中以编程方式解决===============

FilterSQL = " AND COMPANies.Name like @CompanyName escape " + Chr(255)
objectParameters.Add(New ObjectParameter("CompanyName", "%" & Chr(255) &
searchResultParam.ParamValue.Value & "%"))


 The simple identifier 'ÿ' must contain basic Latin characters only. 
 To use UNICODE characters, use an escaped identifier. Near line 1, column 320.

=============================================== ==============================

  1. 参数化查询是否100%万无一失甚至用户输入都是这样编码的?

    ObjectParamters.Add(New ObjectParameter(“@ CompanyName”,userinput))

  2. 我的假设超过了第二个和第三个用户输入正确的转义此字符'['?

  3. 在LINQ的参数化查询中,如何搜索这个确切的存储值?

    COMPANIes.Name =“!@#$%^&amp; *()/`~_- + = :;”'|}&gt;&lt; {}]。,[] /“

    < / LI>

1 个答案:

答案 0 :(得分:0)

此代码的突破

FilterSQL = " AND COMPANies.Name like @CompanyName escape '['"
Dim escCrit As String = "%" & ParamValue.Value.Replace("[", "[[") & "%"
objectParameters.Add(New ObjectParameter("CompanyName", escCrit ))

这是实际和字面ID&amp;存储在我的COMPANies.Name列中的名称。

  1. 吐蕃'; UPDATE STOCK_TYPE SET描述='SQL注入'WHERE STOCK_Type_ID = 1; - “

  2. '某些名字'';对[恶意用户]的授予控制权; PRINT''游戏结束!这个系统不再是你的!'' - 恶意用户现在可以控制数据库!!!'

  3. !!! @@@ ### $$$ %%% ^^^&安培;&安培;&安培; * ((()))///``` ~~~ _ --- +++ === ::: ;;; “”“ '''||| \}}}&GT;&GT;&GT;&LT;&LT;&LT ; {{{}}}]]] ... ,,, [[[]]] /// ??? '''

  4. ?!
  5. @#$%^&安培; *()/`〜_- + = :;“'|}&GT;。&LT; {}],[] /ȸ

  6. =============================================== =============

    在文本框中输入userinput,然后单击“搜索”。测试结果:

    userinput = Tubo'; UPDATE STOCK_TYPE SET Description='SQL Injection' WHERE STock_Type_ID=1; --'
    

    找到公司ID 1

    userinput = 'Some Name''; GRANT CONTROL TO [Malicious User]; PRINT ''Game over! This system is no longer yours!'' -- Malicious User now can control the database!!!' 
    

    找到公司ID 2

    userinput = !!!@@@###$$$%%%^^^&&&***((()))///```~~~___---+++===:::;;;"""'''||| 
             \\\}}}>>><<<{{{}}}]]]...,,,[[[]]]/// 
    

    找到公司ID 3

    userinput = ?!@#$%^&*()/`~_-+=:;"'|}><{}].,[]/ȸ
    

    找到公司ID

    userinput = [
    

    公司ID 2,3和5发现

    userinput = []
    

    找到公司ID 3和5

    userinput = [[[
    

    找到公司ID 3

    这回答了我的第三个问题。我没有必要过滤任何输入,也没有必要限制文本框搜索条件。此模式甚至可以容纳特殊字符,尤其适用于在数据库中存储用户的公共注释。他们可以在文本块中输入任何内容。我不知道为什么'['需要特定代码作为逃避。我认为这是一个错误,实体框架团队忘了逃避'['。然而,它们确实逃脱了我迄今测试过的所有其他内容。注意字符ȸ拉丁文小写字母Db有向图是有意的。

    我想知道发生了什么魔法。我认为SQL是与参数分开发送的。当SQL永远不会满足参数时,我们永远无法获得SQL注入。不可能,因为SQL注入的形式依赖于脏SQL。但SQL从未遇到过注入。我对特殊字符范围的测试用例表明了这一点。

    我认为实现隐式在LINQ的后端使用sp_executesql。在后端,SQL执行执行计划,而参数则匹配为字符串文字。我必须要小心,我的SQL永远不会“满足”来自前端或数据库后端的用户输入。