【问题标题】:How to make the SQL Injection on INSERT work on SQLite如何使 INSERT 上的 SQL 注入在 SQLite 上工作
【发布时间】:2020-11-19 15:58:13
【问题描述】:

我不知道如何使这种 SQL 注入在 SQLite 中工作。我在 Python 中使用一个函数来连接数据库并插入一个字符串。

我的“database.db”有两个表:“反馈”和“用户”。
反馈表有 1 列:消息。
users 表有 2 列:用户名和密码。

def send_feedback(feedback):
    conn = sqlite3.connect("database.db")
    curs = conn.cursor()
    curs.execute("INSERT INTO feedback VALUES ('%s')" % (feedback))
    print(curs.fetchall())
    conn.close()

我知道执行函数允许我对数据库进行单个查询,所以我不能使用“;”至 进行多个查询。

我尝试过的是让字符串看起来像这样:

a') SELECT password FROM users --
feedback = "INSERT INTO feedback VALUES ('a') SELECT password FROM users --')"

但这给了我以下错误:

sqlite3.OperationalError:靠近“SELECT”:语法错误

所以我尝试使用 UNION 命令:

a') UNION SELECT password FROM users --  
feedback = "INSERT INTO feedback VALUES ('a') UNION SELECT password FROM users --')"

这个可行,但 fetchall 函数返回一个空列表。

【问题讨论】:

    标签: python sqlite sql-insert sql-injection


    【解决方案1】:

    大多数 SQL 注入对犯罪者没有任何用处,只是语法错误。

    例如,将字符串“我不满意”传递给这个反馈函数,额外的 ' 字符会导致引号不平衡,这会导致错误,导致INSERT 失败。

    sqlite3.OperationalError: near "m": 语法错误

    这在技术上是 SQL 注入。 插入到查询中的内容影响了 SQL 语句的语法。就这样。它并不一定会导致成功的“不可能的任务”类型的渗透。

    除了导致错误之外,我想不出一种方法来利用您展示的 INSERT 语句让它做一些聪明的事情。

    您不能将 INSERT 更改为生成结果集的 SELECT。即使您尝试在第二个 SQL 查询后注入分号,您也只会得到 sqlite3.Warning: You can only execute one statement at a time

    您在上面的第一次尝试导致语法错误,因为您将 VALUES 子句和 SELECT 作为要插入的数据的源。您可以在 SQL 语法中使用其中之一,但不能同时使用两者。见https://www.sqlite.org/lang_insert.html

    您可能已经知道如何使代码安全,因此不安全的内容甚至不会导致语法错误。但我会为其他读者提供它:

    curs.execute("INSERT INTO feedback VALUES (?)", (feedback,))
    

    【讨论】:

    • 好的,所以我花了一些时间来解决这个问题,并且有一种方法可以让它发挥作用。您可以在以下查询中询问 sqlite:“SELECT CASE WHEN (SELECT SUBSTRING(password, 1, 1)) = 'a' THEN 1 END”。您可以编写一个简单的 python 脚本来更改 1 内部子字符串和 'a' 字符。通过这种方式,您几乎可以暴力破解列的输出。
    【解决方案2】:

    你可以这样做,例如获取表名

    a' || (SELECT tbl_name FROM sqlite_master  WHERE type='table' and tbl_name NOT like 'sqlite_%'))-- -
    

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 2019-01-20
      • 2012-08-19
      • 2011-07-26
      • 2014-02-17
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多