【问题标题】:SQL Injection Based on ""=""基于""=""的SQL注入
【发布时间】:2015-09-03 17:25:11
【问题描述】:

我是 SQL 新手,所以请多多包涵(尽管我承认这可能只是一个我应该已经掌握的编程概念)...

有关可能的 SQL 注入向量的阅读表明,一种潜在的攻击模式是将用户名或密码字段设置为 "or ""="

一个示例用例是:

uName = getRequestString("UserName");
uPass = getRequestString("UserPass");

sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"

导致下面这行 SQL 代码:

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

他们给出的理由是WHERE ""="" 总是评估为真。为什么会这样?我了解or 1 = 1 如何评估为真,但这段代码如何评估为真?

非常感谢您的帮助!

编辑: 我认为我最初的困惑源于将双引号读取为转义符,而不是空字符串。这应该很明显,所以谢谢!

【问题讨论】:

  • 我假设您的回答是 ' 而不是 "。我只知道 MSSQL 和双引号在那里不起作用……也许在其他版本中有所不同?

标签: sql security sql-injection


【解决方案1】:

忽略您不需要这种特殊的边缘情况来注入该查询的事实......

他们给出的理由是 WHERE ''='' 总是评估为真。为什么会这样?

'' 只是一个空字符串常量。所以,从逻辑上讲,'' 等于 ''。这就像说 1=1,因为常数总是等于它自己。

写出来:

SELECT 
    * 
FROM 
    Users 
WHERE 
    (Name = '' OR '' = '') 
    AND 
    (Pass = '' OR '' = '')

由于它是一个 OR 语句,因此每个条件中只有一个条件必须为真,但在两个子句中都必须为真。

【讨论】:

    【解决方案2】:

    如果包含在 SQL 语句中,则必须始终检查变量,否则会导致崩溃:

    if(!string.IsNullOrEmpty(uName) && !string.IsNullOrEmpty(uPass))
    { 
       // SQL STATMENT 
    }
    else 
    { 
       // ERROR ONE IS EMPTY 
    }
    

    最好将这些变量绑定到参数以避免注入,请参阅我的回答,了解如何做到这一点:

    null value exception when entering into database

    【讨论】:

      猜你喜欢
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多