如何使INSERT上的SQL注入在SQLite上工作

2024-03-29 12:34:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何使SQL注入在SQLite中工作。我正在使用Python中的一个函数,该函数连接到数据库并插入字符串

我有“database.db”,它有两个表:“feedback”和“users”。
反馈表有一列:消息。
用户表有两列:用户名和密码

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()

我知道execute函数允许我对数据库进行单个查询,因此我不能使用“;”来 进行多个查询

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

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

但这给了我以下错误:

sqlite3.OperationalError: near "SELECT": syntax error

所以我尝试使用UNION命令:

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

这个函数可以工作,但是fetchall函数返回一个空列表


Tags: 函数字符串from数据库passwordconnselectusers
2条回答

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

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

大多数SQL注入都不会导致对攻击者有用的结果,只会导致语法错误

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

sqlite3.OperationalError: near "m": syntax error

从技术上讲,这是SQL注入插入到查询中的内容影响了SQL语句的语法。这就是全部。这并不一定会导致成功的“任务:不可能”渗透

Ethan Hunt perpetrating an SQL injection

我想不出一种方法来利用您展示的INSERT语句,使它除了产生错误之外,还能做一些聪明的事情

不能将插入更改为生成结果集的选择。即使尝试在第二个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,))

相关问题 更多 >