Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使INSERT上的SQL注入在SQLite上工作_Python_Sqlite_Sql Insert_Sql Injection - Fatal编程技术网

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

Python 如何使INSERT上的SQL注入在SQLite上工作,python,sqlite,sql-insert,sql-injection,Python,Sqlite,Sql Insert,Sql Injection,我不知道如何使SQL注入在SQLite中工作。我正在使用Python中的一个函数,该函数连接到数据库并插入字符串 我有database.db,它有两个表:feedback和users。 反馈表有一列:message。 用户表有两列:用户名和密码 def send_feedback(feedback): conn = sqlite3.connect("database.db") curs = conn.cursor() curs.execute(&quo

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

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

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.error:近选择:语法错误

所以我尝试使用UNION命令:

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

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

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

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

sqlite3.error:接近m:语法错误

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

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

不能将插入更改为生成结果集的选择。即使您尝试在第二个SQL查询之后插入分号,您也会得到

上面的第一次尝试导致语法错误,因为要插入的数据源既有VALUES子句,也有SELECT。在SQL语法中,可以使用其中一种,但不能同时使用两种。看

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

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

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

一个“| |从sqlite_master中选择tbl_名称,其中type='table'和tbl_名称与'sqlite_u%'不同--
好的,我花了一些时间在这上面,有一种方法可以让它工作。您可以在如下查询中查询sqlite:SELECT CASE WHEN SELECT SUBSTRINGpassword,1,1='a',然后1 END。您可以编写一个简单的python脚本来更改子字符串中的1和“a”字符。通过这种方式,您几乎可以强制执行列的输出。