Sql server SQL注入-中T-SQL中的有效子查询

Sql server SQL注入-中T-SQL中的有效子查询,sql-server,sql-injection,Sql Server,Sql Injection,我正在尝试学习一些SQL注入,想问一下除了select之外的任何其他查询是否可以在SQLIN操作符中执行 运算符语法中的正常用法是 select * from tableX where ID IN (select userId from tableY where colX='Y') 我想通过querystring传入一个sql stmt来删除表中的所有用户 如果在IN运算符中执行此注入的sql,是否可以执行此操作 这就是我想要实现的目标 select * from tableX where I

我正在尝试学习一些SQL注入,想问一下除了select之外的任何其他查询是否可以在SQLIN操作符中执行

运算符语法中的正常用法是

select * from tableX where ID IN (select userId from tableY where colX='Y')
我想通过querystring传入一个sql stmt来删除表中的所有用户

如果在IN运算符中执行此注入的sql,是否可以执行此操作

这就是我想要实现的目标

select * from tableX where ID IN (delete tableY) 

我总是遇到奇怪的语法错误。可能这不符合sql规范。但是如果有人知道有效的子查询可以帮助我实现目标,请发布

编辑:应该已经添加了这个

该系统已经有了一些防御措施

  • 此值作为参数化值传递给SP
  • 但总的来说,有一个弱点

  • 我所看到的唯一弱点是,我试图利用它在SP中使用传入的值构造sql字符串

    在('+@htmlEncodedParametrizedParam+'中设置@where=@where+'ID)

  • 因此,我只需输入一个纯sql字符串(no;or),它可以在in操作符中使用

    编辑2:加密以验证@Dan的答案。没用

    Create procedure HackTest 
      @qsVal nvarchar(200) = ''
    As
    Begin 
        declare @sql as nvarchar(1000)
        set @sql = 'select * from AdventureWorks2008.Person.Person' + 'where PersontType IN (' + @qsVal + ')'
        exec sp_executesql @sql
    end
    
    下面是请求以及MS Sql server profiler为这些请求捕获的内容

    --http://localhost:11727/SampleSite/Default.aspx?a=NULL);delete%20tableY;--
    exec hackTest @qsVal='NULL);delete tableY;--'
    
    --http://localhost:11727/SampleSite/Default.aspx?a=NULL);update%20tableX%20set%20ID=100;--
    exec hackTest @qsVal='NULL);update tableX set ID=100;--'
    

    您可以模拟多个查询,例如,这是您的查询,稍后将由您的程序替换参数:

    SELECT * FROM tableX WHERE ID IN (<somestring>)
    
    您将得到如下可执行查询:

    SELECT * FROM tableX WHERE ID IN (1); DROP TABLE tableY;--)
    

    如果应用程序使用字符串连接构造SQL语句,如:

    selectQuery = "select * from tableX where ID IN (" + queryString + ")";
    
    可以通过添加“NULL);”然后添加要注入的SQL语句,然后添加注释标记来利用此特定的SQL注入漏洞。查询字符串值示例:

    NULL);delete tableY;--
    NULL);update tableX set ID=100;--
    
    当然,决不能通过查询字符串传递SQL语句。针对SQL注入的最佳防御措施是简单地使用参数化查询,而不是使用来自不受信任源的字符串连接构建语句。

    否,只允许一个或一个表达式列表:

    因此,这里不能使用
    DELETE
    UPDATE
    语句,只能使用
    SELECT
    语句

    但是,由于SQL Server支持,您只需在
    SELECT
    语句后附加自己的语句:

    SELECT … ; DELETE …
    

    通常,人们试图了解如何防止SQL注入攻击。有趣的是,您正在询问如何实现一个……如果您的问题是由于不确定您现有的外部查询是否有遭受此类攻击的危险而引起的,我建议您投入精力使其安全,以防注射。然而,如果你真的计划了一次攻击,我还不相信你值得帮助……不管是哪种情况,这都是一个有趣的谜题。@stakx-我自己在破解:)。边缘案例。好的,只要你是为了好玩才这么做。。。否则你就是在浪费时间。毕竟,有相当简单的方法可以防止SQL注入攻击?为什么会显示html编码?请尝试打开sp:stmtcompleted事件以查看sp正在执行的操作。它是抛出错误还是什么都不做?
    selectQuery = "select * from tableX where ID IN (" + queryString + ")";
    
    NULL);delete tableY;--
    NULL);update tableX set ID=100;--
    
    test_expression [ NOT ] IN 
        ( subquery | expression [ ,...n ]
        ) 
    
    SELECT … ; DELETE …